0

现在我正在开发程序,比如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
...


假设我只有00001c50未知符号的 GOT 地址()。

我的情况是我想get_symname_by_GOTaddress00001c50tostderr@GLIBC_2.0

问题:但是,我找不到二进制之间的GOT address任何symbol name我怎么才能得到它?

4

1 回答 1

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 部分描述->符号表描述->字符串表描述

于 2018-10-02T14:45:47.520 回答