从ELF文件生成全上下文符号表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从ELF文件生成全上下文符号表相关的知识,希望对你有一定的参考价值。

我正试图想出一种从我编译的二进制文件生成符号表的灵巧方法。

我通常使用功能齐全的GNU工具链进行嵌入式工作,但我愿意使用系统实用程序(最好是Windows / MSYS2 / Cygwin)来协助。我选择的脚本语言是python,因为这是我工作的公司内部通常使用的语言。

作为参考,大约4年前的以下帖子几乎正是我所寻找的,我希望在经过大量时间之后,必须有一种更简单的方法来实现这一目标。

Extract detailed symbol information (struct members) from elf file compiled with ARM-GCC

我对gdb非常熟悉并习惯使用info variablesp &nameptype name等。我最终需要的是输入/输出,如下所示。我需要支持所有结构,联合,枚举和类型的深嵌套(结构内结构内的结构)。我可以去掉所有其他装饰品,比如静态,易失性,原子等等。我不确定我想用指针做什么,但我想在星号中附加一个星号是很好的。 CSV输出如下。

示例代码

uint64_t myU64;
int64_t my64;

typedef struct {
    uint8_t aaa;
    int8_t bbb;
} myStruct2_t;

struct {
    uint32_t a;
    int32_t b;
    float c;
    enum {
        E_ONE = 100,
        E_TWO = 200,
        E_THREE = 300
    } myEnum;
    union {
        uint16_t aa;
        int16_t bb;
    } myUnion;
    myStruct2_t myStruct2[3];
    uint32_t myArr[2];
} myStruct;

期望的输出

myU64, 0x8001918, uint64_t
my64, 0x800191C, int64_t
myStruct.a, 0x8001920, uint32_t
myStruct.b, 0x8001924, int32_t
myStruct.c, 0x8001928, float
myStruct.myEnum, 0x800192C, int16_t <-- Requires deeper digging for enum
myStruct.myUnion.aa, 0x800192E, uint16_t
myStruct.myUnion.bb, 0x800192E, int16_t
myStruct.myStruct2[0].aaa, 0x8001930, uint8_t
myStruct.myStruct2[0].bbb, 0x8001931, int8_t
myStruct.myStruct2[1].aaa, 0x8001932, uint8_t
myStruct.myStruct2[1].bbb, 0x8001933, int8_t
myStruct.myStruct2[2].aaa, 0x8001934, uint8_t
myStruct.myStruct2[2].bbb, 0x8001935, int8_t
myStruct.myArr[0], 0x8001938, uint32_t
myStruct.myArr[1], 0x800193C, uint32_t

使用上面列出的gdb命令示例,我可以获得所有这些信息,但这需要我编写一个非常复杂的字符串解析器。有任何想法吗?存在的工具或自动化的简单方法?我不得不创建一个工具,但到目前为止,我的想法需要一个字符串解析怪物。我简要介绍了python / gdb API,但没有看到非常适用的示例,但也许这是我可以采取的路径。

此外,虽然我的重点是使用gdb,但我对任何其他可以提供帮助的工具持开放态度。

谢谢!

答案

从我编译的二进制文件生成符号表的光滑方式。

您编译的二进制文件已经有一个符号表,您尝试生成的内容与通常的符号表无关,从而产生了不必要的混淆。

您正在寻找的是非标准格式的调试信息的描述(标准格式是DWARF,这是GDB读取以从ptype生成输出的内容)。

要以编程方式读取DWARF调试信息,请使用libdwarf

以上是关于从ELF文件生成全上下文符号表的主要内容,如果未能解决你的问题,请参考以下文章

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

linux实践之ELF文件分析

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

二进制安全:ELF文件深度分析Linux二进制代码审计

ELF格式解读-符号表

ELF格式解读-符号表