2012-02-27 17 views
8

Estoy compilando de forma cruzada un controlador de pantalla táctil, que viene con una aplicación de calibración ocaml.Aplicaciones ocaml de compilación cruzada para ARM

Estoy tratando de compilar el controlador y la aplicación para ARM, en particular, el Beagleboard, ejecutando Angström.

dice así:

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

estoy atascado en ese error Relocations in generic ELF (EM: 3).

El Makefile se ve así:

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

Como /usr/local/angstrom/arm/environment-setup hojas /usr/local/angstrom/arm/bin como el primer elemento de mi camino, he tratado de sustituir algunos programas con las versiones 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 

Sin embargo, después de reemplazar as, los módulos ni siquiera compilan

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 

Estoy bastante seguro de que debe ser un error muy estúpido, pero no puedo encontrar documentación sobre cómo hacerlo correctamente. ¿Alguien sabe lo que podría estar fallando?

El código fuente del controlador que estoy tratando de construir se puede encontrar here.

Respuesta

7

ocaml actualmente no es compatible con la compilación cruzada, y pasar la opción -cc no hará que la compilación cruzada sea mágicamente armónica. Hay algunos parches flotando que lo hacen posible, pero nada oficial. Recuerdo usar parcheado ocamlopt y funcionó bien para programas simples. Pero en este caso también tendrá que compilar de forma cruzada todas las bibliotecas dependientes, y esto puede ser una tarea bastante larga.

creo que la mejor solución es o bien:

  • acumulación de forma nativa en qemu brazo (esto es bastante fácil, hay imágenes de debian prediseñados available)

  • construir un binario código de bytes de la aplicación de calibración (el bytecode es portátil entre arquitecturas pero requiere la misma versión de ocaml instalada en el destino) e instala bibliotecas stub necesarias (las que contienen código C para enlaces a gtk, cairo, etc.) en el brazo (compiladas de forma nativa o desde paquetes)

+0

Estoy probando la primera opción, ya que la distribución de Angstrom no tiene un paquete ocaml. Sin embargo, no puedo encontrar ocamlopt en la máquina Debian Squeeze ARM que estoy usando (se pueden encontrar fácilmente disponibles [aquí] (http://people.debian.org/~aurel32/qemu/armel/)) . Según [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 no está disponible para ARM, lo que hizo que mi día fuera un poco más triste. ¿Conoces una solución para esto? – RazZziel

+2

ocaml in squeeze (3.11.2) de hecho no tiene ocamlopt para ARM, pero 3.12.1 sí, así que simplemente habilite el repositorio de pruebas o compilarlo desde la fuente (muy fácil). También tenga en cuenta que la próxima versión de ocaml tendrá un nuevo generador de códigos de brazo: ya está disponible en svn trunk si se siente valiente. – ygrek

+0

¡Funcionó como un amuleto, muchas gracias! – RazZziel

2

Parece que no ha reemplazado toda la cadena de herramientas con la cadena de herramientas de compilación cruzada. movl %eax,camlVersion es una instrucción x86 típica y no algo que verías en el código ARM. Normalmente obtengo tus errores cuando olvido hacer una limpieza entre código de construcción para diferentes arquitecturas.

+0

Quité el directorio de origen, lo desempaqué de nuevo y comprobé dos veces que no había binarios perdidos, pero no cambió nada. – RazZziel

+0

Sí, pero probablemente el problema no sea la fuente. De sus registros parece que el comando ocamlopt produce código x86 en lugar de código de armado. La respuesta de ygrek también parece sugerir que ocaml no es compatible con la compilación cruzada. – Leo

Cuestiones relacionadas