我正在开发一个程序,用于分析ELF和PE格式的目标文件(一种学校/研究项目)。目前,我正准备处理可执行文件中的动态导入符号。我希望尽可能多地了解有关符号的信息。
在PE格式中,导入存储在.idata部分中。有几个具有不同信息的表格,但对我来说有趣的是,在哪个库中定义符号并没有问题。总是有共享库的名称,然后是从中导入的符号的名称/序数。
我也想在ELF文件中找到这种信息。所有导入/导出都在.dynsym部分-动态符号表中。那些被导入的符号被标记为未定义,例如:
如果我正确理解ELF动态链接过程,那么在ELF可执行文件中不可能找到这些信息。符号从哪里导入是由链接器在将所有符号表加载到内存后确定的。但在继续之前,我想确认一下,我的问题是:有没有办法从ELF可执行文件中找出共享库的符号名称?
谢谢任何建议。
在PE格式中,导入存储在.idata部分中。有几个具有不同信息的表格,但对我来说有趣的是,在哪个库中定义符号并没有问题。总是有共享库的名称,然后是从中导入的符号的名称/序数。
我也想在ELF文件中找到这种信息。所有导入/导出都在.dynsym部分-动态符号表中。那些被导入的符号被标记为未定义,例如:
00000000 DF *UND* 00000000 GLIBC_2.0 fileno
但是没有给出这个符号的源文件信息。所有需要的共享库都在 .dynamic
部分中列出,例如:
Dynamic Section:
NEEDED libz.so.1
符号库中唯一有关信息是版本字符串 = GLIBC_2.0
。我曾考虑通过此找到实际库名,但当我查看objdump -p
的输出时,发现GLIBC_2.0
可以与多个库连接:
Version References:
required from libm.so.6:
0x0d696910 0x00 13 GLIBC_2.0
required from libgcc_s.so.1:
0x0b792650 0x00 12 GLIBC_2.0
如果我正确理解ELF动态链接过程,那么在ELF可执行文件中不可能找到这些信息。符号从哪里导入是由链接器在将所有符号表加载到内存后确定的。但在继续之前,我想确认一下,我的问题是:有没有办法从ELF可执行文件中找出共享库的符号名称?
谢谢任何建议。