2011-11-01 105 views
1

让我试着先给出一些背景。我正在通过某个接口(UART)访问某个微控制器(AVR)的某个项目。我正在直接写入其全局变量,我也能够直接执行函数(写入参数,触发器执行,读回返回值)。获取C符号的类型信息

AVR代码是用C编译的GCC工具链。与它通信的个人电脑正在运行python代码。截至目前,我已经通过解析'objdump -x'输出,轻松地将地址大小信息导入python。现在什么会大大提高我的发展将是关于符号类型(类型&大小的结构元素,枚举值,函数参数&返回值,...)的信息。

不知何故,这似乎是人们每天都做的常见事情,而且我在开始时天真地期待现成的Python工具。好吧,不是那么容易。到目前为止,我花了很多时间来研究如何实现这一目标。 一种方法是仅解析C代码(使用例如pycparser)。但似乎我不得不至少“预解析”代码以排除各种不受支持的构造和各种排序问题等等。另外,从理论上讲,如果编译器会做一些优化,比如结构或枚举重新排序等等,问题就会出现。 我一直在寻找各种gcc,gdb和objdump选项来获取此类信息。花了一些时间寻找提取各种调试格式(矮人,刺)的信息的工具。 到目前为止,我得到的最接近的结果是使用objdump -g选项转储刺中调试信息。这输出类似C的信息,然后我将使用pycparser或独自解析。

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

+0

据我所知,编译器不允许这样'struct'重新排序,因为这可能会破坏二进制兼容性。 (并且'enum'重新排序没有意义,你会重新排序?) –

+0

是的。就我所知,这是标准所不允许的。但是,正如我的情况一样,当二进制可移植性并不重要时,即使重新排序也是有意义的。例如。编译器可以将0分配给最常用的枚举值。 我不相信任何编译器真的会做这样的事情。只是想指出我更喜欢后编译的方法。但任何现成的解决方案都比自己编写代码更好。 – Stefan

回答

0

有一个叫c2ph相当不错的工具,转储类型和尺寸(使用调试信息的源)

+0

这似乎是一个很好的解决方案,至少对我的问题的一部分。但是,无论我尝试使用* .s文件还是* .c文件,它都会给我一个错误。如果它有任何含义,则为错误: 坏阵列刺:(0,71)= ar(0,72)= r(0,72); 0; -1 ;; 0; 22;(0,11 ),0184 ;;在_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行。 – Stefan

0

要回答自己的可分析的描写的特征......这是我发现:

http://code.google.com/p/pydevtools/

其实我以前就知道它,但起初它对我来说并不是真的有用。 所以基本上我把它的Python 3兼容,并做了一些其他的修正/改变也 - 在这里你可以得到这一切:

http://code.google.com/p/pydevtools/source/checkout

其实,有一些实际上使用这个模块更多的代码,但它不是完成了。我可能会在完成后添加它。