2012-02-01 25 views
4

我正在尋找枚舉所有ELF部分及其當前二進制的地址以及當前進程可能已加載的所有共享對象的很好方法。枚舉當前加載的所有共享對象的所有ELF部分

我知道dl_iterate_phdr的,給了我一個易於使用的ELF 的列表中的所有腦幹(),但我期待的ELF 部分,所以它不是適合我的電話。

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

任何暗示讚賞!

+0

哦,是的,我正在尋找一些C API /代碼,適合反思它運行的進程。 – user175104 2012-02-02 00:25:05

回答

3

我假設你正嘗試以編程方式從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

1

的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

3

這聽起來像一個非常糟糕的主意,但如果你有這方面的合法使用,我只想解析/proc/self/maps並打開引用的文件。沒有理由相信節頭甚至映射到內存中;很有可能它們位於磁盤上的.data之後,因此當共享對象映射到內存時,它們將被覆蓋爲零的.bss

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