2012-02-27 12 views
8

ocamlキャリブレーションアプリケーションに付属のタッチスクリーンドライバをクロスコンパイルしています。ARM用クロスコンパイルocamlアプリ

私は、特にAngströmを実行しているBeagleboardのARM用のドライバとアプリケーションをコンパイルしようとしています。

それはこのようになります:私はそのRelocations in generic ELF (EM: 3)エラーにこだわっている

^_^[[email protected] zytouch-driver-20081121]$ source /usr/local/angstrom/arm/environment-setup 
^_^[[email protected] zytouch-driver-20081121]$ make CC=arm-angstrom-linux-gnueabi-gcc 
arm-angstrom-linux-gnueabi-gcc -std=gnu99 -g -O2 -Wall -Wextra -Werror -Wstrict-prototypes -Wmissing-prototypes -c -o daemon/config.o daemon/config.c 
arm-angstrom-linux-gnueabi-gcc -std=gnu99 -g -O2 -Wall -Wextra -Werror -Wstrict-prototypes -Wmissing-prototypes -c -o daemon/util.o daemon/util.c 
arm-angstrom-linux-gnueabi-gcc -std=gnu99 -g -O2 -Wall -Wextra -Werror -Wstrict-prototypes -Wmissing-prototypes -c -o daemon/debug.o daemon/debug.c 
arm-angstrom-linux-gnueabi-gcc -std=gnu99 -g -O2 -Wall -Wextra -Werror -Wstrict-prototypes -Wmissing-prototypes -c -o daemon/zytouch_usb.o daemon/zytouch_usb.c 
arm-angstrom-linux-gnueabi-gcc -std=gnu99 -g -O2 -Wall -Wextra -Werror -Wstrict-prototypes -Wmissing-prototypes -c -o daemon/zytouchd.o daemon/zytouchd.c 
arm-angstrom-linux-gnueabi-gcc daemon/config.o daemon/util.o daemon/debug.o daemon/zytouch_usb.o daemon/zytouchd.o -lX11 -lXtst -lusb -lm -o zytouch-daemon 
ocamlopt -cc arm-angstrom-linux-gnueabi-gcc -cclib -lcairo -cclib -lextlib -cclib -llablgtk2 -warn-error A -c -I +lablgtk2 -I +cairo -I +extlib -I calibrate calibrate/version.ml -o calibrate/version.cmx 
ocamlopt -cc arm-angstrom-linux-gnueabi-gcc -cclib -lcairo -cclib -lextlib -cclib -llablgtk2 -warn-error A -c -I +lablgtk2 -I +cairo -I +extlib -I calibrate calibrate/util.ml -o calibrate/util.cmx 
ocamlopt -cc arm-angstrom-linux-gnueabi-gcc -cclib -lcairo -cclib -lextlib -cclib -llablgtk2 -warn-error A -c -I +lablgtk2 -I +cairo -I +extlib -I calibrate calibrate/config.ml -o calibrate/config.cmx 
ocamlopt -cc arm-angstrom-linux-gnueabi-gcc -cclib -lcairo -cclib -lextlib -cclib -llablgtk2 -warn-error A -c -I +lablgtk2 -I +cairo -I +extlib -I calibrate calibrate/orientation.ml -o calibrate/orientation.cmx 
ocamlopt -cc arm-angstrom-linux-gnueabi-gcc -cclib -lcairo -cclib -lextlib -cclib -llablgtk2 -warn-error A -c -I +lablgtk2 -I +cairo -I +extlib -I calibrate calibrate/tscalibrate.ml -o calibrate/tscalibrate.cmx 
ocamlopt -cc arm-angstrom-linux-gnueabi-gcc -cclib -lcairo -cclib -lextlib -cclib -llablgtk2 -warn-error A -cc arm-angstrom-linux-gnueabi-gcc -cclib -lcairo -cclib -lextlib -cclib -llablgtk2 -warn-error A -I +lablgtk2 -I +cairo -I +extlib -I calibrate extLib.cmxa str.cmxa unix.cmxa lablgtk.cmxa cairo_lablgtk.cmxa cairo.cmxa gtkInit.cmx calibrate/version.cmx calibrate/util.cmx calibrate/config.cmx calibrate/orientation.cmx calibrate/tscalibrate.cmx -o zytouch-calibrate 
/usr/local/angstrom/arm/lib/gcc/arm-angstrom-linux-gnueabi/4.3.3/../../../../arm-angstrom-linux-gnueabi/bin/ld: /tmp/camlstartup71ef32.o: Relocations in generic ELF (EM: 3) 
/usr/local/angstrom/arm/lib/gcc/arm-angstrom-linux-gnueabi/4.3.3/../../../../arm-angstrom-linux-gnueabi/bin/ld: /tmp/camlstartup71ef32.o: Relocations in generic ELF (EM: 3) 
/tmp/camlstartup71ef32.o: could not read symbols: File in wrong format 
collect2: ld returned 1 exit status 
File "caml_startup", line 1, characters 0-1: 
Error: Error during linking 
make: *** [zytouch-calibrate] Error 2 

。 Makefileには次のようになります

:私のPATHの最初の要素として

(...) 
OFLAGS = -cc ${CC} -cclib -lcairo -cclib -lextlib -cclib -llablgtk2 -warn-error A 
OCAMLOPT = ocamlopt $(OFLAGS) 

OCAML_INC = -I +lablgtk2 -I +cairo -I +extlib -I calibrate 
OCAML_LIBS = $(OCAML_INC) extLib.cmxa str.cmxa unix.cmxa lablgtk.cmxa cairo_lablgtk.cmxa cairo.cmxa gtkInit.cmx 

