Python on Arm,非法指令

时间:2012-03-12 07:03:37

标签: 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 ()

回溯的前几行:

#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

据我所知,__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;
            }

我真的不明白为什么这段代码会导致任何错误。我尝试制作一个小的C ++程序,它在e.t.c中增加/减少/分割了很多双打,就像在上面的代码中一样,它在设备上运行良好。


非常感谢任何帮助。我能想到的唯一的事情是可能错误的浮点库被编译到exe中。据我所知,ARM920T没有硬件浮点支持。

另一个原因可能是对齐错误。使用-Wcast-align标志编译Python时,它会报告一些强制警告。当某些数据类型未在内存中的偶数地址对齐时,ARM不喜欢它。 / proc / cpu / alignment不会报告任何内容。

对不起文字的墙,谢谢你,如果你读到这里:)

2 个答案:

答案 0 :(得分:3)

我找到了解决方案!

我在make调用期间对控制台上发出的所有内容进行了文件转储,我注意到对gcc的一些调用不包含-march=armv4t选项。< / p>

我注意到我拼错了SBOX_EXTRA_COMPILER_FLAGS错误。它应该是SBOX_EXTRA_COMPILER_ARGS。使用该集,并且CFLAGS设置为-march=armv4t Python现在可以在没有非法指令的情况下成功构建和运行。

感谢Leo,指出我正确的方向!

答案 1 :(得分:2)

听起来您正在链接到某个库,该库是为了比设备上的架构更高的架构而编译的。使用CodeSourcery为具有ARMv4 CPU的设备编译时遇到了同样的问题。显然,CodeSourcery库是为ARMv5编译的。它可能是你所说的浮点库,也可能是其他库。您是否可以在构建脚本中找到正在编译该文件的位置,并确切地检查使用哪些库?