2016-09-11 2 views
5

РЕШЕННЫЙ ВОПРОС Должен сделать основной символ глобальным, чтобы линкер мог найти его в объектном файле при связывании. Исправленный код.как позвонить код, написанный на C от сборки?

При выполнении задачи, пытался вызвать простую функцию C из сборки (Yasm ассемблер):

Написал функцию C:

#include <stdio.h> 

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

написал код вызова сборки:

 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 

скомпилирован комплект:

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

скомпилирован с код:

gcc -o main_c.o -c main_c.c 

пытался связать оба объектных файлов в один исполняемый двоичный файл:

gcc -o main main_c.o main.o 

получил:

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

У вас есть какие-либо предложения, как исправить команды/code для создания исполняемого файла? Да, я читал похожие вопросы (используя NASM-ассемблер, но никаких решений не работает).

+2

Сделать ярлык 'main' глобальным. Для GNU as, это '.global main', я не знаю о ярости. – Downvoter

+0

Работы, спасибо. @Downvoter, напишите как ответ, чтобы я мог принять его. –

ответ

3

Необходимо сначала сделать метку main глобальным, так как в противном случае объектный файл не будет содержать символ, и компоновщик не узнает его.

Смежные вопросы