获取有关ELF中的函数和相关符号的信息

时间:2014-02-18 15:04:31

标签: c++ c linux elf

我想在C / C ++中检查函数和相关符号(ELF)。

我之前使用过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;
   }
}

2 个答案:

答案 0 :(得分:0)

使用libbfd:

https://sourceware.org/binutils/docs/bfd/

这是binutils工具用来获取有关ELF符号的信息的库。

答案 1 :(得分:-1)

您也可以编写自己的ELF解析器。 请注意,32位和64位平台的对象略有不同。

导出的函数列在重定位表上, 符号名称分别位于SHT_SYNSYM / ELF32_Sym或SHT_SYNSYM / ELF64_Sym下。 重定位地址通常在x86上为R_386_ *,在64位对象上为R_X86_64_GLOB_DAT / R_X86_64_JMP_SLOT。

ELF设计简单,供您参考,我的32位解析器大约有350行代码,而64位解析器大约是320行,而且它们不仅仅是解析格式。

您可以在wiki.OSDev.org/ELF

找到更多参考资料

我建议还阅读外部链接中提供的x86和x86_64的ELF ABI。