我正在尝试在linux服务器上编译asm程序。我是编写asm程序的新手,但我按照学校的教程做了他们所说的一切,但没有成功。
这是我的hello.asm文件。
SECTION .data
msg: db "Hello World",10
len: equ $-msg
SECTION .text
global main
main:
mov edx,len
mov ecx,msg
mov ebx,1
mov eax,4
int 0x80
mov ebx,0
mov eax,1
int 0x80
我使用命令行nasm -f elf hello.asm
编译此文件,该文件完全正常并生成目标文件。问题是,当我尝试ld hello.o
时,它说它无法读取文件中的符号而文件格式错误。
任何人都可以帮助我并告诉我如何编译.asm文件以便它可以运行吗?
答案 0 :(得分:2)
由于32位和64位混合库,我今天遇到了类似的问题(这就是为什么我碰巧遇到了你的问题)。如果您尝试链接不同类型的库,ld
会抱怨。在64位系统上,ld
默认为64位。
要指定类型,您应该能够为32位或ld -m elf_i386
指定gcc -m32
。 (或者gcc -m32 -static -nostdlib
表示静态二进制文件。)
如果您的asm源代码可移植到64位,则可以使用nasm -f elf64
组装为64位。但是它可以在运行时汇编但是在截断指针时出错,或者系统调用返回错误而不是工作,因为the int 0x80
ABI is purely 32-bit。