2012-02-27 77 views
8

我正在交叉编译一个带有ocaml校准应用程序的触摸屏驱动程序。交叉编译ARM的ocaml应用程序

我试图编译ARM的驱动程序和应用程序,特别是运行Angström的Beagleboard。

它是这样的:

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

我被困在Relocations in generic ELF (EM: 3)错误。

Makefile文件看起来是这样的:

(...) 
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我的PATH的第一个元素,我试图与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,它对简单的程序工作正常。但在这种情况下,您还需要交叉编译所有依赖库,这可能是一项相当大的任务。

我觉得你最好的解决方法是:

  • 构建本地手臂QEMU(这是很容易的,也有预编译的Debian的图像available

  • 构建校准应用的字节码二进制(字节码在体系结构之间是可移植的,但需要在目标上安装相同版本的ocaml)并且在arm上安装需要的stub库(包含用于绑定到gtk,cairo等的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 2012-02-29 14:35:05

+2

ocaml in squeeze(3.11.2)确实没有针对ARM的ocamlopt,但是3.12.1的确如此,因此只需启用测试存储库或从源代码构建它(非常简单)。另外请注意,下一次ocaml发布会有全新的arm代码生成器 - 如果你感到很勇敢,它已经可以在svn trunk中使用。 – ygrek 2012-03-01 10:27:56

+0

工作就像一个魅力,谢谢一堆! – RazZziel 2012-03-01 19:25:21

2

看起来你并没有用交叉编译工具链取代所有的工具链。 movl %eax,camlVersion是一个典型的x86指令,不是你在ARM代码中看到的东西。当我忘记在不同架构的构建代码之间进行清理时,我通常会得到您的错误。

+0

我删除了源代码目录,再次解压缩,并且双重检查了没有流浪的二进制文件,但没有任何改变。 – RazZziel 2012-02-28 14:35:02

+0

是的,但问题可能不是来源。从你的日志看来,ocamlopt命令似乎生成x86代码而不是arm代码。 ygrek的回答也似乎表明ocaml不支持交叉编译。 – Leo 2012-02-28 15:11:15