【发布时间】:2016-05-17 19:46:54
【问题描述】:
当我用gdb 分析/usr/bin/diff 时,我看到__gmon_start__ 出于某种原因在_start 之前被调用。到目前为止,我发现的每个文档都声称_start 是程序的入口点;而ELF头中的入口点字段也指向_start的地址。
为什么diff 不以_start 开始执行;这些信息保存在哪里?
【问题讨论】:
-
_start是 default 入口点。ld -e foobar -o a.out in.o将在in.o中查找符号foobar,并将 ELF 入口点地址设置为该符号最终在最终目标文件中的地址。请注意,ELF 入口点是最终文件中的地址,而不是名称。看看readelf -a /usr/bin/diff。 IDK 你的diff是用__gmon_start作为包含入口点的符号名称构建的。我不是这方面的专家,但我认为我也是(Ubuntu 15.10)。 -
ELF头中指定的入口点地址属于
_start,但在它之前调用了__gmon_start__。 -
您的
diff二进制文件来自哪里(发行版/版本/架构)?我的/usr/bin/diff在nm -a或nm -aD输出中没有_start符号,因为它已被剥离。也许您应该编辑您采取的步骤以获取您得出结论的信息。这可能有助于某人解释事情,尤其是。如果您误解了某些内容。 -
二进制属于 Ubuntu 14.04 32 位发行版,在 0x80497d0 处肯定有
_start符号。当我使用gdb调试二进制文件时,我在main、_start、__gmon_start__、__libc_start_main等和run上设置了断点。第一个遇到的断点属于__gmon_start__。然后是_start、__libc_start_main,然后是__gmon_start__,然后是main。