Как получить количество записей в таблице символов ELF? - PullRequest
6 голосов
/ 03 сентября 2011

Рассмотрим стандартную программу hello world на C, скомпилированную с использованием GCC без каких-либо ключей.Как говорит readelf -s, он содержит 64 символа.Также говорится, что секция .symtab имеет длину 1024 байта.Однако каждая запись таблицы символов имеет 18 байтов, так как это возможно, она содержит 64 записи?Должно быть 56 записей.Я создаю свою собственную программу, которая читает таблицу символов, и она не видит эти «пропущенные» записи, поскольку она читает до конца раздела.Как readelf знает, как долго читать?

Ответы [ 3 ]

5 голосов
/ 03 сентября 2011

Как видно из elf.h , структура ввода символов выглядит следующим образом:

typedef struct elf32_sym {
  Elf32_Word    st_name;
  Elf32_Addr    st_value;
  Elf32_Word    st_size;
  unsigned char st_info;
  unsigned char st_other;
  Elf32_Half    st_shndx;
} Elf32_Sym;

Elf32_Word и Elf32_Addr - 32-битные значения, Elf32_Half -16 бит, символы 8 бит.Это означает, что размер структуры составляет 16, а не 18 байт.Поэтому секция длиной 1024 байта дает ровно 64 записи.

1 голос
/ 03 сентября 2011

Записи выровнены друг к другу и дополнены пробелами, поэтому несоответствие размера.Проверьте эту почту для аналогичного обсуждения.

Что касается вашего кода, я предлагаю проверить источник для readelf, особенно функцию process_symbol_table() in Binutils / readelf.c .

0 голосов
/ 03 сентября 2011

Размер файла типа данных ELF может отличаться от размера его представления в памяти.

Вы можете использовать функции elf32_fsize () и elf64_fsize () в libelf для получения размера файла типа данных ELF.

...