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

Generating a Full-Context Symbol Table from an ELF File

我正在尝试想出一种巧妙的方法来从我编译的二进制文件中生成符号 table。

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

作为参考,以下 post 大约 4 年前的内容几乎正是我要找的,我当时 希望鉴于已经过去了相当长的时间,必须有一种更简单的方法来实现这一点。

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

我对gdb比较熟悉,习惯使用info variablesp &nameptype name等。 最终需要的是一个如下所示的 input/output。我需要支持所有结构、联合、 枚举和类型的深层嵌套(结构中的结构中的结构)。我可以脱掉所有 其他装饰,如 static、volatile、atomic 等。我还不确定我想用指针做什么,但是 我想在下面的 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/gdbAPI,但是没看到很适用的例子,不过也许就是一个路线 我也可以。

此外,虽然我的重点一直是使用 gdb,但我愿意接受任何其他可以提供帮助的工具。

谢谢!

slick way of generating a symbol table from my compiled binary.

您编译的二进制文件已经有一个符号 table,您试图生成的内容与通常的符号 table 无关,造成不必要的混淆。

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

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