RESOLU QUESTION Devrait rendre le symbole principal global, afin que l'éditeur de liens puisse le trouver dans le fichier objet lors de la liaison. Code corrigécomment appeler le code écrit en C à partir de l'assemblage?
Quand vous faites tâche, a essayé d'appeler la fonction C simple de l'ensemble (assembleur yasm):
fonction Wrote C:
#include <stdio.h>
void
func_in_c(char *s)
{
printf("%s", s);
}
écrit appelant le code assembleur:
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
compilé assemblage:
yasm -f elf64 -m amd64 -g dwarf2 main.asm
code compilé c:
gcc -o main_c.o -c main_c.c
a essayé de lier les deux fichiers objet dans un fichier binaire exécutable unique:
gcc -o main main_c.o main.o
obtenu:
...
In function _start:
(.text+0x20): undefined reference to main
...
Avez-vous des suggestions pour corriger les commandes/code pour construire l'exécutable? Oui, j'ai lu des questions similaires (en utilisant NASM assembleur, aucune solution ne fonctionne, cependant).
Rend l'étiquette 'main' globale. Pour GNU comme, c'est '.global main', je ne connais pas yasm. – Downvoter
Fonctionne, merci. @Downvoter, écrivez comme une réponse, donc je pourrais l'accepter. –