如何正确链接* .asm文件?

时间:2014-05-25 06:25:02

标签: c linker printf nasm

我已经开始学习汇编语言了,目前正在编写一个简单的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

我应该对上述行做出哪些更改?

1 个答案:

答案 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