汇编多重定义

时间:2015-09-30 00:22:38

标签: assembly

提供代码

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一次,怎么出来说多重定义? 感谢

1 个答案:

答案 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位兼容代码。