我可以通过 "GOT address" 获取交易品种名称吗?

Can I get symbol name by "GOT address"?

现在我正在使用 pyelftools 库开发类似 readelf 的程序。

我想像下面那样打印 table。
在这里,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的函数来解决00001c50stderr@GLIBC_2.0.

问题: 但是,我在二进制文件中找不到GOT addresssymbol name之间的任何链接信息.我怎么才能得到它?

.rel.dyn 部分中的每个条目至少包含以下字段:

r_offset;
r_info;

所以首先扫描该部分直到地址匹配条目的 r_offset 字段,然后字段 r_info 包含(也)符号 table 的索引,它是根据这个:

/* 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 索引,然后从符号 table 中获取条目,它具有字段 st_name,这是字符串 [=28] 的索引=],其中包含字符表示中的符号名称。

更多信息链接:

rel.dyn section description -> symbol table description -> string table description