РЕШЕННЫЙ ВОПРОС Должен сделать основной символ глобальным, чтобы линкер мог найти его в объектном файле при связывании. Исправленный код.как позвонить код, написанный на 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-ассемблер, но никаких решений не работает).
Сделать ярлык 'main' глобальным. Для GNU as, это '.global main', я не знаю о ярости. – Downvoter
Работы, спасибо. @Downvoter, напишите как ответ, чтобы я мог принять его. –