我正在学习汇编语言,我试图用gcc编译我的程序,但它显示错误信息:
gcc -m32 -nostdlib -lc test.o -o test
test.o: In function `_start':
test.asm:(.text+0x6): undefined reference to `puts'
collect2: error: ld returned 1 exit status
以下是代码:
BITS 32
EXTERN puts
SECTION .data
chaine db "Hello world !", 0
SECTION .text
GLOBAL _start
_start:
push dword chaine
call puts
add esp, 4
mov eax,1
int 0x80
答案 0 :(得分:3)
您的原始程序将有效:
BITS 32
EXTERN puts
SECTION .data
chaine db "Hello world !", 0
SECTION .text
GLOBAL _start
_start:
push dword chaine
call puts
add esp, 4
mov eax,1
int 0x80
但是你需要在gcc -m32 -nostdlib test.o -o test -lc
之后用nasm -felf test.asm
(Yes -lc需要在最后)进行编译。
答案 1 :(得分:1)
-lc
之前 test.o
是问题所在。仅在链接器查看puts
之后才会看到对未定义libc.so
的引用。
做一些你可能想要达到的目标的更好的方法是:gcc -nostartfiles
。在Linux上,这对我来说很有用。使用-nostdlib foo.o -lc
对我有用,但会跳过libgcc
。如果您没有链接gcc生成的任何代码,这可能无关紧要。如果是的话,可能会对32位机器上的64位分区的辅助函数进行函数调用。