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ą).
Ustaw globalną etykietę "main". Dla GNU jako, jest to '.global main', nie wiem o yasmie. – Downvoter
Działa, dziękuję. @Dvvoter, napisz jako odpowiedź, abym mógł to zaakceptować. –