GNU 汇编程序是否添加了自己的入口点?
Does GNU Assembler add its own entry point?
假设我有以下汇编代码:
.section .text
.globl _start
_start:
如果我使用以下命令创建了一个可执行文件:
as 1.s -o 1.o
ld 1.o -o 1
GNU 汇编程序是否会将其自己的入口点添加到调用 _start
的我的可执行文件中,或者 _start
将成为实际的入口点?
查看此question了解更多详情。
您可以这样查看:
objdump -x 1 # n.b. 1 is the name of your program
除其他外,这将打印:
start address 0x000000...
获取它给你的地址,并在输出的其他地方搜索它。我想您会发现它与 .text
段的开头以及 _start
符号相匹配。如果是这样,那么 _start
确实是 ELF 入口点。
包含另一个问题中提到的启动代码的文件crt0.o(或crt1.o或无论如何调用此文件)也是用汇编程序编写的。
因此,链接器 ("ld") 所做的是搜索所有目标文件(实际上都是使用 "as" 创建的)以查找名为“_start”的符号,该符号成为入口点。
您当然可以在使用 "ld" 时将 crt0.o 添加到您的汇编程序中。但是,在这种情况下,您不得在汇编文件中将符号命名为“_start”,而是命名为 "main":
.globl main
.text
main:
...
否则"ld"会打印错误信息,因为它会找到两个名为“_start”的符号,而它不知道哪个是入口点!
假设我有以下汇编代码:
.section .text
.globl _start
_start:
如果我使用以下命令创建了一个可执行文件:
as 1.s -o 1.o
ld 1.o -o 1
GNU 汇编程序是否会将其自己的入口点添加到调用 _start
的我的可执行文件中,或者 _start
将成为实际的入口点?
查看此question了解更多详情。
您可以这样查看:
objdump -x 1 # n.b. 1 is the name of your program
除其他外,这将打印:
start address 0x000000...
获取它给你的地址,并在输出的其他地方搜索它。我想您会发现它与 .text
段的开头以及 _start
符号相匹配。如果是这样,那么 _start
确实是 ELF 入口点。
包含另一个问题中提到的启动代码的文件crt0.o(或crt1.o或无论如何调用此文件)也是用汇编程序编写的。
因此,链接器 ("ld") 所做的是搜索所有目标文件(实际上都是使用 "as" 创建的)以查找名为“_start”的符号,该符号成为入口点。
您当然可以在使用 "ld" 时将 crt0.o 添加到您的汇编程序中。但是,在这种情况下,您不得在汇编文件中将符号命名为“_start”,而是命名为 "main":
.globl main
.text
main:
...
否则"ld"会打印错误信息,因为它会找到两个名为“_start”的符号,而它不知道哪个是入口点!