(...)  
config.cmx: util.cmx 
orientation.cmx: config.cmx 
tscalibrate.cmx: version.cmx util.cmx orientation.cmx config.cmx 

%.cmx : %.ml 
     $(OCAMLOPT) -c $(OCAML_INC) $< -o [email protected] 

%.mli : %.ml 
     $(OCAMLC) -i $(OCAML_INC) $+ 

/usr/local/angstrom/arm/environment-setupとして葉/usr/local/angstrom/arm/bin、私は交換した後で、しかしARMバージョン

sudo ln -s /usr/local/angstrom/arm/bin/arm-angstrom-linux-gnueabi-ar /usr/local/angstrom/arm/bin/ar 
sudo ln -s /usr/local/angstrom/arm/bin/arm-angstrom-linux-gnueabi-as /usr/local/angstrom/arm/bin/as 
sudo ln -s /usr/local/angstrom/arm/bin/arm-angstrom-linux-gnueabi-ld /usr/local/angstrom/arm/bin/ld 

でいくつかのプログラムを交換しようとしましたas、モジュールはコンパイルされません。

ocamlopt -cc arm-angstrom-linux-gnueabi-gcc -cclib -lcairo -cclib -lextlib -cclib -llablgtk2 -warn-error A -c -I +lablgtk2 -I +cairo -I +extlib -I calibrate calibrate/version.ml -o calibrate/version.cmx 
/tmp/camlasm41bb77.s: Assembler messages: 
/tmp/camlasm41bb77.s:31: Error: alignment too large: 15 assumed 
/tmp/camlasm41bb77.s:35: Error: bad instruction `movl $camlVersion__3,%eax' 
/tmp/camlasm41bb77.s:36: Error: bad instruction `movl %eax,camlVersion' 
/tmp/camlasm41bb77.s:37: Error: bad instruction `movl $camlVersion__2,%eax' 
/tmp/camlasm41bb77.s:38: Error: bad instruction `movl %eax,camlVersion+4' 
/tmp/camlasm41bb77.s:39: Error: bad instruction `movl $camlVersion__1,%eax' 
/tmp/camlasm41bb77.s:40: Error: bad instruction `movl %eax,camlVersion+8' 
/tmp/camlasm41bb77.s:41: Error: bad instruction `movl $1,%eax' 
/tmp/camlasm41bb77.s:42: Error: bad instruction `ret' 
/tmp/camlasm41bb77.s:43: Error: unrecognized symbol type "" 
File "calibrate/version.ml", line 1, characters 0-1: 
Error: Assembler error, input left in file /tmp/camlasm41bb77.s 
make: *** [calibrate/version.cmx] Error 2 

私はそれが非常にばかげたエラーでなければならないと確信していますが、これを正しく行う方法に関する文書は見つかりません。誰が何が失敗する可能性があるか知っていますか?

ビルドしようとしているドライバのソースコードはhereです。

答えて

7

ocamlは現在のところクロスコンパイルをサポートしていないため、-ccオプションを指定しても魔法のようにコンパイルされてコンパイルされません。それを可能にするパッチがいくつか浮遊していますが、公式のものはありません。私はパッチを当てたocamloptを使用することを覚えており、それは簡単なプログラムのためにうまくいった。しかし、この場合、すべての依存ライブラリをクロスコンパイルする必要があります。これはかなりの作業になります。

私はあなたの最善の解決策は、どちらかにあると思い

:キャリブレーションアプリケーションのバイトコードのバイナリをビルドする

  • (これは非常に簡単です、構築済みDebianのイメージがavailableあります)アームQEMUでネイティブに

    • ビルド(バイトコードは、アーキテクチャ間でポータブルであるが、ターゲットにインストールOCamlの同じバージョンを必要とする)、必要なスタブライブラリアーム上の(GTK、カイロなどにバインドするためのCコードを含むもの)をインストール

    • (ネイティブまたはパッケージから構築されました)
  • +0

    私はAngstromディストリビューションにocamlパッケージがないため、最初のオプションを試しています。しかし、私は使用しているDebian Squeeze ARMマシンでocamloptを見つけることができないようです(これらは容易に入手できます[こちら](http://people.debian.org/~aurel32/qemu/armel/)) 。 [this](http://old.nabble.com/Bug-377499%3A-ocaml-nox%3A_usr-bin-ocamlopt-missing-in-ocaml-nox_3.09.2-5_s390.deb -td5243672.html)、ocamloptはARMには利用できません。これで、ちょうど私の日が少し悲しくなりました。 この問題の回避策を知っていますか? – RazZziel

    +2

    ocamlのsqueeze(3.11.2)はARM用のocamloptを実際には持っていませんが、3.12.1で動作しますので、テストリポジトリを有効にするか、ソースからビルドする(非常に簡単です)。また、次のocamlリリースでは、新しいアームコードジェネレータが用意されていることに注意してください。あなたが勇気づけるなら、すでにsvnトランクで利用可能です。 – ygrek

    +0

    チャームのように働いて、ありがとう! – RazZziel

    2

    ツールチェインのすべてをクロスコンパイルツールチェーンに置き換えていないようです。 movl %eax,camlVersionは典型的なx86命令であり、ARMコードには表示されません。私は通常、異なるアーキテクチャー用にコードを構築する間にクリーンアップを行うのを忘れると、あなたのエラーを取得します。

    +0

    私は、ソースディレクトリを削除し、再びそれを解凍して、ダブルチェックそこには浮遊バイナリはなかったが、何も変わっていません。 – RazZziel

    +0

    はい、問題はおそらくソースではありません。あなたのログからは、ocamloptコマンドがアームコードの代わりにx86コードを生成するようです。 ygrekの答えは、ocamlがクロスコンパイルをサポートしていないことを示唆しているようです。 – Leo

    関連する問題