获取C符号的类型信息

获取C符号的类型信息,c,types,C,Types,让我先介绍一下背景情况。我正在做一些微控制器(AVR)的项目,我通过一些接口(UART)访问它。我直接写入它的全局变量,也可以直接执行函数(写入参数、触发执行、读回返回值) AVR代码是用GCC工具链用C编译的。与之通信的PC机正在运行python代码。到目前为止,我已经通过解析'objdump-x'输出,轻松地将地址和大小信息导入python。现在,将极大地促进我的发展的是关于符号类型的信息(结构元素的类型和大小、枚举值、函数参数和返回值等等) 不知何故,这似乎是人们每天都做的一件普通事情,我

让我先介绍一下背景情况。我正在做一些微控制器(AVR)的项目,我通过一些接口(UART)访问它。我直接写入它的全局变量,也可以直接执行函数(写入参数、触发执行、读回返回值)

AVR代码是用GCC工具链用C编译的。与之通信的PC机正在运行python代码。到目前为止,我已经通过解析'objdump-x'输出,轻松地将地址和大小信息导入python。现在,将极大地促进我的发展的是关于符号类型的信息(结构元素的类型和大小、枚举值、函数参数和返回值等等)

不知何故,这似乎是人们每天都做的一件普通事情,我天真地期待着一开始就有现成的python工具。嗯,没那么容易。到目前为止,我已经花了很多时间研究如何实现这一目标的各种方法。 一种方法是只解析C代码(使用例如pycparser)。但似乎我必须至少“预解析”代码,以排除各种不受支持的构造和各种排序问题等等。此外,理论上,问题在于编译器是否会进行一些优化,如结构或枚举重新排序等。 我还研究了各种gcc、gdb和objdump选项来获取这些信息。我花了一些时间寻找从各种调试格式(dwarf、STAB)中提取信息的工具。 到目前为止,我最接近的方法是使用objdump-g选项转储stab调试信息。这将输出类似C的信息,然后我将使用pycparser或自己解析这些信息


但在我花时间做这件事之前,我决定在这里提出一个问题,强烈希望有人会用我从未想到过的可能完全不同的方法来打我。

有一个非常好的工具,叫做转储类型和大小的可分析描述符(使用调试信息作为源)

来回答我自己。。。这就是我发现的:

事实上,我以前就知道了,但一开始它对我来说并不起作用。 因此,基本上我使其与Python 3兼容,并做了一些其他修复/更改-在这里,您可以获得所有这些:


实际上还有一些代码实际使用了这个模块,但它还没有完成。我可能会在完成后添加它。

这似乎是一个很好的解决方案,至少在我的问题的一部分。但无论我尝试使用*.s文件还是*.c文件,它都会给我一个错误。这里是错误,如果它有任何意义:坏数组stab:(0,71)=ar(0,72)=r(0,72);0;-1.0;22;(0,11),0,184;; in_jmp_buf:T(0,70)=s23_jb:(0,71)=ar(0,72)=r(0,72);0;-1.0;22;(0,11),0,184;; 在/usr/bin/pstruct第998行,第65行。据我所知,编译器不允许如此
struct
重新排序,因为这可能会破坏二进制兼容性。(和
enum
重新排序没有意义。您会重新排序什么?)。据我所知,这是标准所不允许的。但是,在我的例子中,当二进制可移植性并不重要时,即使重新排序也有意义。例如,编译器可以将0分配给最常用的枚举值。我不相信任何编译器真的会做这样的事情。我只是想指出我更喜欢编译后的方法。但任何现成的解决方案都比自己编写代码要好。