# 안드로이드 크로스 컴파일에 관해서
안드로이드에서 사용하는 크로스 컴파일러는
arm-linux-androideabi-gcc
apt-get install androideabi 를 이용해서 받을 수 있다.
android 컴파일러의 경우, bionic C를 사용하며, linker를
리눅스의 ld-linux.so 를 사용하는 것이아니라, linker를 사용한다.
--> 그렇기때문에 x86리눅스에서 컴파일된 파일은 ld-linux.so 에러를 보이며,
수많은 인터넷에 떠돌아다니는 x86프로그램들을 안드로이드에서 실행불가한 이유다.
readelf명령어로 컴파일된 파일을 확인해보면 linker부분을 확인할 수 있다.
기본적으로 arm-linux-eabi-gcc와 arm-linux-androideabi-gcc의 차이는
이 linker가 자동으로 설정 되느냐 안되느냐이다.
""와 hf 컴파일러가 다른데, 안드로이드의 경우 보통 ""를 사용하는 것으로 보인다.
> soft float, hard float
> arm-linux-androideabi-gcc의 경우 soft-float가 기본으로 되는 것으로 보임
컴파일러 옵션을 살펴보면, 다음과 같다.
눈여겨 봐야할 부분은 --with-float=soft 부분.. soft는 ""란 이야기.. hard는 hard-float를 지원한다는 이야기이다.
# arm-linux-androideabi-gcc -v
Using built-in specs.
COLLECT_GCC=arm-linux-androideabi-gcc
COLLECT_LTO_WRAPPER=/Prj/toolchain/bin/../libexec/gcc/arm-linux-androideabi/4.8/lto-wrapper
Target: arm-linux-androideabi
Configured with: /s/ndk-toolchain/src/build/../gcc/gcc-4.8/configure --prefix=/tmp/ndk-andrewhsieh/build/toolchain/prefix --target=arm-linux-androideabi --host=x86_64-linux-gnu --build=x86_64-linux-gnu --with-gnu-as --with-gnu-ld --enable-languages=c,c++ --with-gmp=/tmp/ndk-andrewhsieh/build/toolchain/temp-install --with-mpfr=/tmp/ndk-andrewhsieh/build/toolchain/temp-install --with-mpc=/tmp/ndk-andrewhsieh/build/toolchain/temp-install --with-cloog=/tmp/ndk-andrewhsieh/build/toolchain/temp-install --with-isl=/tmp/ndk-andrewhsieh/build/toolchain/temp-install --with-ppl=/tmp/ndk-andrewhsieh/build/toolchain/temp-install --disable-ppl-version-check --disable-cloog-version-check --disable-isl-version-check --enable-cloog-backend=isl --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --disable-libssp --enable-threads --disable-nls --disable-libmudflap --disable-libgomp --disable-libstdc__-v3 --disable-sjlj-exceptions --disable-shared --disable-tls --disable-libitm --
with-float=soft --with-fpu=vfp --with-arch=armv5te --enable-target-optspace --enable-initfini-array --disable-nls --prefix=/tmp/ndk-andrewhsieh/build/toolchain/prefix --with-sysroot=/tmp/ndk-andrewhsieh/build/toolchain/prefix/sysroot --with-binutils-version=2.25 --with-mpfr-version=3.1.1 --with-mpc-version=1.0.1 --with-gmp-version=5.0.5 --with-gcc-version=4.8 --with-gdb-version=7.7 --with-python=/usr/local/google/home/andrewhsieh/mydroid/ndk/prebuilt/linux-x86_64/bin/python-config.sh --with-gxx-include-dir=/tmp/ndk-andrewhsieh/build/toolchain/prefix/include/c++/4.8 --with-bugurl=http://source.android.com/source/report-bugs.html --enable-languages=c,c++ --disable-bootstrap --enable-plugins --enable-libgomp --enable-gnu-indirect-function --disable-libsanitizer --enable-gold --enable-threads --enable-graphite=yes --with-cloog-version=0.18.0 --with-isl-version=0.11.1 --enable-eh-frame-hdr-for-static --with-arch=armv5te --program-transform-name='s&^&arm-linux-androideabi-&' --enable-gold=default
Thread model: posix
gcc version 4.8 (GCC)
# 안드로이드에서 사용하기위해 컴파일을 했으나 segmentation fault가 나는 경우.
readelf로 파일을 확인하면, linker는 제대로 들어갔으나, segmentation fault가 나오는경우가 있다.