Как интерпретировать динамическую таблицу символов в исполняемом файле ELF? - PullRequest
10 голосов
/ 18 августа 2011

Я смотрел на интерпретацию динамической таблицы символов (.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

Ответы [ 2 ]

4 голосов
/ 01 октября 2012

Из спецификации 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.

2 голосов
/ 23 августа 2011

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

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

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

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

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

.
...