我可以通过“ GOT地址”获得符号名称吗?

时间:2018-10-01 15:25:28

标签: linux binary elf readelf got

现在,我正在使用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.0GOT address之间的任何链接信息。我怎么才能得到它?

1 个答案:

答案 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