如何从可执行文件中获取段地址并查找堆栈地址

时间:2014-11-02 16:25:12

标签: linux stack elf segment

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

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

3 个答案:

答案 0 :(得分:1)

  

我需要从可执行文件中获取段的开始和结束,例如使用size命令(text,data,bss)。

.text.data.bss部分,而非部分。文件 at all 中可能不存在节,但段必须是(在运行时只需要段)。

  

我该怎么办呢。

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

  

此外,我试图获取堆栈段的开始和结束地址

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

答案 1 :(得分:0)

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

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

可以为内核启用的配置很少。启用CONFIG_DEBUG_STACK_USAGE是监视内核堆栈使用情况的选项。诸如CONFIG_DEBUG_STACKOVERFLOW之类的选项可以启用跟踪堆栈。

答案 2 :(得分:0)

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

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

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

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