Dan*_*iel 5 python arm cross-compiling scratchbox
我正在尝试为ARM920T(架构4T)编译Python 3.2,但我遇到了一些奇怪的错误.
我正在Scratchbox环境中编译Python,配置为使用以下编译器:"gcc版本4.3.3(Sourcery G ++ Lite 2009q1-203)"这是一个arm交叉编译器.
在编译时,我确保在以下环境变量中设置-march = armv4t架构标志:CFLAGS,CPPFLAGS,SBOX_EXTRA_COMPILER_FLAGS.
它在scratchbox中编译很好,我能够使用scratchbox arm模拟器运行python解释器.
然而,当我将它移动到我的ARM920T时,我在运行python exe后立即得到了一个非法指令错误.
核心转储产生以下输出:
Program terminated with signal 4, Illegal instruction.
#0 0x00138810 in __aeabi_dadd ()
Run Code Online (Sandbox Code Playgroud)
并且后面跟踪的前几行:
#0 0x00138810 in __aeabi_dadd ()
#1 0x001134f4 in PyLong_FromString (str=0x402de300 "3644798167", pend=0x0, base=10) at Objects/longobject.c:2001
#2 0x00132478 in parsenumber (s=<value optimized out>, c=<value optimized out>) at Python/ast.c:3189
#3 ast_for_atom (n=<value optimized out>, c=<value optimized out>) at Python/ast.c:1396
#4 ast_for_power (n=<value optimized out>, c=<value optimized out>) at Python/ast.c:1726
#5 ast_for_expr (c=0xbeaf7f50, n=0x402f5b78) at Python/ast.c:191
Run Code Online (Sandbox Code Playgroud)
据我所知,__aeabi_dadd调用是一个库调用,用于添加两个浮点数(Double Add).
我查找了回溯报告导致错误的python代码(longobject.c line 2001):
if (log_base_BASE[base] == 0.0) {
twodigits convmax = base;
int i = 1;
log_base_BASE[base] = (log((double)base) / // Line 2001
log((double)PyLong_BASE));
for (;;) {
twodigits next = convmax * base;
if (next > PyLong_BASE)
break;
convmax = next;
++i;
}
Run Code Online (Sandbox Code Playgroud)
我真的不明白为什么这段代码会导致任何错误.我尝试制作一个小的C++程序,它增加/减少/分割了很多双打,就像上面的代码一样,它在设备上运行良好.
任何帮助将非常感激.我能想到的唯一的事情是可能错误的浮点库被编译到exe中.据我所知,ARM920T没有硬件浮点支持.
另一个原因可能是对齐错误.使用-Wcast-align标志编译Python时,它会报告一些强制警告.当某些数据类型未在内存中的偶数地址对齐时,ARM不喜欢它./ proc/cpu/alignment不会报告任何内容.
对不起文字的墙,谢谢你,如果你读到这里:)
我找到了解决方案!
我对通话期间控制台上喷出的所有内容进行了文件转储make,并且我注意到一些调用gcc不包含该-march=armv4t选项。
我发现我拼写错误了SBOX_EXTRA_COMPILER_FLAGS。它应该是SBOX_EXTRA_COMPILER_ARGS。有了这个设置,并CFLAGS设置为-march=armv4tPython,现在可以成功构建并运行,而不会出现非法指令。
感谢 Leo,为我指明了正确的方向!
| 归档时间: |
|
| 查看次数: |
2616 次 |
| 最近记录: |