2012-03-12 28 views
5

私は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よりも高いアーキテクチャ用にコンパイルされているいくつかのライブラリにリンクされているようですね

答えて

3

解決策が見つかりました!

私はmake通話中にコンソール上で噴出し、すべてのファイルダンプを作った、と私はgccにいくつかの呼び出しが-march=armv4tオプションが含まれていなかったことに気づきました。

私はSBOX_EXTRA_COMPILER_FLAGSが間違っていることに気付きました。SBOX_EXTRA_COMPILER_ARGSである必要があります。そのセットでは、CFLAGS-march=armv4tに設定されています。Pythonは、不正な指示なしでビルドと実行に成功しました。

ありがとう、私を正しい方向に向けるために!

2

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

+0

素晴らしい!これは正しい方向です!私はgnuデバッガで逆アセンブルを行い、違法な命令が何であったかを確認しました。これはCLZ命令であり、aeabi_ *関数で実行されます。 ARMの文書によると、CLZ命令はARM5以上の命令です。それはエラーを説明します。今私がする必要があるのは、この命令が生成される場所を追跡することです。これはもう少し複雑です。私はリンクされているライブラリのどれもがこの命令を含んでいないことを確認しました。 – Daniel

関連する問題