【问题标题】:How to get segment addresses from executable file and find stack address如何从可执行文件中获取段地址并找到堆栈地址
【发布时间】:2014-12-29 08:39:03
【问题描述】:

我需要获取可以从可执行文件中获取的段的开始和结束,例如使用objdump 命令(文本、数据、bss)。我需要获取有关我从中调用的文件的信息(程序应检索有关自身的信息)。我怎样才能做到这一点。 我还尝试获取堆栈段的开始和结束地址。我试图获取第一个和最后一个局部变量的地址,但这只会显示完整堆栈的一部分。如何获取全栈地址?

如果有任何帮助,我将不胜感激。提前谢谢。

【问题讨论】:

  • 你为什么要问?干什么用的?

标签: linux stack elf segment


【解决方案1】:

我需要获取可以从可执行文件中获取的段的开始和结束,例如使用大小命令(文本、数据、bss)。

.text.data.bsssection,而不是 segments。文件中可能根本不存在节,但必须存在段(运行时只需要段)。

我该怎么做。

研究/usr/include/elf.h,网上有很多resources。每个ELF 文件都以Elf{32,64}_Ehdr 开头,其中包含.e_phoff.e_phnum。使用这些成员,您可以找到并解码段表。您可以使用.e_shoff.e_shnum 类似地查找节表(如果存在)。

我也尝试获取堆栈段的开始和结束地址

你不能:堆栈启动不包含在二进制文件中,而是由内核在进程启动时动态确定的。此外,栈的end是正在运行的程序的动态属性,取决于程序正在做什么,以及ulimit的设置。

【讨论】:

    【解决方案2】:

    如果您是从程序自身运行的角度提问,我会阅读/proc/self/maps 文件(或/proc/self/smaps)。见proc(5)。读取这些伪文件很快(不涉及磁盘 IO),但您需要按顺序读取它们(如使用 pipe(7)-s)并“快速”关闭它们(换句话说,不要重新读取它们而不重新-open(2)-ing 他们)。

    如果您希望某些ELF 可执行文件中包含静态信息(请参阅elf(5)),请使用readelf(1)objdump(1) 命令或一些ELF 读取库,例如libelf

    请注意,堆栈段的概念在最近的内核、libcs​​ 和多线程应用程序中变得模糊。另请参阅 GCC split stacks 能力。

    此外,大多数 Linux 系统都启用了ASLR,因此堆栈地址会因一个进程与另一个运行相同程序的进程而异。

    【讨论】:

      【解决方案3】:

      objdump -h executablename 应该使您能够获取部分详细信息,例如文本、数据、bss。如果你想要所有部分的内容,那么你必须使用-s 选项。如果您想要所有信息,那么您可能需要使用-x 选项(这将包含堆栈信息)。

      堆栈帧检索取决于架构类型。获取当前堆栈帧信息的一个选项可以是通过 gdb 加载并执行 info frameframe at 的地址应该是 BP(基指针),它应该是当前堆栈帧的起点。 SP 应包含堆栈帧的结束点。 locals at处的地址应包含局部变量的起始地址。

      可以为内核启用的配置很少。启用 CONFIG_DEBUG_STACK_USAGE 是监控内核堆栈使用的一个选项。 CONFIG_DEBUG_STACKOVERFLOW 等选项可以启用跟踪堆栈。

      【讨论】:

        猜你喜欢
        • 2018-09-17
        • 1970-01-01
        • 2017-04-05
        • 1970-01-01
        • 2010-12-23
        • 2023-03-20
        • 1970-01-01
        • 2021-05-20
        • 2014-02-03
        相关资源
        最近更新 更多