提供代码
section .data
msg db "Hello, world!",0xA
len equ $ - msg
section .text
;we must export the entry point to the ELF linker or
global _start
_start:
mov eax,4
mov ebx,1
mov ecx,msg
mov edx,len
int 0x80
mov eax,1
xor ebx,ebx
int 0x80
当尝试运行它时,它会显示命令
linux1[8]% nasm -f elf -l hello.lst hello.asm
linux1[9]% ls
hello.asm hello.lst hello.o
linux1[10]% gcc -o hello hello.o
hello.o: In function `_start':
hello.asm:(.text+0x0): multiple definition of `_start'
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crt1.o:(.text+0x0): first defined here
hello.o: could not read symbols: File in wrong format
collect2: ld returned 1 exit status
如何修复多重定义问题?我只定义了_start一次,怎么出来说多重定义? 感谢
答案 0 :(得分:7)
您正在使用gcc
进行链接,默认情况下会添加期望入口点main
且已包含调用_start
的{{1}}的C库。这就是你有多重定义的原因。
如果您不需要C库(并且在此代码中没有),但仍希望使用gcc进行链接,请尝试main
。
gcc -nostdlib -m32 -o hello hello.o
错误是由于尝试从32位目标文件生成64位可执行文件。添加wrong format
修复程序,以便获得32位可执行文件(因为您的代码是32位)。如果您打算创建64位程序,请对-m32
使用-f elf64
,当然还要编写64位兼容代码。