gpt4 book ai didi

assembly 多重定义

转载 作者:行者123 更新时间:2023-12-04 23:18:57 24 4
gpt4 key购买 nike

给代码

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,怎么出来的说是多重定义呢?
谢谢

最佳答案

您正在使用 gcc链接,默认情况下会添加需要入口点的 C 库 main并且已经包含一个 _start调用 main .这就是为什么你有多重定义。

如果您不需要 C 库(并且在此代码中不需要),但仍想使用 gcc 进行链接,请尝试 gcc -nostdlib -m32 -o hello hello.o .
wrong format错误是由于试图从 32 位目标文件生成 64 位可执行文件。添加 -m32修复该问题,以便您获得 32 位可执行文件(因为您的代码是 32 位)。如果您打算创建 64 位程序,请使用 -f elf64nasm当然,还要编写 64 位兼容代码。

关于 assembly 多重定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32855825/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com