c-从ELF文件生成一个完整的上下文符号表



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

我通常使用功能齐全的GNU工具链进行嵌入式工作,尽管我对使用系统持开放态度实用程序(最好是Windows/MSYS2/Cygwin)来提供帮助。我选择的脚本语言是python我工作的公司通常使用的语言。

作为参考,以下4年前的帖子几乎正是我想要的,我希望在经过相当长的时间后,必须有一种更简单的方法来实现这一点。

从ARM-GCC 编译的elf文件中提取详细的符号信息(结构成员)

我对gdb非常熟悉,并且习惯于使用info variablesp &nameptype name等最终需要的是如下所示的输入/输出。我需要支持所有的结构,工会,枚举和类型的深度嵌套(structs in structs into structs)。我可以脱光所有的衣服其他装饰,如静态、易失性、原子等。我还不确定我想用指针做什么,但是我想在下面的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/gdbneneneba API,但还没有看到非常适用的示例,但这可能是一种途径我也可以接受。

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

谢谢!

从编译的二进制文件生成符号表的巧妙方法。

编译后的二进制文件已经有了一个符号表,而您试图生成的内容与通常的符号表无关,这会造成不必要的混乱。

您要查找的是非标准格式的调试信息描述(标准格式是DWARF,GDB读取它以从ptype生成输出)。

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

最新更新