ELF: Как напечатать поле r_info? - PullRequest
1 голос
/ 01 марта 2020

Я хочу перечислить имена всех записей перемещения, которые имеют тип 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

что я делаю не так?

1 Ответ

2 голосов
/ 02 марта 2020

r_info содержит символ index , который является индексом массива для таблицы символов. Элементы массива имеют тип Elf32_Sym или Elf64_Sym. Индекс таблицы строк имени символа находится в элементе st_name. Эта дополнительная косвенность необходима, потому что в общем случае для привязки символа требуется больше данных, чем просто его имя.

...