5

ARM920T(アーキテクチャ4T)用にPython 3.2をコンパイルしようとしていますが、奇妙なエラーが発生します。

次のコンパイラを使用するように構成されたScratchbox環境内でPythonをコンパイルしています:アームクロスコンパイラである「gccバージョン4.3.3(Sourcery G ++ Lite2009q1-203)」。

コンパイルするとき、次の環境変数で-march = armv4tアーキテクチャフラグを設定していることを確認しました:CFLAGS、CPPFLAGS、SBOX_EXTRA_COMPILER_FLAGS。

スクラッチボックスで正常にコンパイルされ、スクラッチボックスアームエミュレーターで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呼び出しは、2つの浮動小数点数を加算するためのライブラリ呼び出しです(二重加算)。

バックトレースがエラーを引き起こしていると報告しているPythonコードを調べました(longobject.c行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はハードウェア浮動小数点をサポートしていません。

もう1つの原因は、位置合わせエラーである可能性があります。-Wcast-alignフラグを指定してPythonをコンパイルすると、いくつかのキャスト警告が報告されます。特定のデータ型がメモリ内の偶数のアドレスに整列されていない場合、ARMはそれを好みません。ただし、/ proc / cpu/alignmentは何も報告しません。

テキストの壁でごめんなさい、ここまで読んでくれてありがとう:)

4

2 に答える 2

3

私は解決策を見つけました!

呼び出し中にコンソールに吐き出されたすべてのファイルダンプを作成しましたがmake、へのいくつかの呼び出しにオプションgccが含まれていないことに気付きました。-march=armv4t

SBOX_EXTRA_COMPILER_FLAGSスペルが間違っていることに気づきました。する必要がありますSBOX_EXTRA_COMPILER_ARGS。これを設定CFLAGSし、Pythonに設定する-march=armv4tと、不正な指示なしで正常にビルドおよび実行できるようになります。

私を正しい方向に向けてくれたレオに感謝します!

于 2012-03-12T12:23:24.887 に答える
2

デバイス上のアーキテクチャよりも高度なアーキテクチャ用にコンパイルされたライブラリにリンクしているようです。ARMv4 CPUを搭載したデバイスのCodeSourceryでコンパイルするときにも、同じ問題が発生しました。明らかに、CodeSourceryライブラリはARMv5用にコンパイルされています。あなたが言ったような浮動小数点ライブラリかもしれませんし、他のライブラリかもしれません。問題のファイルがコンパイルされているビルドスクリプト内の場所を見つけて、どのライブラリが使用されているかを正確に確認できますか?

于 2012-03-12T08:09:42.387 に答える