Недавно я играл с файлами формата 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
?