2013-03-09 22 views
6

私は、Ubuntu 12.04を実行しているBeagleBoard xM rev Cでftd2xxを使用するプログラムを実行する必要があります。私はを提供しているARMライブラリlibftd2xx.soを使用しようとしています。 libFTDIはオプションではありません。ARM v7プラットフォームのARM v5共有ライブラリ(ftd2xx) - ハードフロート問題とソフトフロート問題

私が気づいた違いは、libftd2xx.soと動作するBeagleBoard上の他のライブラリとの間でreadelf -hAを実行したことです。アーチ固有のセクションでは、他のライブラリでは "7-A"ではなく、 "v7"ではなく "v5TEJ"としてCPU_archを使用する代わりに、ftd2xxに対してOS名を "ARM926EF-S"としています。

これは、ライブラリがARM v5命令セット用であり、BeagleBoardがARM v7を実行していると仮定しています。 ftd2xxを動作させる方法はありますか?

編集:ARM7はARM5と下位互換性があると言われましたが、それでも問題は解決しません。

BeagleBoardでldd libftd2xx.soを実行しても依存関係は表示されませんが、not a dynamic executableが表示されますが、他のライブラリでは機能します。

EDIT 2:

問題はハードフロートABI対ソフトであると思われます。私はBeagleBoard xMにgnueabihfイメージを持っています。私は、静的libftd2xx.aとサンプルプログラムをコンパイルしようとすると、私はこれらの多くを得る:

/usr/bin/ld: error: static_link_uses VFP register arguments, libftd2xx.a(file.o) does not
/usr/bin/ld: failed to merge target specific data of file libftd2xx.a(file.o)

私はmfloat-abi=softmfloatabi=softfpでコンパイルしようとした場合、私は

In file included from /usr/include/stdio.h:28:0,
from main.c:12:
/usr/include/features.h:324:26 fatal error: bits/predef.h: No such file or directory
compilation terminated

を取得します

arm-linux-gnueabihfではなくarm-linux-gnueabiでクロスコンパイルを試みましたが、結果のプログラムはBeagleBoardで実行されません。私は何かできますか、それは不可能ですか?

--------- SOLUTION ----------------

いくつかのトラブルの後、FTDIはそのライブラリーのハードfloatバージョンを提供してくれました働く

https://s3.amazonaws.com/hayk-public/arm926-hf.zip

+0

正確には動作しないのは何ですか?あなたは 'ldd'をどこでホスト上で走らせますか? 'readelf | grep Shared'を試してください。あなたは腕のサポートや何かのlddが必要な場合があります。 (http://stackoverflow.com/questions/6150000/cross-compiler-ldd)stracの使用、ログの確認などの情報をもっと探してみるべきです。ftdiサイトからREADMEを読んだことはありますか? – auselen

+0

私はBeagleBoardで 'ldd'を実行していますので、すでにARMバージョンであるはずです(/ usr/libのARMライブラリで動作します)。私はreadmeを読んで、無駄にFTDIに連絡しました。私はstraceを見ましたが、私はそれをどのように解釈するのか分かりません。 –

+0

どこかにstraceをペーストします。 – auselen

答えて

3

v5TEJはV7-命令セットのサブセットである:多くの人々が個別にそれを要求した後、私はここでそれを提供しています。

コードが少し遅くなり、必要以上に大きくなることがありますが、不正な命令などのためにクラッシュすることなく動作するはずです。ごくわずかな例外を除いて、ARMコードは以前の命令セットと下位互換性があります。

プラットフォーム上でコードが機能しない場合は、USBサブシステムなどのアクセス権がないなどの可能性があります。

+0

バイナリ上でlddを実行すると、出力なしが返されます。 straceは、それが最終的に見つけるライブラリを探していることを示しています。それから、lseekへの呼び出しがいくつかあり、結局コード1で終了します。役立つなら、答えを完全な出力で更新できます。 –

+0

'ldd libftd2xx.so'が依存関係を表示しないという事実を含めるように私の質問を編集しました。私の考えでは許可の問題が排除されています。 –

2

ARM926プロセッサのstracelddの出力は、pastebinを参照してください。 libftd2xx1.1.12のバイナリには複数のプロセッサがあります。 release/build/arm926を使用していることを確認してください。私はstatictestバイナリをeglibcとLinux 2.6.36でARM926 CPU上で実行できます。

ldd出力からは、以下のライブラリが必要です。

  • libdl.so.2 - 動的ロード。
  • librt.so.1 - リアルタイムライブラリ
  • libpthread.so.0 - pthreadsの
  • libgcc_s.so.1
  • - gccのヘルパー。
  • libc.so.6 - eglibcライブラリ
  • ld-linux.so.3 - Linux共有ライブラリローダ。

機能lddが必要とされていないと、次のコマンドは、

LD_TRACE_LOADED_OBJECTS=1 LD_WARN=yes LD_BIND_NOW=yes LD_VERBOSE=yes \ 
/lib/ld-linux.so.3 ./libftd2xx.so.1.1.12 

statictestバイナリ仕事ことを確認し、ライブラリが表示されます。その場合はLD_LIBRARY_PATHrelease/build/arm926/libftd2xx.so.1.1.12に設定してください。 strace出力からは、/libよりも、/lib/tls/v5l/lib/tlsのパスが優先されます。上記のライブラリはすべて/libにあるはずです。あなたはその場所にln(ハードリンク)しようとすることができます。また、strace出力からは、/proc/bus/usbファイルシステムをマウントする必要があります。これはカーネル設定オプションです。 /sys/bus/usb/devicesは、デバイスの検索に幅広く使用されています。あなたのUbuntu 12.04 ARM Linuxにこれが欠けている可能性は低いです。 libd2xx_table.soもあり、非標準のUSBディスクリプタを見つけるのに使用される可能性が最も高いです。

最後に、問題をより具体的に説明すると便利です。あなたはいくつかのプログラムを実行しようとすると、出力はありません?または、プログラムを実行すると例外がありますか? statictestARMバイナリが実行されない場合は、元の想定が正しいと思われます。古い2.6.32カーネル(またはld-linux.so)がARM926EJ-Sに対応している可能性はありますが、新しいUbuntu 12.04では互換性がありません。この場合、PCホストでman ld-linuxを使用して、ld-linux.soの環境変数を確認してください。具体的には、LD_DEBUGLD_ASSUME_KERNELは、バイナリをロードするためにローダを同軸にするのに役立ちます。

+0

助けてくれてありがとう - 静的テストは実行されません。私の編集2を参照してください。ハードフロート問題とは何かできますか? –

+0

'softfp'と' arm-linux-gnueabi'ツールを使ってすべてを静的にリンクすることができます。あるいは、 'arm-linux-gnueabi'ツールから他の共有ライブラリ('/opt/lib/softfp'のようなもの)をインストールし、それらを指すように 'LD_LIBRARY_PATH'を設定することもできます。 「ハードフロート」対「ソフト」は完璧な意味合いがあります。 –

+0

申し訳ありませんが、私は理解しているか分からない、私は何を試してください明確にすることはできますか?'arm-linux-gnueabi'でstatictestをクロスコンパイルすると、プログラムはBeagleBoardで実行されません。 –