我可以从 ELF 文件的符号表中的符号信息中获取对象名称吗?

Posted

技术标签:

【中文标题】我可以从 ELF 文件的符号表中的符号信息中获取对象名称吗?【英文标题】:Can I get object name from a symbol information in the symbol table in an ELF file? 【发布时间】:2011-08-08 12:03:24 【问题描述】:

我已经成功解析了一个从多个源文件编译的elf文件(可执行文件)。我能够获取绑定(本地、全局、弱)、类型(对象、文件、部分、函数)、符号的大小和符号的地址以及符号名称(来自字符串表)。

我也知道符号链接到的部分。

我的问题是,我们能否从符号表信息中获取包含符号的确切目标文件名(**.obj)?解析时是否遗漏了一些信息?

【问题讨论】:

【参考方案1】:

您无法直接获取目标文件名,这在链接过程中会丢失。但是,根据用于创建可执行文件的构建过程,您可以从 STT_FILE 符号推断目标文件名(例如,可执行文件包含名为 foo.c 的 STT_FILE 符号 -> 您可能会推断出目标文件是 foo。 o)。

似乎特定源文件中的符号跟在 STT_FILE 符号之后,并具有 STB_LOCAL 的绑定。

来自 System V ABI 标准:

STT_FILE -- 按照惯例,符号名称给出了与目标文件关联的源文件的名称。一个文件符号具有 STB_LOCAL 绑定,它的节索引是 SHN_ABS,并且它在文件的其他 STB_LOCAL 符号之前(如果存在)。

【讨论】:

以上是关于我可以从 ELF 文件的符号表中的符号信息中获取对象名称吗?的主要内容,如果未能解决你的问题,请参考以下文章

elf文件中的.plt .rel.dyn .rel.plt .got .got.plt的关系

有没有办法从 ELF 中提取符号,并使用 LD 将另一个文件与之前 ELF 中定义的符号链接在一起?

ELF 中的库符号和用户符号

如何获取目标文件中类成员的符号?

将符号强制到 ELF 文件的顶部

Android 逆向ELF 文件格式 ( 程序头数据 | 节区头数据 | 动态符号表 )