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

标签 linux stack elf segment

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

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

最佳答案

I need to get start and end of segments that I can get from executable file , for instance using size command (text,data,bss).

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

How can I do this.

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

Also I have tried to get start and end addresses of stack segment

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

关于linux - 如何从可执行文件中获取段地址并找到堆栈地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26701556/

相关文章:

java - 如何让Jenkins查找作业中指定的shell脚本

java - 从工作站中删除 Eclipse。我如何告诉 SVN 忽略文件并填充版本标签

c++ - C++ 在生成的 ELF 文件中的什么地方保存它的类变量?

linker - --unresolved-symbols=ignore-in-shared-libs 和 --allow-shlib-undefined 标志有什么区别

c - 如何从 ELF 和 PE 文件中找到所有 "user defined functions"?

linux - 获取使用 Net::SSH::Expect 的 exec 执行的命令的退出状态

linux - 在 Linux shell 中,所有在 shell 脚本中运行的命令是否也能在命令提示符下运行?

assembly - 为什么我们必须清理堆栈

java - 创建一个包含 10 个整数元素的堆栈,然后使用函数添加一个元素

c++ - 将堆栈实现为链接结构的解码器