ELF:如何打印 r_info 字段?
ELF: How to print the r_info field?
我想列出类型为 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[=28= 检索重定位名称时遇到问题].
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
我做错了什么?
r_info
包含符号index,它是符号table的数组索引。数组元素的类型为 Elf32_Sym
或 Elf64_Sym
。符号名称的字符串 table 索引在 st_name
成员中。这种额外的间接访问是必要的,因为通常情况下,绑定符号需要的数据不仅仅是其名称。
我想列出类型为 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[=28= 检索重定位名称时遇到问题].
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
我做错了什么?
r_info
包含符号index,它是符号table的数组索引。数组元素的类型为 Elf32_Sym
或 Elf64_Sym
。符号名称的字符串 table 索引在 st_name
成员中。这种额外的间接访问是必要的,因为通常情况下,绑定符号需要的数据不仅仅是其名称。