【问题标题】: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 和 .bss 是 section,而不是 segments。文件中可能根本不存在节,但必须存在段(运行时只需要段)。
我该怎么做。
研究/usr/include/elf.h,网上有很多resources。每个ELF 文件都以Elf{32,64}_Ehdr 开头,其中包含.e_phoff 和.e_phnum。使用这些成员,您可以找到并解码段表。您可以使用.e_shoff 和.e_shnum 类似地查找节表(如果存在)。
我也尝试获取堆栈段的开始和结束地址
你不能:堆栈启动不包含在二进制文件中,而是由内核在进程启动时动态确定的。此外,栈的end是正在运行的程序的动态属性,取决于程序正在做什么,以及ulimit的设置。
【解决方案3】:
objdump -h executablename 应该使您能够获取部分详细信息,例如文本、数据、bss。如果你想要所有部分的内容,那么你必须使用-s 选项。如果您想要所有信息,那么您可能需要使用-x 选项(这将包含堆栈信息)。
堆栈帧检索取决于架构类型。获取当前堆栈帧信息的一个选项可以是通过 gdb 加载并执行 info frame 。 frame at 的地址应该是 BP(基指针),它应该是当前堆栈帧的起点。 SP 应包含堆栈帧的结束点。
locals at处的地址应包含局部变量的起始地址。
可以为内核启用的配置很少。启用 CONFIG_DEBUG_STACK_USAGE 是监控内核堆栈使用的一个选项。 CONFIG_DEBUG_STACKOVERFLOW 等选项可以启用跟踪堆栈。