간단히 적어 놓고, 나중에 다듬도록 하겠다. 우선 target에 맞는 android ndk의 standalone toolchain 이 가장 간편한 듯 하다. 현재 ndk는 r11b 버전까지 릴리즈 되어 있다. 다운로드 후 아래 가이드의 Advanced method를 참고하자.
http://developer.android.com/ndk/guides/standalone_toolchain.html
난 Android 6.0.1 x86용 Native compiler를 생성하고 싶기 때문에, API level 23을 옵션으로 줘야한다.
$NDK/build/tools/make-standalone-toolchain.sh \ --arch=x86 --platform=android-23 --install-dir=/tmp/my-android-toolchain \ --toolchain=x86-linux-android-4.9
지정된 설치 디렉토리에 standalone toolchain이 복사되었을 것이다. 해당 디렉토리를 편의 상 $NDK 변수로, 그 아래의 sysroot 디렉토리를 편의 상 $SYSROOT 로 지정한다.
export NDK=/tmp/my-android-toolchain export SYSROOT=$NDK/sysroot
Native compiler를 빌드하는 작업은 기본적으로 Cross-compile 이다. 아래 가이드를 참고하면 비교적 쉽게 진행할 수 있다.
http://wiki.osdev.org/GCC_Cross-Compiler
가이드를 따라 gcc 빌드에 필요한 mpc, mpfr, gmp 소스를 받아 gcc 디렉토리에 넣어주어야 한다.
빌드하기 전 아래 변수들도 설정한다. Android 6.0 이상에서는 PIE binary만 실행 가능하기 때문에, 관련 -fPIE, -pie 등의 CFLAGS, CXXFLAGS, LDFLAGS를 설정해야 한다.
export PREFIX=$HOME/android-x86/build_toolchain/out export TARGET=i686-linux-android export PATH=$PREFIX/bin:$NDK/bin:$PATH export CC=i686-linux-android-gcc export CFLAGS="-fPIE" export CXX=i686-linux-android-g++ export CXXFLAGS="$CFLAGS" export LDFLAGS="-pie"
이제 standalone toolchain을 사용하여 빌드를 시작한다.
- binutils 빌드하기
mkdir build-binutils cd build-binutils ../binutils-x.y.z/configure --target=$TARGET --prefix="$PREFIX" --with-sysroot --disable-nls --disable-werror make make install
- gcc 빌드하기
mkdir build-gcc cd build-gcc ../gcc-x.y.z/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --enable-languages=c,c++ --without-headers --with-sysroot=$SYSROOT make all-gcc make all-target-libgcc make install-gcc make install-target-libgcc
이제 $PREFIX 디렉토리에 빌드 완료된 파일들을 tar 로 묶어 안드로이드로 옮겨보자. $SYSROOT 디렉토리의 파일들도 함께 묶는다.
결과는???
안드로이드 내에서 Hello World 코드를 작성해서 아래와 같이 빌드해보았다. 간단히 alias 를 잡아준다. (gcc 설치 경로는 /system/gcc 이다) alias cc='/system/gcc/bin/gcc -I/system/gcc/include -fPIE -pie' cc hello.c -o hello
자.. 실행해보면,
Hello World
잘 출력된다.
다만.. 아직 bionic 이 뭔지도 감이 안잡히고. 이렇게 해봤자 관련 라이브러리가 모두 포팅되어있지 않으면 내가 원하는 바는 이룰 수 없을 듯.