ELF - какова цель поля sh_offset? - PullRequest
0 голосов
/ 20 мая 2018

Я пытаюсь узнать больше о формате ELF, в частности, заголовки разделов, и я просто наткнулся на следующее:

Elf32_Ehdr *ehdr = (Elf32_Ehdr*)p;
Elf32_Shdr *shdr = (Elf32_Shdr *)(p + ehdr->e_shoff);
int shnum = ehdr->e_shnum;

Elf32_Shdr *sh_strtab = &shdr[ehdr->e_shstrndx];
const char *const sh_strtab_p = p + sh_strtab->sh_offset;

for (int i = 0; i < shnum; ++i) {
   printf("%2d: %4d '%s'\n", i, shdr[i].sh_name,
          sh_strtab_p + shdr[i].sh_name);
}

 return 0;
}

Теперь я понимаю, что это в основномперебирая таблицу разделов и печатая названия разделов, но я все еще не понимаю поле sh_offset .Что именно это делает?Если e_shstrndx уже указывает на секцию таблицы строк, зачем нам sh_offset ?

1 Ответ

0 голосов
/ 20 мая 2018

Если e_shstrndx уже указывает на секцию таблицы строк, зачем нам sh_offset

e_shstrndx является индексом таблицы секций ;он говорит вам, какой раздел описывает (содержит) таблицу строк.

Но он не сообщает вам, где находятся данные (сами строки).Для этого вам нужно sh_offset.

Вот картинка ..e_shoff сообщает вам, где начинается таблица разделов, .e_shstrndx сообщает, какой элемент этой таблицы вам нужен, и .sh_offset этого элемента указывает, где в файле .shstrtab разделы data is (т.е. где находятся сами строки).

...