汇编程序gcc:对puts的未定义引用

时间:2016-01-18 06:04:33

标签: gcc assembly

我正在学习汇编语言,我试图用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

2 个答案:

答案 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位分区的辅助函数进行函数调用。