Чтение таблицы строк ELF в Linux из C

Я хочу написать программу, которая читает таблицу строк двоичного файла. Двоичный файл в ELF работает на REDHAT linux 32. Я сделал следующее -

  1. Прочитайте заголовок эльфа
  2. Читать все разделы

Ниже приведен вывод моей программы.

Entry Address of Binary - 0x8048340
Start of Program Header - 52
Start of section header - 3272
Size of header - 52
Number of section headers - 36
Size of each section headers - 40
Number of section headers - 36
Section header Offset - 3272
string tbl index for section[0] is 0
string tbl index for section[1] is 27
string tbl index for section[7] is 35
string tbl index for section[1879048182] is 49
string tbl index for section[11] is 59
string tbl index for section[3] is 67
string tbl index for section[1879048191] is 75
string tbl index for section[1879048190] is 88
string tbl index for section[9] is 103
string tbl index for section[9] is 112
string tbl index for section[1] is 121
string tbl index for section[1] is 116
string tbl index for section[1] is 127
string tbl index for section[1] is 133
string tbl index for section[1] is 139
string tbl index for section[1] is 147
string tbl index for section[1] is 157
string tbl index for section[1] is 164
string tbl index for section[1] is 171
string tbl index for section[6] is 176
string tbl index for section[1] is 185
string tbl index for section[1] is 190
string tbl index for section[1] is 199
string tbl index for section[8] is 205
string tbl index for section[1] is 210
string tbl index for section[1] is 219
string tbl index for section[1] is 234
string tbl index for section[1] is 250
string tbl index for section[1] is 262
string tbl index for section[1] is 276
string tbl index for section[1] is 288
string tbl index for section[1] is 301
string tbl index for section[1] is 312
string tbl index for section[3] is 17
string tbl index for section[2] is 1
string tbl index for section[3] is 9

Я понимаю, что sh_name в Elf32_Shdr - это в основном индекс для таблицы String, которая на самом деле содержит завершенную строку NULL. Я хочу отобразить эту строку с нулевым символом в конце. У меня есть вопрос здесь -

  1. В приведенном выше выводе мы видим, что для заголовков разделов есть несколько записей, имеющих sh_type = 3 (SHT_STRTAB). Так что я не понимаю, как мне сопоставить индекс (sh_name в Elf32_Shdr) с каким разделом?

После печати Elf32_Shdr для секций, имеющих sh_type = 3, я получаю следующий вывод -

Section header Offset - 3272
sh_name - 67
sh_type - 3
sh_flags - 2
sh_addr - 80481e8
sh_offset - 488
sh_size - 94
sh_link - 0
sh_info - 0
sh_addralign - 1
sh_entsize - 0
--------------------------------------------------------------
sh_name - 17
sh_type - 3
sh_flags - 0
sh_addr - 0
sh_offset - 2948
sh_size - 323
sh_link - 0
sh_info - 0
sh_addralign - 1
sh_entsize - 0
--------------------------------------------------------------
sh_name - 9
sh_type - 3
sh_flags - 0
sh_addr - 0
sh_offset - 6008
sh_size - 664
sh_link - 0
sh_info - 0
sh_addralign - 1
sh_entsize - 0
--------------------------------------------------------------

2 ответа

Решение

Я смог найти ответ сам:). Хотя для написания кода потребовалось много времени. Вот как это делается, если кто-то хочет сослаться на это в будущем - каждый двоичный файл обычно содержит три таблицы String -

1. .dynstr
2. .shstrtab
3. .strtab

В вышеупомянутом вопросе мы имеем дело с.shstrtab, который при расширении расшифровывается как - Раздел заголовка STRING TABle. После прочтения заголовка ELF мы находим следующее поле в заголовке ELF - e_shstrndx. Это индекс, где мы можем найти.shstrtab. Следующая формула может быть использована для расчета, как это будет сделано -

offset = ((elfHdr.e_shstrndx)*elfHdr.e_shentsize)+elfHdr.e_shoff

Значение каждого параметра -

elfHdr.e_shstrndx = index where we can find .shstrtab
elfHdr.e_shentsize = Size of each Section Header
elfHdr.e_shoff = Offset at which section header starts.

Короче говоря, e_shstrndx Поле заголовка исполняемого файла ELF содержит индекс таблицы строк ELF, содержащей имена разделов.

Учебное пособие " libelf by Example " содержит более подробное объяснение, а также пример кода, показывающего, как получить имена разделов с помощью функций в ELF(3) API.

Другие вопросы по тегам