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

C 如何正确链接*.asm文件?,c,linker,printf,nasm,C,Linker,Printf,Nasm,我已经开始学习汇编语言,目前正在制作一个简单的asm程序,在stdio.h中调用C中的printf函数。 组装后,我无法正确链接对象文件。我面临的问题是 对printf的未定义引用 在浏览了其他类似问题之后,我试着 nasm -f elf -l call.lst call.asm gcc -o call call.o 执行此操作后,我得到一个错误: 输入文件call.o的i386体系结构与x86_64输出兼容 我应该如何正确链接该文件?目前,我正在做以下工作:- nasm -f elf

我已经开始学习汇编语言,目前正在制作一个简单的asm程序,在stdio.h中调用C中的printf函数。
组装后,我无法正确链接对象文件。我面临的问题是

对printf的未定义引用

在浏览了其他类似问题之后,我试着

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

我应该对上述行进行哪些更改

如果您正在编写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

这对我来说很有用:

测试.s

[第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

如果您正在编写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

这对我来说很有用:

测试.s

[第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

停止直接使用
ld
。使用C编译器代替链接,它将知道如何引入C标准库。停止直接使用
ld
。用你的C编译器代替链接,它将知道如何引入C标准库。+1嗨,乔纳森,自从我手动滚动调用C的asm模块以来,它已经永远存在了。大多数供应商的C运行时库是否仍然在其函数上使用前导下划线?@WhozCraig问得好。我应该能在一分钟内告诉你-我现在正在尝试。我之所以问这个问题,是因为OP发布的undef ref消息中的id。感谢您的快速回复,但以这种方式组合它仍然会出现错误,如:-
找不到crt1.o:没有这样的文件或目录
找不到crti.o,没有这样的文件或目录
。还有,您是否安装了32位版本的
libc
?在基于yum的系统上:
sudo-yum-install-glibc.i686-glibc-devel.i686
+1嗨,Jonathan,自从我手动滚动调用C的asm模块以来,它已经永远存在了。大多数供应商的C-runtime库在其函数上是否仍然使用前导下划线?@WhozCraig问得好。我应该能在一分钟内告诉你-我现在正在尝试。我之所以问这个问题,是因为OP发布的undef ref消息中的id。感谢您的快速回复,但以这种方式组合它仍然会出现错误,如:-
找不到crt1.o:没有这样的文件或目录
找不到crti.o,没有这样的文件或目录
。还有,您是否安装了32位版本的
libc
?在基于yum的系统上:
sudo-yum安装glibc.i686 glibc-devel.i686