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