【问题标题】:__gmon_start is executed before _start__gmon_start 在 _start 之前执行
【发布时间】:2016-05-17 19:46:54
【问题描述】:

当我用gdb 分析/usr/bin/diff 时,我看到__gmon_start__ 出于某种原因在_start 之前被调用。到目前为止,我发现的每个文档都声称_start 是程序的入口点;而ELF头中的入口点字段也指向_start的地址。

为什么diff 不以_start 开始执行;这些信息保存在哪里?

【问题讨论】:

  • _startdefault 入口点。 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/diffnm -anm -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

标签: linux x86 elf


【解决方案1】:

到目前为止,我发现的每个文档都声称 _start 是程序的入口点

对于完全静态的可执行文件,这是真的。

对于动态链接的可执行文件,用户空间执行从加载器的_start 符号(ld.so)开始,通常在加载器调用@987654323 之前执行成千上万条指令和许多系统调用@在a.out中。

a.out 中到达_start 的过程中,可以调用主可执行文件中的函数(这就是您所观察到的)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-25
    • 2019-02-22
    • 2012-11-24
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多