2013-02-01 1 views
0

나는 커널을 2.6.18을 기반으로 하드웨어 벤더에 의해 수정 된 커널을 가지고있다. MIPS arch에 최신 버전의 uClibc를 사용하여 새로운 도구 체인을 생성해야합니다.커스텀 리눅스 용 C 툴체인을 계승하는 데 문제가있다.

프로세스를 쉽게하기 위해 crosstool-ng 도구를 선택했지만 생성 프로세스 중에 오류가 발생했습니다. 다음은 오류 부분의 로그입니다.

[INFO ] ================================================================= 
[INFO ] Installing kernel headers 
[DEBUG] Using kernel's headers_install 
[EXTRA] Installing kernel headers 
[DEBUG] ==> Executing: 'make' '-C' '/home/myuser/sources/custom-linux/toolchain/.build/src/linux-custom' 'O=/home/myuser/sources/custom-linux/toolchain/.build/mipsel-unknown-linux-uclibc/build/build-kernel-headers' 'ARCH=mips' 'INSTALL_HDR_PATH=/home/myuser/x-tools/mipsel-unknown-linux-uclibc/mipsel-unknown-linux-uclibc/sysroot/usr' 'V=0' 'headers_install' 
[ALL ] make[1]: Entering directory `/home/myuser/sources/custom-linux/stblinux-2.6.18' 
[ALL ]  CHK  include/linux/version.h 
[ALL ]  UPD  include/linux/version.h 
[ALL ] *** Error: Headers not exportable for this architecture (mips) 
[ERROR] make[2]: *** [headers_install] Error 1 
[ERROR] make[1]: *** [headers_install] Error 2 
[ALL ] make[1]: Leaving directory `/home/myuser/sources/custom-linux/stblinux-2.6.18' 
[ERROR] 
[ERROR] >> 
[ERROR] >> Build failed in step 'Installing kernel headers' 
[ERROR] >>  called in step '(top-level)' 
[ERROR] >> 
[ERROR] >> Error happened in: CT_DoExecLog[scripts/[email protected]] 
[ERROR] >>  called from: do_kernel_install[scripts/build/kernel/[email protected]] 
[ERROR] >>  called from: do_kernel_headers[scripts/build/kernel/[email protected]] 
[ERROR] >>  called from: main[scripts/[email protected]] 
[ERROR] >> 
[ERROR] >> For more info on this error, look at the file: 'build.log' 
[ERROR] >> There is a list of known issues, some with workarounds, in: 
[ERROR] >>  '/home/myuser/.local/share/doc/crosstool-ng/ct-ng.hg+default-20f2459b97bf/B - Known issues.txt' 
[ERROR] 
[ERROR] (elapsed: 41:41.63) 

문제는 * headers_install * 규칙과 관련이있는 것 같습니다. 커널의 특정 버전이 도입 된 것 같습니다. 재미있는 사실은 내가 실행하면

make ARCH=mips INSTALL_HDR_PATH=... headers_install 

헤더가 잘 설치된다는 것입니다. 이 문제는 O = 매개 변수 사용시 발생하는 것으로 보입니다. 아무도 그것을 위해 무엇을 알고 있습니까? 이 문제에 대한 해결 방법이 있습니까?

+0

1. 두 번째 make를 사용할 때 headers_install 규칙이 실행됩니까? –

+0

2. * mipsel-unknown-linux-uclibc *는 조사할만한 가치가있는 것 같습니다. 빌드 툴을 통해 무언가가 ** 알려지지 않았다고 주장 될 때 나는 항상 재미있게 느낍니다. –

+0

@ MarkLeightonFisher 예. – ivarec

답변

0

headers_install 규칙이이 Linux 커널 버전에 존재하지 않는 것이 문제였습니다. 그것은 2.6.19.1에 포함 :

현대 리눅스 커널 (2.6.19.1 및 최신 기준) 수출 커널에게 "할 headers_install"명령을 통해 헤더를. buildroot이 규칙이 존재하는 것으로 예상 https://www.kernel.org/doc/index-old.html#3.2.2.3.1

때문에, 나는 그것이 사용자 정의 패치없이 작동하지 않습니다 추측에는 요.

0

크로스 컴파일러/binutils를 빌드하는 것은 종종 매우 어려우며 프로그램을 테스트 할 수 없습니다.
가상 시스템은 매우 느리고 호스트와 VM간에 파일을 공유하기가 힘들어집니다.

가장 쉬운 해결책은 Qemu-User-static입니다. 시스템 호출과 명령어는 사용자 모드에서 기본 커널로 래핑됩니다.

rootfs를 다운로드하거나 압축을 해제하십시오.
실제 루트 디렉토리의 하위 폴더에 복사하십시오.
qemu-user- (mips 아치의 이름) - 대상 디렉토리의 루트에 고정.
/etc/resolv.conf를 /your_path_to_target/etc/resolv.conf에 복사하십시오. /bin/bash를 실행하여 Chroot를 복사하십시오.
실제 mips 기반을 사용하는 것처럼 rootfs를 사용하십시오. 기계.

상황이 매우 간단 해졌습니다. 많은 라이브러리가 하드 코딩 된 경로 과 같이 컴파일되지 않습니다 (크로스 컴파일과 같이 많은 문제가 발생할 수 있음). 여기에 모두 네이티브 패키지를 만드는 것처럼 일어납니다.