我已经开始学习汇编语言了,目前正在编写一个简单的asm程序来在stdio.h中调用C中的printf函数。
我无法在组装后正确链接目标文件。我面临的问题是
对printf的未定义引用
在SO上浏览了类似问题的其他问题之后,我尝试了
nasm -f elf -l call.lst call.asm
gcc -o call call.o
执行此操作后,我收到错误:
输入文件call.o的i386架构与x86_64输出兼容。
我应该如何正确链接文件?目前,我正在做以下事情: -
nasm -f elf call.asm
ld -m elf_i386 -s -o call call.o
我应该对上述行做出哪些更改?
答案 0 :(得分:4)
如果您正在编写32位汇编代码,则需要告诉GCC:
$ gcc -m32 -o call call.o
或者,如果您正在编写64位程序集(使用[BITS 64]
),那么您将:
$ nasm -f elf64 -l call.lst call.asm
$ gcc -m64 -o call call.o
这对我有用:
<强> test.s 强>
[BITS 32]
extern printf
global main
main:
push message
call printf
add esp, 4
xor eax, eax
ret
message:
db "hello",0xA,0
<强>构建强>
nasm -f elf test.s
gcc -m32 -o calltest test.o
./calltest