我试图提出一种从编译后的二进制文件生成符号表的巧妙方法。
我通常会使用功能齐全的GNU工具链进行嵌入式工作,尽管我愿意使用系统
实用程序(最好是Windows / MSYS2 / Cygwin)来提供帮助。我选择的脚本语言是python,因为它是
我工作的公司内部通常使用的语言。
作为参考,以下大约4年前的帖子几乎正是我所寻找的,我当时
希望经过大量时间后,必须有一种更简单的方法来实现这一目标。
Extract detailed symbol information (struct members) from elf file compiled with ARM-GCC
我对gdb非常熟悉,习惯于使用info variables
,p &name
,ptype 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。
关于c - 从ELF文件生成全上下文符号表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53949702/