티스토리 뷰

이 포스트에서는 Linaro 툴체인을 이용하여 플랫폼을 빌드하는 방법을 소개할 것입니다.

준비 사항은 4.6, 4.7버전의 Linaro 툴체인입니다.

Target 장치의 프로세서는 ARM이며 이 글에서는 E980 (LG Optimus G Pro)를 기준으로 작성했습니다.

Build 장치의 프로세서는 x86, 64비트 Linux를 사용하고 있습니다.


우선, 준비된 컴파일러를 (플랫폼 소스 최상단)/prebuilts/gcc/linux-x86/arm에 기존과 같은 이름으로 복사 또는 symlink 합니다. 기존: arm-eabi-(버전), arm-linux-androideabi-(버전)

Target 장치에 대한 소스 컴파일을 준비합니다. (lunch, breakfast 등등)

이후, 소스 전체 컴파일에 앞서서 커널을 먼저 컴파일하여 오류의 유무를 확인합니다.

오류가 존재하지 않는다면 플랫폼도 빌드하면 됩니다.

커널 컴파일시 존재하지 않았던 오류 중 플랫폼에서 나타날 수 있는 오류는, Linaro에서 지원하지 않는 '-fuse-ld'라는 옵션이 사용되어 unrecognized option이 발생합니다.

이때 두가지 해결방법이 존재합니다. 양쪽 모두 약간의 소스수정이 필요하지만 간단히 해당옵션을 삭제하는 방법으로 진행하시는게 편합니다. 플랫폼 소스 최상단에서,

  $ find . -name "*.mk" -type f | sed -i 's/-fuse-ld=gold//g'

를 실행하시면 모든 mk파일에서 해당 CFLAG가 삭제됩니다.

Linaro 툴체인으로 컴파일이 문제없이 진행되었고 정말 Linaro 툴체인으로 정상적인 컴파일이 완료되었나 확인하기 위해서는 출력 경로로 이동하여,

  $ strings obj/STATIC_LIBRARIES/liblog_intermediates/logprint.o | grep GCC

결과가 'GCC: (Linaro …'면 성공한 것 입니다.

만약 커널 컴파일중 unknown CPU architecture 오류가 발생한다면, Linaro 4.7 툴체인만 아래 링크에서 제공되는 것으로 시도해보세요.

https://github.com/nodeal/linaro-4.7-modifed

이 툴체인으로 컴파일이 성공하더라도 플랫폼 컴파일 마지막 LD 작동중 mmap이 메모리할당에 실패(failed to allocate bytes for output file cannot allocate memory)할 수 있습니다. 이는 램 또는 swap의 문제일 수도 있지만, LD의 문제일 가능성이 큽니다. 기존 unknown CPU architecture라는 오류를 내던 툴체인에서 (툴체인 경로 최상단)/libexec/(GCC 버전)/real-ld 를 가져와 덮어씌운 후 시도해보세요.


이처럼 플랫폼 소스를 컴파일하기 위한 Linaro로의 교체만은 간단하지만 그에 따르는 코드 버그 픽스가 기다리고 있습니다. 물론 기존 Google GCC로의 컴파일 후 결과물로는 부팅이 되더라도 Linaro GCC로 컴파일하고 부팅되지 않을 수도 있습니다.




'Android' 카테고리의 다른 글

[HOWTO] Linaro Android Platform Build  (0) 2014.10.24
Android 플랫폼을 빌드해보자  (0) 2013.12.31
댓글
댓글쓰기 폼