Я хочу проверить функцию и соответствующий символ (ELF) в C/C++.
Я ранее использовал gdb, а затем получил информацию, которую хотел.
gdb ./mybinary
<gdb promt and reading elf..>
(gdb) info functions
0x000000000067a5a0 bfd_true
<etc..>
Таким образом, мой вопрос заключается в том, как я могу получить ту же информацию в своей программе.
Примечание. Я хочу иметь возможность выполнять функции со связанными символами один за другим в моей программе, а не сразу, как с gdb.
Предполагаемый код для задачи:
int main()
{
// any code for elf lookup (functions and related symbol) (while loop)
// result_symbol is a variable with information about function related symbol
// result_function is a variable with information about function name
// it should be possible to compare the data with other data
char function_compare = "system";
if(!strcmp(result_function, function_compare)
{
std::cout << "system() function found in the ELF!" << std::endl;
}
}
Использовать libbfd:
https://sourceware.org/binutils/docs/bfd/
Это библиотека, используемая средствами binutils для получения информации об символах ELF.
libffd
для чего-либо обычно является ошибкой. libbfd
был написан с единственной целью - как уровень абстракции для компоновщика GNU. Это несколько работает для этой роли, и чрезвычайно плохо для всего остального.
Вы также можете написать собственный парсер ELF. Обратите внимание, что объекты для 32-битной и 64-битной платформы немного отличаются.
Экспортированная функция указана в таблице перемещений. Имена символов находятся под символами SHT_SYNSYM/ELF32_Sym или SHT_SYNSYM/ELF64_Sym соответственно. Адреса перемещений обычно находятся под R_386_ * на x86 и R_X86_64_GLOB_DAT/R_X86_64_JMP_SLOT на 64-битном объекте.
ELF разработан, чтобы быть простым и для вашей справки, мой 32-разрядный парсер имеет около 350 строк кода, а 64-разрядный парсер - около 320 строк, и они делают гораздо больше, чем просто анализировать формат.
Вы можете найти дополнительную информацию по адресу: wiki.OSDev.org/ELF
Я рекомендую также прочитать ELF ABI для x86 и x86_64, предоставленных во внешних ссылках.