2016-09-11 2 views
5

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).

+2

Rend l'étiquette 'main' globale. Pour GNU comme, c'est '.global main', je ne connais pas yasm. – Downvoter

+0

Fonctionne, merci. @Downvoter, écrivez comme une réponse, donc je pourrais l'accepter. –

Répondre

3

Vous devez d'abord mettre le libellé main en premier, car dans le cas contraire, le fichier objet ne contiendra pas le symbole et l'éditeur de liens ne le reconnaîtra pas.