2013-04-05 3 views
2

나는 OLinuXino 보드가 있습니다. ArchLinux img 파일 (ArchLinuxARM-2013.02-olinuxino-rootfs.img)을 다운로드하고 dd를 사용하여 SD 카드에 쓴 다음 카드를 사용하여 보드를 부팅했습니다. 이더넷을 사용하여 보드를 인터넷에 연결하고 gcc를 설치하고 팩맨을 사용하여 보드를 만들었습니다. 보드에 대한 사용자 공간 프로그램을 만들 수있었습니다.대상 ARM 보드의 rootfs에서 커널 헤더를 사용하여 커널 모듈을 컴파일합니다.

ArchLinux SD 카드 이미지에는 이미 rootfs (/lib/modules/linux-3.7.2-2-ARCH/build)에 커널 헤더 디렉토리가 있습니다. 그래서 보드 자체에로드 가능한 커널 모듈을 빌드 할 수있었습니다.

저는 Ubuntu 12.04.1 개발 PC를 가지고 있습니다. ARM GNU/Linux (ARM-2012.09-64-arm-none-linux-gnueabi.bin) 용 Sourcery CodeBench Lite를 설치했습니다. 이 개발 PC에서 OLinuXino 용 사용자 공간 프로그램을 컴파일하고 SFTP를 통해 보드로 전송하고 보드에서 실행합니다 (ttyAMA0 직렬 포트를 통한 콘솔 사용).

이제 OLinuXino 보드 용 커널 모듈을 컴파일하고 싶습니다. 이전에 다른 커스텀 빌트인 imx233 보드를 만들었습니다 -이 경우 커널 빌드 시스템 (LTIB)을 구성하여 이미지 빌드 후 커널 소스와 rootfs를 그대로 둡니다. 그런 식으로 커널 헤더를 지정하여 커널 모듈을 크로스 컴파일 할 수있는 디렉토리를 만들 수있었습니다.

이번에는 OLinuXino에 대한 빌드 소스가 없으므로 cp -dR을 사용하여 rootfs를 내 Ubuntu PC에 복사하고 커널 헤더 디렉토리를/lib/lib로 지정하여 hello world 커널 모듈을 크로스 컴파일 해 보았습니다. 모듈/리눅스-3.7.2-2-ARCH/구축하고 다음과 같은 오류가 발생했습니다 :

스크립트 폴더의 fixdep 바이너리가 ARM에 대해 미리 컴파일 된, 그래서 바이너리 삭제 및 x86 용으로 컴파일 된
[email protected]:~/HelloKS$ make 
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- -C /mnt/ArchOL/lib/modules/3.7.2-2-  ARCH/build M=/home/anurag/HelloKS modules 
make[1]: Entering directory `/mnt/ArchOL/usr/src/linux-3.7.2-2-ARCH' 
    CC [M] /home/anurag/HelloKS/khello.o 
/bin/sh: scripts/basic/fixdep: cannot execute binary file 
make[2]: *** [/home/anurag/HelloKS/khello.o] Error 126 
make[1]: *** [_module_/home/anurag/HelloKS] Error 2 
make[1]: Leaving directory `/mnt/ArchOL/usr/src/linux-3.7.2-2-ARCH' 
make: *** [all] Error 2 

및 거기에 두었다. 커널 모듈을 다시 컴파일하려고 시도했을 때 스크립트 폴더 (이번에는 modpost)에서 다른 실행 파일에 대해 불평하는 유사한 오류가 발생했습니다.

제 질문은 어떻게 kernel-header/build 폴더에있는 arm 바이너리를 x86 버전으로 대체 할 수 있습니까? 이 작업을 수행하는 빌드 폴더에 스크립트가 있습니까? 복사 한 ArchLinux의 scripts 폴더를 우분투의 커널 모듈 빌드 폴더의 scripts 폴더로 바꿀 수 있습니까? 아니면 커널 모듈의 makefile을 수정하여 빌드 스크립트가 스크립트 폴더의 바이너리를 다시 빌드하도록하거나이 바이너리에 대해 다른 스크립트 폴더를 사용하여 커널 헤더 폴더에 우분투의 스크립트 폴더에 대한 경로를 지정합니까? 아니면 내가 잘못된 방향으로 가고 보드와 셋업을위한 크로스 컴파일을 설정하는 더 좋은 방법이 있습니까?

추신. FYI : 크로스 컴파일러는 libc 2.16을 사용하고 OLinuXino를위한 ArchLinux img는 libc 2.17을 가지고 있습니다.

+0

'.config' 파일을 저장하고 복사 된 디렉토리에'make distclean'을 사용하고 PC에서 커널을 교차 빌드하십시오. 그 후 모든 바이너리가 올바르게 설정되어야합니다. –

+0

내가 소스를 컴파일하기 위해 호스트의'scripts'를 (mount --bind를 통해) 성공적으로 사용했지만, 나중에'modpost'와 함께 이상한 오류가 발생했습니다 :'FATAL : section header offset = 11258999068426292 in file '/ ldata/DATA/src/rtl8192eu-linux-driver/8192eu.o '가 filesize = 1100031'보다 큽니다. – lilydjwg

+1

마침내 qemu-arm으로 modpost를 실행하여 작업하게 만들었습니다 :-) – lilydjwg

답변

1

커널 소스가없는 모듈을 커널 헤더와 함께 성공적으로 컴파일했습니다. gcc-libs 및 glibc에서 qemu 및 ARM 버전 라이브러리 파일을 사용했습니다.

mod/modpost 프로그램을 제외하고는 호스트의 scripts 디렉토리를 복사하여 ARM을 무시하십시오. mod/Makefile.modpost을 편집하여 modpost 프로그램을 qemu-arm과 함께 실행하십시오. 실제로 그 파일을 변경하고 싶지 않다면, 같은 목적을 위해 aufs/overlayfs/bind 마운트를 사용할 수 있습니다.

ARM 라이브러리 파일의 위치를 ​​QEMU_LD_PREFIX으로 설정하고 qemu-arm .../modpost가 실제로 작동하는지 확인하십시오. 그런 다음 시도한 것처럼 make을 실행하십시오.

중국어를 읽을 수 있으면 my experience here을 읽을 수 있습니다.

0

x86 용으로 컴파일하는 경우 커널 헤더 디렉토리를 /lib/modules/linux-3.7.2-2-ARCH/로 지정해야합니다 짓다. 크로스 컴파일을 위해 우리는 리눅스 소스를 다운로드하거나 SOC 제조업체가 제공 한 리눅스 소스를 사용합니다. 다운로드 된 Linux 소스의 커널 헤더가 컴파일을 위해 지정되어야합니다. 다운로드 한 리눅스 소스를/opt 디렉토리에 넣은 다음 샘플 "Makefile"을 다음과 같이 작성하십시오 : obj-m + = name-of-driver.o -C/opt/linux (정식 버전 지정) M = $ {PWD} 모듈. 교차 컴파일러를 설치하고 내보내기해야합니다. 예 : 내보내기 PATH = $ PATH :/교차 컴파일러 바이너리가있는 절대 경로. make 유틸리티를 사용하여 컴파일하는 동안 을 작성하면 ARCH = arm (컴파일 대상) CROSS_COMPILE = arm-none-linux-gnueabi-이됩니다. 이 모든 절차가 끝나면 타겟 용 커널 모듈을 성공적으로 컴파일 할 수 있습니다.

관련 문제