Android QEMU용 Kernel을 (Mac에서) 빌드하는 법

http://source.android.com/source/building-kernels.html

Google 문서를 참고하였으나 오늘 날짜 상태와 맞지않는 부분이 있고 또한, Mac OS X Mountain Lion에서 빌드하다보니 다른 점이 있어 정리해본다.

다른점 1. QEMU 에뮬을 위한 커널 소스코드 가져오기

1) git clone https://android.googlesource.com/kernel/goldfish.git kernel-goldfish
2) cd kernel-goldfish/
3) git checkout origin/android-goldfish-3.4

3번 과정은 오늘 날짜 기준이므로 나중에 더 최신 버전의 Kernel로 바뀔 수 있다. 이 경우 git branch -a로 가능한 branch 목록을 확인해서 원하는 것으로 고르자.

다른점 2. Cross compile을 위한 toolchain path

android-build/prebuilts/gcc/darwin-x86/arm/arm-linux-androideabi-4.7/bin 를 PATH에 지정해준다.

다른점 3. libelf 설치 필요

MacPort를 이용하여 libelf를 설치한다. 또한, http://plattanimattan.blogspot.kr/2010/04/cross-compiling-linux-on-mac-osx.html 문서를 참고해서 elf.h 파일을 만든다. 참고로 libelf를 설치하면 헤더 파일은 /opt/local/include/libelf 폴더안에 있다.

다른점 4. 위 libelf 관련 문서에서 알려준 것 외에 아래 #define을 elf.h 파일 맨 처음에 추가해준다.

#define __LIBELF64 1
#define __LIBELF_INTERNAL__ 1

UPDATE: 
make ARCH=arm SUBARCH=arm CROSS_COMPILE=arm-linux-androideabi- menuconfig를 실행하여 System Type / Goldfish Options를 Goldfish ARMv7으로 변경해준다. 현재 Android의 ARM QEMU에 Coretex-a8을 CPU type으로 사용하고 있어 ARMv7으로 변경해주지 않으면 부팅이 안된다.

다른점 5. 최종 Linux Kernel을 빌드하기 위한 명령은 아래와 같이 입력한다.
make ARCH=arm SUBARCH=arm CROSS_COMPILE=arm-linux-androideabi- HOSTCFLAGS="-I/opt/local/include/libelf -I."

글쓰는 중 빌드가 완료되었다! 이제 내가 빌드한 커널 이미지로 에뮬레이터를 돌려봐야지. Android 소스를 직접 빌드하였다면 아래와 같이 실행할 수 있다.

./out/host/darwin-x86/bin/emulator-arm -sysdir ./out/target/product/generic/ -kernel ./<your kernel source>/arch/arm/boot/zImage -show-kernel -verbose

혹시, gdb로 디버깅이 필요하다면

./out/host/darwin-x86/bin/emulator-arm -sysdir ./out/target/product/generic/ -kernel ./<your kernel source>/arch/arm/boot/zImage -show-kernel -verbose -qemu -s -S

로 실행한 후 아래와 같이 gdb를 실행한다.

./prebuilts/gcc/darwin-x86/arm/arm-linux-androideabi-4.7/bin/arm-linux-androideabi-gdb

그런 후 target remote :1234 명령으로 gdb 서버에 연결하고 file ./<your kernel source>/vmlinux로 심볼을 로드할 수 있다.

댓글

이 블로그의 인기 게시물

Wireless: HotSpot 2.0 이란?

Apple M1 Mac Mini에서 이더리움 (Ethereum) 채굴하기

Java: Java for Game? Java가 Game 개발에 어울릴까?