Я хотел бы позвонить в ASM (MASM) из C (GCC). Легко!
Теперь я хотел бы, чтобы моя функция asm могла использовать данные и вызывать такие функции, как printf ().
У меня две проблемы: секция данных и вызов printf ()
Я прочитал примеры в интернете, которые точно такие же, как у меня, но, похоже, не дают ошибок. Любая помощь приветствуется.
test.c:
#include <stdio.h>
int64_t asmfunc();
int main() {
asmfunc());
return 0;
}
test.asm
global asmfunc
section .data
msg: db "a very inspired message!",10,0
section .text
extern printf
asmfunc:
mov edi,msg
xor eax,eax
call printf
ret
сборник:
nasm -felf64 maxofthree.asm
gcc callmaxofthree.c maxofthree.o
результат:
/usr/bin/ld: maxofthree.o: relocation R_X86_64_32 against `.data' can not
be used when making a shared object; recompile with -fPIC
если я просто оставлю вызов printf, удалив раздел .data и "mov edi, msg", я получу
/usr/bin/ld: maxofthree.o: relocation R_X86_64_PC32 against symbol
`printf@@GLIBC_2.2.5' can not be used when making a shared object;
recompile with -fPIC
Спасибо товарищам по кодированию