Как интерпретировать `p_size` в файлах ELF? - PullRequest
0 голосов
/ 13 ноября 2018

Недавно я играл с файлами формата ELF.И я попытался решить проблему:

Учитывая eip, напечатайте имя функции в исполняемом файле ELF

И я могу сделать это с символомтаблица и таблица строк.Поскольку мне нужно иметь дело только с теми символами, тип которых STT_FUNC, я написал следующую программу:

for (i = 0; i < nr_symtab_entry; ++i) {
  if ((symtab[i].st_info == STT_FUNC) &&
      eip <  symtab[i].st_value + symtab[i].st_size &&
      eip >= symtab[i].st_value) {
        strcpy(funcName, strtab + symtab[i].st_name);
  }
}

, где symtab - таблица символов, strtab - таблица строк.

Но после нескольких тестов я понял, что вышеприведенная программа неверна.После нескольких испытаний я изменил это на следующее:

for (i = 0; i < nr_symtab_entry; ++i) {
  if ((symtab[i].st_info & STT_FUNC) &&
      eip <  symtab[i].st_value + symtab[i].st_size &&
      eip >= symtab[i].st_value) {
        strcpy(funcName, strtab + symtab[i].st_name);
  }
}

Тогда это сработало!Но когда я man elf, руководство сообщило мне:

st_info Этот элемент указывает тип символа и атрибуты привязки

Это неупомяните, бит это флаг или нет.И тогда я столкнулся с проблемой, которая требует от меня проверить, является ли сегмент PT_LOAD.И в руководстве, опять же, не указано, является ли это битовым флагом или нет.Поэтому я прихожу сюда, чтобы попросить о помощи ... PT_LOAD тоже немного флаг?Является ли каждая символьно-постоянная вещь в ELF-файле битовым флагом?


Кажется, что st_info можно интерпретировать с помощью определенных макросов.Но как насчет p_type?

1 Ответ

0 голосов
/ 13 ноября 2018

Использование:

if (ELF32_ST_TYPE(symtab[i].st_info) == STT_FUNC && ...

как, например, ядро ​​в linux kernel / module.c .

ELF32_ST_TYPE используется для извлечения типа символа из st_info. Я нигде не могу найти список символов, которые являются типами символов, но проверяя #define ELF32_ST_TYPE(info) ((info) & 0xf) и определения в elf.h Я могу быть уверен, что ELF32_ST_TYPE(st_info) равен одному из следующих макросов :

#define STT_NOTYPE  0
#define STT_OBJECT  1
#define STT_FUNC    2
#define STT_SECTION 3
#define STT_FILE    4
#define STT_COMMON  5
#define STT_TLS     6

В man elf там это:

Есть макросы для упаковки и распаковки переплета и поля типа:

ELF32_ST_BIND (информация), ELF64_ST_BIND (информация)
Извлечь привязку из значения st_info.

ELF32_ST_TYPE (информация), ELF64_ST_TYPE (информация)
Извлечь тип из значения st_info.

ELF32_ST_INFO (связывание, тип), ELF64_ST_INFO (связывание, тип)
Преобразуйте привязку и тип в значение st_info.

...