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は何も報告しません。
テキストの壁でごめんなさい、ここまで読んでくれてありがとう:)