私はPython 3.2をARM920T(アーキテクチャ4T)用にコンパイルしようとしていますが、いくつかの奇妙なエラーが発生しています。Python on Arm、不正命令
次のコンパイラを使用するように設定されたScratchbox環境でPythonをコンパイルしています: "gcc version 4.3.3(Sourcery G ++ Lite 2009q1-203)"はアームクロスコンパイラです。
コンパイル時に、次の環境変数で-march = armv4tアーキテクチャフラグを設定していることを確認しました。CFLAGS、CPPFLAGS、SBOX_EXTRA_COMPILER_FLAGS。
スクラッチボックスで正常にコンパイルされ、スクラッチボックスアームエミュレータでPythonインタプリタを実行できます。
しかし私はそれを私のARM920Tに移すと、Pythonのexeを実行した後、不当な命令エラーが発生します。
コアダンプは次の出力をyeilds:
Program terminated with signal 4, Illegal instruction.
#0 0x00138810 in __aeabi_dadd()
とバックトレースの最初の数行:私の知る限り、__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
2つの浮動小数点数を追加するためのライブラリ呼び出しです(Double Add)。
私はエラー(longobject.cライン2001)の原因となっているバックトレースレポートのpythonコードを見上げ:
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;
}
私はこのコードがエラーを起こすべき理由本当に見ていけません。私は上記のコードのように、e.t.cを追加/減算/分割した小さなC++プログラムを作成しようとしましたが、それはデバイス上で正常に動作しました。
ご協力いただければ幸いです。私が考えることができる唯一の事は、間違った浮動小数点ライブラリがexeファイルにコンパイルされている可能性があるということです。 ARM920Tには、私がGoogleから知る限り、ハードウェア浮動小数点サポートはありません。
アライメントエラーの可能性もあります。 -Wcast-alignフラグを指定してPythonをコンパイルすると、いくつかのキャスト警告が報告されます。特定のデータ型がメモリ内の偶数アドレスで整列されていない場合、ARMはそれを好まない。/proc/cpu/alignmentは何も報告しません。テキストの壁のために申し訳ありません
、おかげであなたがここまで読めば:)あなたは、デバイス上の1よりも高いアーキテクチャ用にコンパイルされているいくつかのライブラリにリンクされているようですね
素晴らしい!これは正しい方向です!私はgnuデバッガで逆アセンブルを行い、違法な命令が何であったかを確認しました。これはCLZ命令であり、aeabi_ *関数で実行されます。 ARMの文書によると、CLZ命令はARM5以上の命令です。それはエラーを説明します。今私がする必要があるのは、この命令が生成される場所を追跡することです。これはもう少し複雑です。私はリンクされているライブラリのどれもがこの命令を含んでいないことを確認しました。 – Daniel