【问题标题】:ELF: How to print the r_info field?ELF:如何打印 r_info 字段?
【发布时间】:2020-06-13 18:58:39
【问题描述】:

我想列出所有类型为 R_X86_64_JUMP_SLOT 的重定位条目的名称。到目前为止,这是我所拥有的:

char *str = (char *) (mapped_file + dynstr->sh_offset);

Elf64_Rela *reloc_entry = (Elf64_Rela *) (mapped_file + rela_plt->sh_offset);

for (i = 0; i < rela_plt->sh_size / sizeof(Elf64_Rela); ++i)
{
       if (ELF64_R_TYPE(reloc_entry[i].r_info) == R_X86_64_JUMP_SLOT)
                printf("name: %s\n", str + ELF64_R_SYM(reloc_entry[i].r_info));

}

ELF64_R_TYPE 宏工作正常,但我在使用 ELF64_R_SYM 检索重定位名称时遇到问题。

readelf 正确显示重定位:

Relocation section '.rela.plt' at offset 0x588 contains 3 entries:
  Offset          Info           Type           Sym. Value    Sym. Name + Addend
000000004018  000200000007 R_X86_64_JUMP_SLO 0000000000000000 puts@GLIBC_2.2.5 + 0
000000004020  000300000007 R_X86_64_JUMP_SLO 0000000000000000 printf@GLIBC_2.2.5 + 0
000000004028  000600000007 R_X86_64_JUMP_SLO 0000000000000000 malloc@GLIBC_2.2.5 + 0

我的代码由于某种原因没有打印符号名称,而是打印:

name: ibc.so.6
name: bc.so.6
name: so.6

我做错了什么?

【问题讨论】:

  • 字符串表索引如何解决?
  • @FlorianWeimer 你的符号表索引对吗? AFAIK 字符串在 .dynstr 中,所以我使用该部分的索引来获取第一行中的字符串

标签: gcc elf


【解决方案1】:

r_info 包含符号index,它是符号表的数组索引。数组元素的类型为Elf32_SymElf64_Sym。符号名称的字符串表索引在st_name 成员中。这种额外的间接是必要的,因为通常绑定符号需要更多的数据,而不仅仅是其名称。

【讨论】:

  • 为此苦苦挣扎了好几天,我认为他们可以在手册页上对此更清楚。谢谢弗洛里安
猜你喜欢
  • 2022-01-25
  • 1970-01-01
  • 2013-03-13
  • 2014-07-11
  • 2015-07-07
  • 2014-02-12
  • 2013-03-16
  • 2015-11-04
  • 2020-01-02
相关资源
最近更新 更多