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

时间:2012-02-01 23:01:56

标签: c linux process dynamic-linking elf

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

我知道dl_iterate_phdr()的存在,这给了我一个易于使用的ELF 列表,但我正在寻找ELF 部分,所以它不是对我说话。

我不关心可移植性,只要它适用于带有ELF的Linux,我很高兴!

任何暗示都赞赏!

3 个答案:

答案 0 :(得分:3)

我假设您正在尝试以编程方式从C / C ++程序访问此信息。我怀疑你应该能够用GNU Binary File Descriptor library(BFD)做你想做的事情,它用于实现GNU链接器,objdump等(它还有一个Wikipedia article)。请参阅本手册的section 2.6,其中涉及各个部分。 BFD创建一个“struct bfd_section”的链接列表,可通过struct bfd的“sections”成员访问。我认为您应该能够在argv [0]上使用bfd_fopen打开当前二进制文件。 BFD附带binutils

答案 1 :(得分:3)

这听起来真的很糟糕,但是如果你有合法用途,我只需要解析/proc/self/maps并打开引用的文件。没有理由相信节标题甚至映射到内存中;很可能,它们位于磁盘上.data之后,因此当共享对象映射到内存时,它将被.bss的零覆盖。

打开文件后,可以使用libbfd,但我会直接使用elf.h。您可以轻松地将Ehdr跟到Shdr表格。

答案 2 :(得分:1)

readelf命令可以执行此操作,例如readelf -s

这不是一件容易的事,因此发布readelf源代码链接似乎是最佳选择。其中一个原因是处理头部和节结构所需的大量宏。

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