Как интерпретировать динамическую таблицу символов в исполняемом файле ELF?

Я искал интерпретацию динамической таблицы символов (.dynsym) исполняемого файла ELF. Я мог успешно интерпретировать таблицу символов .symtab (16 байтов для каждого символа), используя атрибут value для обозначения адреса символа и атрибут name для обозначения смещения начала строки в разделе .strtab. Но я не могу интерпретировать динамическую таблицу символов (.dynsym) с помощью того же метода. Я использовал блог Али [1] для справки.

Я просмотрел другой блог Али [2], но я не понимаю, как интерпретировать динамическую таблицу символов с помощью хеш-таблицы. Ясно, что это не то же отображение, которое используется в таблице символов. Как мне интерпретировать динамическую таблицу символов (.dynsym)?

Кроме того, исполняемый файл ELF, на который я смотрю, имеет два раздела, а именно .hash и .gnu.hash. В какой раздел я обращаюсь за хеш-значениями?

[1] http://blogs.oracle.com/ali/entry/inside_elf_symbol_tables
[2] http://blogs.oracle.com/ali/entry/gnu_hash_elf_sections < / а>


person Hrishikesh Murali    schedule 18.08.2011    source источник
comment
Хорошо, я ждал день комментария / ответа, но у меня его нет. Что я делаю вывод? : - /   -  person Hrishikesh Murali    schedule 20.08.2011


Ответы (2)


Согласно спецификации ELF, каждый символ определяется с использованием следующей структуры:

typedef struct {
      Elf32_Word
      Elf32_Addr
      Elf32_Word
      unsigned char
      unsigned char
      Elf32_Half
} Elf32_Sym;

В общем, это будет 16 байт. Таблица динамических и статических символов использует одну и ту же структуру, поэтому анализ этой таблицы одинаков для статических и компоновочных. Конечно, значение значений не всегда одно и то же.

Вы можете найти символ в таблице символов двумя способами. Во-первых, если вы уже знаете индекс символа, вы можете просто перейти к этому индексу. Но иногда у вас нет индекса символа, у вас есть только имя символа, и на самом деле вы хотите проверить, есть ли в таблице символов определение символа с этим именем. Во второй ситуации вы используете хеш-разделы. Они используются для быстрой проверки наличия символа в таблице символов: symbol-name -> hash -> symb_index -> проверка наличия symbol_table[symb_index] == symbol-name.

person JohnTortugo    schedule 01.10.2012
comment
Это неверно, потому что Elf32_Half составляет 2 байта, а не 4, что дает: 4 + 4 + 4 + 1 + 1 + 2 = 16 байтов. Также стоит отметить, что с ELFCLASS64 (x86-64) это 24 байта. - person krb686; 08.07.2017

Но я не могу интерпретировать динамическую таблицу символов (.dynsym) с помощью того же метода.

Вам нужно будет искать строки в разделе .dynstr.

Кроме того, исполняемый файл ELF, который я рассматриваю, имеет два раздела, а именно .hash и .gnu.hash. В какой раздел я обращаюсь за хеш-значениями?

Это будет зависеть от типа символа, который вы хотите найти. Насколько мне известно, хеш-таблицы в стиле GNU содержат только информацию, имеющую отношение к динамическому связыванию.

См. Также: описание хэш-таблиц GNU Якуба Елинека, размещенное на список рассылки binutils GNU.

person jkoshy    schedule 23.08.2011