gpt4 book ai didi

linux - 汇编语言中的全局_start是什么?

转载 作者:行者123 更新时间:2023-12-02 16:35:17 26 4
gpt4 key购买 nike

这是我的汇编级代码...

section .text
global _start
_start: mov eax, 4
mov ebx, 1
mov ecx, mesg
mov edx, size
int 0x80
exit: mov eax, 1
int 0x80
section .data
mesg db 'KingKong',0xa
size equ $-mesg

输出:

root@bt:~/Arena# nasm -f elf a.asm -o a.o
root@bt:~/Arena# ld -o out a.o
root@bt:~/Arena# ./out
KingKong

我的问题是全局_start的用途是什么?我用 Mr.Google 碰了碰运气,发现它是用来告诉我的程序的起点的。为什么我们不能只用 _start 来告诉程序从哪里开始,就像下面给出的那样,它会产生一种屏幕上出现警告

section .text
_start: mov eax, 4
mov ebx, 1
mov ecx, mesg
mov edx, size
int 0x80
exit: mov eax, 1
int 0x80
section .data
mesg db 'KingKong',0xa
size equ $-mesg

root@bt:~/Arena# nasm -f elf a.asm
root@bt:~/Arena# ld -e _start -o out a.o
ld: warning: cannot find entry symbol _start; defaulting to 0000000008048080
root@bt:~/Arena# ld -o out a.o
ld: warning: cannot find entry symbol _start; defaulting to 0000000008048080

最佳答案

global 指令是 NASM 特定的。它用于将代码中的符号导出到它在生成的目标代码中指向的位置。在这里,您将 _start 符号标记为全局,以便将其名称添加到目标代码中 (a.o)。链接器 (ld) 可以读取目标代码中的该符号及其值,以便它知道在输出可执行文件中将何处标记为入口点。当您运行可执行文件时,它从代码中标记为 _start 的位置开始。

如果某个符号缺少 global 指令,则该符号将不会放置在目标代码的导出表中,因此链接器无法了解该符号。

如果您想使用 _start(默认值)以外的不同入口点名称,您可以为 ld 指定 -e 参数,如下所示:

ld -e my_entry_point -o output_filename object_filename

关于linux - 汇编语言中的全局_start是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17898989/

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