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”的符号,而它不知道哪个是入口点!