让我试着先给出一些背景。我正在通过某个接口(UART)访问某个微控制器(AVR)的某个项目。我正在直接写入其全局变量,我也能够直接执行函数(写入参数,触发器执行,读回返回值)。获取C符号的类型信息
AVR代码是用C编译的GCC工具链。与它通信的个人电脑正在运行python代码。截至目前,我已经通过解析'objdump -x'输出,轻松地将地址大小信息导入python。现在什么会大大提高我的发展将是关于符号类型(类型&大小的结构元素,枚举值,函数参数&返回值,...)的信息。
不知何故,这似乎是人们每天都做的常见事情,而且我在开始时天真地期待现成的Python工具。好吧,不是那么容易。到目前为止,我花了很多时间来研究如何实现这一目标。 一种方法是仅解析C代码(使用例如pycparser)。但似乎我不得不至少“预解析”代码以排除各种不受支持的构造和各种排序问题等等。另外,从理论上讲,如果编译器会做一些优化,比如结构或枚举重新排序等等,问题就会出现。 我一直在寻找各种gcc,gdb和objdump选项来获取此类信息。花了一些时间寻找提取各种调试格式(矮人,刺)的信息的工具。 到目前为止,我得到的最接近的结果是使用objdump -g选项转储刺中调试信息。这输出类似C的信息,然后我将使用pycparser或独自解析。
但是在我花时间做这件事之前,我决定在这里提出一个问题,强烈希望有人会以我可能完全不同的方式打我,我没有想到。
据我所知,编译器不允许这样'struct'重新排序,因为这可能会破坏二进制兼容性。 (并且'enum'重新排序没有意义,你会重新排序?) –
是的。就我所知,这是标准所不允许的。但是,正如我的情况一样,当二进制可移植性并不重要时,即使重新排序也是有意义的。例如。编译器可以将0分配给最常用的枚举值。 我不相信任何编译器真的会做这样的事情。只是想指出我更喜欢后编译的方法。但任何现成的解决方案都比自己编写代码更好。 – Stefan