GNU 汇编程序是否添加了自己的入口点



>假设我有以下程序集代码:

.section .text
.globl _start
_start:

如果我使用以下命令创建了可执行文件:

as 1.s -o 1.o
ld 1.o -o 1

GNU汇编程序会向调用_start的可执行文件添加自己的入口点,还是_start实际的入口点?

有关更多详细信息,请参阅此问题。

包含另一个问题中提到的启动代码的文件crt0.o(或crt1.o或无论如何调用此文件)也已用汇编程序编写。

因此,链接器("ld")所做的是搜索所有对象文件(实际上都是使用"as"创建的),以查找名为"_start"的符号,该符号成为入口点。

当然,当使用"ld"时,您可以自由地将crt0.o添加到汇编程序编写的程序中。但是,在这种情况下,您不得在汇编程序文件中将符号命名为"_start"而是"main":

.globl main
.text
main:
    ...
否则,"

ld"将打印错误消息,因为它会找到两个名为"_start"的符号,并且不知道哪个是入口点!

你可以这样检查:

objdump -x 1 # n.b. 1 is the name of your program

这将打印以下内容:

start address 0x000000...

获取它为您提供的地址,并在输出中的其他地方搜索它。 我想你会发现它与.text段的开头以及_start符号相匹配。 如果是这样,那么_start确实是ELF的入口点。