5

我正在尝试为 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 调用是用于添加两个浮点数(双加)的库调用。

我查找了回溯报告导致错误的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++ 程序,该程序添加/减去/除法等很多双精度数,就像上面的代码一样,它在设备上运行良好。


任何帮助将非常感激。我唯一能想到的可能是错误的浮点库被编译到 exe 中。据我从 Google 得知,ARM920T 不支持硬件浮点。

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

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

4

2 回答 2

3

我找到了解决方案!

在通话期间,我对控制台上喷出的所有内容进行了文件转储make,我注意到有几个调用gcc不包含该-march=armv4t选项。

我注意到我拼错了SBOX_EXTRA_COMPILER_FLAGS。应该是SBOX_EXTRA_COMPILER_ARGS。使用该设置,并CFLAGS设置为-march=armv4tPython 现在可以成功构建和运行,而无需非法指令。

感谢Leo,为我指明了正确的方向!

于 2012-03-12T12:23:24.887 回答
2

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

于 2012-03-12T08:09:42.387 回答