2016-09-11 43 views
5

SOLVED QUESTION Ana simgeyi global yapmalı, böylece linker bağlantı sırasında nesne dosyasında bulabilir. Düzeltilmiş kod. görevi yapıyorMontajda C ile yazılmış kodu nasıl çağırılır?

, (YASM montajcı) derlemesinden basit C işlevi çağırmak için çalıştı:

 segment .data 
str_t_c db "Wow", 0 

     segment .text 
     global main ; That is the solution - let linker find global symbol 
     extern printf 
     extern func_in_c 
main: 
     push rbp 
     mov rbp, rsp 
     lea rdi, [str_to_c] 
     call func_in_c 
     leave 
     ret 

derlenmiş:

#include <stdio.h> 

void 
func_in_c(char *s) 
{ 
     printf("%s", s); 
} 

montaj kodu çağırarak yazdı:

C fonksiyonunu yazdım montaj:

yasm -f elf64 -m amd64 -g dwarf2 main.asm 

derlenmiş c kodu:

gcc -o main main_c.o main.o 

var:

... 
In function _start: 
(.text+0x20): undefined reference to main 
... 

nasıl komutları düzeltmek için herhangi bir öneri var mı

gcc -o main_c.o -c main_c.c 

tek yürütülebilir ikili dosyaya hem nesne dosyalarını bağlamaya çalıştı/kod yürütülebilir oluşturmak için? Evet, benzer soruları okudum (NASM assembler kullanarak, çözüm çalışması yok).

+2

"main" etiketini global yapın. GNU için, '.global main', yasm hakkında bilmiyorum. – Downvoter

+0

Çalışmaları, teşekkür ederim. @Downvoter, bir cevap yaz, ben de kabul edebilirim. –

cevap

3

İlk olarak main etiketini ilk yapmanız gerekir, aksi halde nesne dosyası sembolü içermez ve bağlayıcı bunu tanımaz.