我需要从可执行文件中获取段的开始和结束,例如使用objdump
命令(text,data,bss)。我需要获取有关我调用的文件的信息(程序应该检索有关自身的信息)。我怎样才能做到这一点。
此外,我试图获得堆栈段的开始和结束地址。我试图获取第一个和最后一个局部变量的地址,但这只会显示完整堆栈的一部分。我怎样才能获得完整堆栈的地址?
如果有任何帮助,我将不胜感激。 Thx提前。
答案 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 frame
。 frame 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,因此堆栈地址会因一个进程而异,运行相同的程序。