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

时间:2015-01-12 05:36:22

标签: linux assembly x86 gas

说我有以下汇编代码:

.section .text

.globl _start
_start:

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

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

GNU汇编程序是否会将自己的入口点添加到我的可执行文件中,该可执行文件调用_start或将_start作为实际入口点?

有关详细信息,请参阅此question

2 个答案:

答案 0 :(得分:1)

包含其他问题中提到的启动代码的文件crt0.o(或crt1.o或者此文件被调用)也是用汇编语言编写的。

所以链接器(“ld”)所做的就是搜索所有目标文件(实际上都是使用“as”创建的),这个文件名为“_start”,它将成为入口点。

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

.globl main
.text
main:
    ...

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

答案 1 :(得分:0)

您可以这样检查:

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

除其他外,这将打印出来:

start address 0x000000...

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