2012-02-27 31 views
8

Tôi đang biên dịch chéo trình điều khiển màn hình cảm ứng, đi kèm với ứng dụng hiệu chuẩn ocaml.Cross-biên dịch ứng dụng ocaml cho ARM

Tôi đang cố gắng biên dịch trình điều khiển và ứng dụng cho ARM, đặc biệt là Beagleboard, chạy Angström.

Nó đi như thế này:

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

tôi bị mắc kẹt trong đó Relocations in generic ELF (EM: 3) lỗi.

Các Makefile trông như thế này:

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

Như /usr/local/angstrom/arm/environment-setup/usr/local/angstrom/arm/bin là yếu tố đầu tiên của PATH của tôi, tôi đã cố gắng để thay thế một số chương trình với các phiên bản 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 

Tuy nhiên, sau khi thay thế as, các mô-đun thậm chí không biên dịch

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 

Tôi khá chắc chắn nó phải là một lỗi rất ngu ngốc, nhưng tôi không thể tìm thấy tài liệu về cách làm điều này đúng cách. Có ai biết điều gì có thể thất bại không?

Mã nguồn của trình điều khiển mà tôi đang cố gắng xây dựng có thể được tìm thấy here.

Trả lời

7

ocaml hiện không hỗ trợ tính năng biên dịch chéo và tùy chọn chuyển -cc sẽ không làm cho phép biên dịch chéo sang cánh tay kỳ diệu. Có một số bản vá lỗi nổi xung quanh mà làm cho nó có thể, nhưng không có gì chính thức. Tôi nhớ sử dụng ocamlopt vá và nó hoạt động tốt cho các chương trình đơn giản. Nhưng trong trường hợp này, bạn cũng sẽ cần phải biên dịch chéo tất cả các thư viện phụ thuộc và điều này có thể khá là một nhiệm vụ.

Tôi nghĩ rằng giải pháp tốt nhất của bạn là một trong hai:

  • xây dựng tự nhiên trong cánh tay Qemu (đây là khá dễ dàng, có những hình ảnh debian dựng sẵn available)

  • xây dựng một nhị phân bytecode của ứng dụng hiệu chuẩn (bytecode có thể di chuyển giữa các kiến ​​trúc nhưng yêu cầu cùng một phiên bản của ocaml được cài đặt trên target) và cài đặt các thư viện stub cần thiết (các thư viện chứa mã C cho các ràng buộc tới gtk, cairo, vv) trên cánh tay (được xây dựng nguyên bản hoặc từ các gói)

+0

Tôi đang thử tùy chọn đầu tiên, vì bản phân phối Angstrom không có gói ocaml. Tuy nhiên, tôi dường như không thể tìm thấy ocamlopt trong máy Debian Squeeze ARM mà tôi đang sử dụng (chúng có thể tìm thấy ở đây sẵn có [ở đây] (http://people.debian.org/~aurel32/qemu/armel/)) . Theo [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 không có sẵn cho ARM, điều này khiến tôi buồn hơn một chút. Bạn có biết cách giải quyết vấn đề này không? – RazZziel

+2

ocaml trong squeeze (3.11.2) thực sự không có ocamlopt cho ARM, nhưng 3.12.1 có, vì vậy chỉ cần kích hoạt kho thử nghiệm hoặc xây dựng nó từ nguồn (rất dễ). Cũng lưu ý rằng bản phát hành ocaml tiếp theo sẽ có bộ tạo mã cánh tay hoàn toàn mới - nó đã có sẵn trong svn trunk nếu bạn cảm thấy can đảm. – ygrek

+0

Làm việc như một say mê, cảm ơn một bó! – RazZziel

2

Dường như bạn chưa thay thế tất cả chuỗi công cụ bằng chuỗi công cụ biên dịch chéo. movl %eax,camlVersion là một lệnh x86 điển hình và không phải là thứ bạn sẽ thấy trong mã ARM. Tôi thường gặp lỗi của bạn khi tôi quên làm sạch giữa mã xây dựng cho các kiến ​​trúc khác nhau.

+0

Tôi đã xóa thư mục nguồn, giải nén lại thư mục đó và kiểm tra hai lần không có tệp nhị phân đi lạc, nhưng không có gì thay đổi. – RazZziel

+0

Có, nhưng vấn đề có lẽ không phải là nguồn. Từ nhật ký của bạn, có vẻ như lệnh ocamlopt tạo mã x86 thay vì mã cánh tay. Câu trả lời của ygrek cũng dường như gợi ý rằng ocaml không hỗ trợ việc biên dịch chéo. – Leo

Các vấn đề liên quan