2012-02-27 15 views
8

Sto compilando un driver touchscreen, che viene fornito con un'applicazione di calibrazione ocaml.Applicazioni cross-compiling ocaml per ARM

Sto provando a compilare il driver e l'applicazione per ARM, in particolare, il Beagleboard, che esegue Angström.

va in questo modo:

^_^[[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 

Sono bloccato in tale errore Relocations in generic ELF (EM: 3).

Il Makefile si presenta così:

(...) 
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) $+ 

Come /usr/local/angstrom/arm/environment-setup foglie /usr/local/angstrom/arm/bin come il primo elemento del mio percorso, ho provato a sostituire alcuni programmi con le versioni 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 

Tuttavia, dopo la sostituzione as, i moduli non compilano nemmeno

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 

Sono abbastanza sicuro che deve essere un errore molto stupido, ma non riesco a trovare la documentazione su come farlo correttamente. Qualcuno sa cosa potrebbe fallire?

Il codice sorgente del driver che sto cercando di creare può essere trovato here.

risposta

7

ocaml attualmente non supporta la compilazione incrociata, e l'opzione di passaggio -cc non la comporterà magicamente in cross-compile. Ci sono alcune patch che lo rendono possibile, ma niente di ufficiale. Ricordo di aver usato patch ocamlopt e ha funzionato bene per programmi semplici. Ma in questo caso dovrai anche compilare a croce tutte le librerie dipendenti e questo può essere un bel po 'di compito.

penso che la soluzione migliore è quella di uno:

  • costruire in modo nativo in braccio QEMU (questo è abbastanza facile, ci sono le immagini debian predefinite available)

  • costruire un binario bytecode di applicazione di calibrazione (il bytecode è portatile tra le architetture ma richiede la stessa versione di ocaml installato sul target) e installa le librerie stub richieste (quelle che contengono il codice C per i collegamenti a gtk, cairo, ecc.) a braccio (compilate in modo nativo o dai pacchetti)

+0

Sto provando la prima opzione, poiché la distribuzione Angstrom non ha un pacchetto ocaml. Tuttavia, non riesco a trovare ocamlopt nella macchina ARM Debian Squeeze che sto usando (possono essere trovati facilmente disponibili [qui] (http://people.debian.org/~aurel32/qemu/armel/)) . Secondo [questo] (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 non è disponibile per ARM, che ha reso la mia giornata un po 'più triste. Ti capita di sapere una soluzione alternativa per questo? – RazZziel

+2

ocaml in squeeze (3.11.2) infatti non ha ocamlopt per ARM, ma 3.12.1 lo fa, quindi basta abilitare il repository di testing o crearlo dal sorgente (molto facile). Si noti inoltre che la prossima versione di ocaml avrà un generatore di codice di braccio nuovo di zecca - è già disponibile nel baule svn se vi sentite coraggiosi. – ygrek

+0

Ha funzionato come un incantesimo, grazie mille! – RazZziel

2

Sembra che tu non abbia sostituito tutti i toolchain con la toolchain cross-compilation. movl %eax,camlVersion è una tipica istruzione x86 e non qualcosa che si vedrebbe nel codice ARM. Di solito ottengo i tuoi errori quando mi dimentico di fare una pulizia tra codice edilizio per diverse architetture.

+0

Ho rimosso la directory di origine, l'ho decompressa di nuovo e ricontrollato non c'erano binari vaganti, ma non è cambiato nulla. – RazZziel

+0

Sì, ma il problema probabilmente non è la fonte. Dai tuoi log sembra che il comando ocamlopt produca il codice x86 invece del codice arm. La risposta di ygrek sembra anche suggerire che ocaml non supporta la compilazione incrociata. – Leo