IT 주제, 특히 리눅스를 다룹니다.

Posted
Filed under Android

간단히 적어 놓고, 나중에 다듬도록 하겠다. 우선 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을 사용하여 빌드를 시작한다.

  1. 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

  1. 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 이 뭔지도 감이 안잡히고. 이렇게 해봤자 관련 라이브러리가 모두 포팅되어있지 않으면 내가 원하는 바는 이룰 수 없을 듯.

2016/03/20 20:06 2016/03/20 20:06

IT 주제, 특히 리눅스를 다룹니다.

IT 주제, 특히 리눅스를 다룹니다.

IT 주제, 특히 리눅스를 다룹니다.

IT 주제, 특히 리눅스를 다룹니다.

IT 주제, 특히 리눅스를 다룹니다.

IT 주제, 특히 리눅스를 다룹니다.

IT 주제, 특히 리눅스를 다룹니다.

IT 주제, 특히 리눅스를 다룹니다.

IT 주제, 특히 리눅스를 다룹니다.