2016-09-11 13 views
5

ROZWIĄZYWANIE PYTAŃ Powinien być głównym symbolem globalnym, aby linker mógł znaleźć go w pliku obiektowym podczas łączenia. Poprawiony kod.jak wywołać kod napisany w C od złożenia?

Podczas zadania, próbował nazwać prostą funkcję C z zespołu (yasm assembler):

Wrote C funkcję:

#include <stdio.h> 

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

napisał wywołanie kodu montaż:

 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 

skompilowany montaż:

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

skompilowany kod C:

gcc -o main_c.o -c main_c.c 

próbował połączyć oba pliki obiektu do pojedynczego pliku wykonywalnego pliku binarnego:

gcc -o main main_c.o main.o 

otrzymała:

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

Czy macie jakieś sugestie, jak poprawić poleceń/kod do budowania pliku wykonywalnego? Tak, czytałem podobne pytania (używając asemblera NASM, ale żadne rozwiązania nie działają).

+2

Ustaw globalną etykietę "main". Dla GNU jako, jest to '.global main', nie wiem o yasmie. – Downvoter

+0

Działa, dziękuję. @Dvvoter, napisz jako odpowiedź, abym mógł to zaakceptować. –

Odpowiedz

3

Najpierw należy ustawić globalną etykietę main, ponieważ w przeciwnym razie plik obiektowy nie będzie zawierał symbolu, a linker go nie rozpozna.

Powiązane problemy