2012-02-27 2 views
8

ocaml 보정 애플리케이션과 함께 제공되는 터치 스크린 드라이버를 크로스 컴파일하고 있습니다.ARM 용 ocaml 앱 상호 컴파일

저는 Angström을 실행하는 Beagleboard와 같은 ARM 드라이버와 응용 프로그램을 컴파일하려고합니다.

그것은 다음과 같이 진행됩니다

^_^[[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) 오류가 붙어있어.

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

내 PATH의 첫 번째 요소로 잎 /usr/local/angstrom/arm/bin/usr/local/angstrom/arm/environment-setup, 나는이 교체 한 후,

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 

그러나 ARM 버전에서 일부 프로그램을 대체하려고 :

makefile은 다음과 같습니다 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를 사용하는 것을 기억하며, 간단한 프로그램에서는 괜찮습니다. 그러나이 경우에는 모든 종속 라이브러리를 크로스 컴파일해야 할 필요가 있으며 이것은 약간의 작업 일 수 있습니다. 보정 응용 프로그램의

  • 빌드 바이트 코드 바이너리 (미리 만들어진 데비안 이미지 available가,이 매우 쉽습니다) 기본적으로 팔 QEMU에

    • 빌드 :

      나는 당신의 가장 좋은 방법 중 하나라고 생각 (바이트 코드는 아키텍처간에 이식 가능하지만 ocaml의 동일한 버전이 타겟에 설치되어 있어야 함) 암 (기본 또는 패키지로 빌드 됨)에 필요한 스텁 라이브러리 (gtk, cairo 등의 바인딩을위한 C 코드가 들어있는 라이브러리)를 설치하십시오.

  • +0

    Angstrom 배포판에 ocaml 패키지가 없으므로 첫 번째 옵션을 시도하고 있습니다. 그러나, 나는 데비안 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 in 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