枚举当前加载的所有共享对象的所有ELF部分

问题描述:

我正在寻找枚举所有ELF部分及其当前二进制的地址以及当前进程可能已加载的所有共享对象的很好方法。枚举当前加载的所有共享对象的所有ELF部分

我知道dl_iterate_phdr的,给了我一个易于使用的ELF 的列表中的所有脑干(),但我期待的ELF 部分,所以它不是适合我的电话。

我不在乎可移植性,只要它在Linux上与ELF一起工作我很高兴!

任何暗示赞赏!

+0

哦,是的,我正在寻找一些C API /代码,适合反思它运行的进程。 – user175104 2012-02-02 00:25:05

我假设你正尝试以编程方式从C/C++程序访问这些信息。我怀疑你应该能够用GNU Binary File Descriptor library(BFD)完成你想要的任务,它用于实现GNU链接器,objdump等(它也有一个Wikipedia article)。请参阅本手册的特别section 2.6,这是关于章节。 BFD创建一个链接列表“struct bfd_section”,通过struct bfd的“部分”成员访问。我想你应该能够通过在argv [0]上使用bfd_fopen来打开当前的二进制文件。 BFD附带binutils

的readelf命令可以做到这一点例如readelf -s

这不是小事,所以张贴链接到源代码readelf似乎是一个不错的选择。造成这种情况的一个原因是处理标题和节结构所需的大量宏。

http://rpm5.org/docs/api/readelf_8c-source.html

+1

该代码非常复杂,因为它支持非本地ELF文件,因此必须处理带有endian和32/64位问题。如果你只需要处理本地的ELF文件(就像在OP中一样),代码就变得微不足道了。迭代节标题不应超过10-15行。 – 2012-02-02 06:06:13

这听起来像一个非常糟糕的主意,但如果你有这方面的合法使用,我只想解析/proc/self/maps并打开引用的文件。没有理由相信节头甚至映射到内存中;很有可能它们位于磁盘上的.data之后,因此当共享对象映射到内存时,它们将被覆盖为零的.bss

打开文件后,可以使用libbfd,但我只是直接使用elf.h。很容易遵循EhdrShdr表。