现在,我正在使用readelf
库开发类似pyelftools
的程序。
我要打印如下表格。
在这里,Offset
字段是stderr@GOT
的地址。
jiwon@jiwon$ readelf -a --wide libstdbuf.so
...
Relocation section '.rel.dyn' at offset 0x454 contains 12 entries:
Offset Info Type Sym. Value Symbol's Name
00001c50 00000206 R_386_GLOB_DAT 00000000 stderr@GLIBC_2.0
...
假设我只有未知符号的GOT地址(00001c50
)。
我的处境 我想使get_symname_by_GOTaddress
之类的功能可以解决从 00001c50
到 { {1}} 。
问题: 但是,我找不到二进制文件stderr@GLIBC_2.0
和GOT address
之间的任何链接信息。我怎么才能得到它?
答案 0 :(得分:1)
.rel.dyn
部分中的每个条目都至少包含以下字段:
r_offset;
r_info;
因此,首先扫描该部分,直到地址与条目的r_offset
字段匹配,然后字段r_info
包含(也)符号表的索引,该索引是根据以下内容组成的:
/* for 32bit */
#define ELF32_R_INFO(sym, type) (((sym)<<8)+(unsigned char)(type))
/* for 64bit */
#define ELF64_R_INFO(sym, type) (((Elf64_Xword)(sym)<<32)+ \
(Elf64_Xword)(type))
因此,您可以提取sym
索引,然后从符号表中获取条目,该符号表具有字段st_name
,该字段是字符串表的索引,该字符串表包含字符符号名称表示形式。
更多信息链接:
rel.dyn section description-> symbol table description-> string table description