我已经成功解析了从多个源文件编译的elf文件(可执行文件)。我能够获得绑定(本地,全局,弱),类型(对象,文件,部分,函数),符号的大小和符号的地址以及符号名称(来自字符串表)。
我也知道符号链接的部分。
我的问题是,我们是否可以获得包含符号表信息中的符号的确切对象文件名( * * .obj)?我在解析时错过了一些信息吗?
答案 0 :(得分:1)
您无法直接获取目标文件名,这在链接期间会丢失。但是,根据用于创建可执行文件的构建过程,您可以从STT_FILE符号推断出目标文件名(例如,可执行文件包含名称为foo.c的STT_FILE符号 - >您可以推断出目标文件是foo的.o)。
特定源文件中的符号似乎遵循带有STB_LOCAL绑定的STT_FILE符号。
从System V ABI标准:
STT_FILE - 传统上,符号的名称给出了与目标文件关联的源文件的名称。文件符号具有STB_LOCAL绑定,其部分索引为SHN_ABS,并且它位于文件的其他STB_LOCAL符号之前(如果存在)。