Gentoo Cross Toolchain hotwo: Difference between revisions

From 흡혈양파의 인터넷工房
Jump to navigation Jump to search
(링크 오류 수정)
 
(No difference)

Latest revision as of 04:12, 20 February 2016

Gentoo linux 64bit system에서 arm용 cross toolchain(until gcc) HOWTO

작성자 : 새벽녘의 흡혈양파

prescript

  1. 이 문서는 falinux 에서 판매하는 EZ-X5용 툴체인을 빌드하려하는 사람들을 대상으로한 기초문서입니다.
  2. 대상을 EZ-X5로 하고있는 이유는 kernel때문에 그렇습니다. 결과적으로 다른 커널을 사용하시는 경우에도 커널만 맞춰주신다면 별도의 문제가 없을것으로 생각됩니다.
  3. 환경 및 디렉토리는 제가 빌드하는 환경을 기준으로 설명합니다. 추가적인 질문사항은 gentoo kr의 게시판인 이곳 으로 부탁드립니다.
  4. 환경이 저와 틀린경우 문서의 내용을 100% 보장하지는 않습니다.
  5. 결과적으로 제대로 설명을 해주신 한글문서가 제가 찾았을때는 없는거같아서 만듭니다...-.-;


reuqire

  1. host : gentoo 64 bit system (다른 linux도 상관은 없을거같지만)
  2. files
    • binutils-2.20.1.tar.bz2
    • gcc-4.4.4.tar.bz2
    • glibc-2.11.2.tar.bz2
    • glibc-ports-2.11.tar.bz2
  3. 그외 몇개의 patch
  4. 그리고 rar프로그램 (emerge rar로 손쉽게 설치할 수 있습니다)


위의 파일과 관련된 path들은 아래의 link를 누르시면 받으실 수 있습니다.

http://onionmixer.net/~onion/embedded/ez-x5_crosstoolchain.rar


prebuild

이 문서는 다음과 같은 환경을 기준으로 설명됩니다

export XTARGET=arm-unknown-linux-gnueabi 
export XBUILDROOT=/mnt/compile/compile_source/embedded/
export XBUILDSRC=/mnt/compile/compile_source/embedded/src/


  • XTARGET
    • 자신이 cross compile을 하려는 대상환경을 설정
  • XBUILDROOT
    • cross compile환경이 들어갈 build root
  • XBUILDSRC
    • 빌드하는 소스들이 들어있는 디렉토리. Kernel source등이 위치합니다.


그리고 $XBUILDROOT/bin 을 현재 사용하는 계정의 PATH에 추가를 해주시면 됩니다. 저는 ~/.bashrc에 넣었습니다.


Build Phase

kernel unpack

위의 관련파일 압축을 다운로드 받아서 해제하시면 여러개의 파일이 있습니다.

그중 ez-x5_kernel_2.6.rar의 압축을 해제하셔서 그 안에 있는 linux-2.6.21.tar.gz 파일의 압축을 해제합니다


결과물인 linux-2.6.21 디렉토리를 $XBUILDSRC로 옮긴다음 linux라는 이름으로 심볼릭링크를 걸어줍니다. 이후 linux폴더로 들어가서 다음의 명령을 실행합니다. (물론 문제가 있는경우에는 make distclean.. 아시죠?)

make ARCH=arm menuconfig 

make


위의 과정을 진행한후 에러와 상관없이 include/linux/version.h 파일이 생겼는지를 확인합니다


파일이 생성되었는지를 확인하면 toolchain build을 하기위한 kernel 준비는 종료입니다.


binutils

소스 구해서 압축풀고 아래대로 진행해주시면 됩니다. 저도 자세한건 뭔뜻인지 잘....(먼산)

mkdir buildx ; cd buildx 

../configure --host=x86_64-pc-linux-gnu --target=arm-unknown-linux-gnueabi --prefix=/mnt/compile/compile_source/embedded/ --enable-64-bit-bfd 

make ; make install

이렇게 설치가 진행되면 binutils 준비는 끝이 납니다. 아마도 make install까지 하게되면 $XBUILDROOT에는 디음과같은 디렉토리들이 있을겁니다.

  • 이녀석과
    • arm-unknown-linux-gnueabi
  • 떨거지들
    • include
    • lib
    • libexec
    • bin
    • info
    • lib64
    • man
    • share


arm.. 으로 시작하는 디렉토리는 arm에서 실행가능한 바이너리들이 들어가고, 그외 디렉토리에는 HOST머신에서 실행가능한 cross compiler들이 들어갑니다. 이후 참고하시면 되겠습니다.


gcc bootstrap

gcc에서 bootstrap이라는것은 gentoo의 그것과 기본적인 의미가 같습니다. 이 이후의 작업을 준비하기 위해서 가장 기본적인 compiler를 준비하는 과정입니다. 여기서 준비되는 gcc는 오직 c compiler하나밖에 없습니다.


Bootstrap compiler는 다음과 같은 과정으로 준비합니다.


  1. gcc의 source를 unpack합니다.
  2. 그리고 소스 압축을 해제한 디렉토리로 이동합니다.
  3. 아래의 명령을 실행시켜줍니다.
perl -pi -e 's/^(TARGET_LIBGCC2_CFLAGS.*)/$1 -Dinhibit_libc -D__gthr_posix_h/' gcc/config/arm/t-linux 

echo 'T_CFLAGS = -Dinhibit_libc -D__gthr_posix_h' >> gcc/config/arm/t-linux


그리고 첨부파일안에 있는 다음의 패치를 적용시켜줍니다.

cat ../gcc-4.4.x-use-embedded.patch | patch -p1


패치의 적용이 무사이 끝났으면 아래의 명령어로설치를 진행하도록 합니다.

mkdir buildx ; cd buildx 

../configure --target=arm-unknown-linux-gnueabi --prefix=/mnt/compile/compile_source/embedded --disable-multilib --with-newlib --disable-nls --disable-threads --enable-symvers=gnu --enable-__cxa_atexit --enable-languages=c --disable-shared --with-float=soft --enable-cxx-flags=-msoft-float --without-headers --disable-libmudflap --disable-libssp --disable-libgomp 

make ; make install


이렇게 gcc가 설치되되면 이미 path가 추가되어있을테니 간단하게 테스트를 해보도록 할까요?

./arm-unknown-linux-gnueabi-gcc 
arm-unknown-linux-gnueabi-gcc: no input files

이렇게 나오면 glibc를 위한 bootstrap compiler의 준비가 끝나게 됩니다.


arm glibc compile

지금부터는 target platform(이하 arm이라고 하겠습니다)을 위한 glibc compile을 진행해보도록 하겠습니다.

일단 glibc소스를 준비합니다. 그리고 압축해제를 진행합니다. 아래의 내용대로 압축해제를 한후 관련된 디렉토리의 후처리를 진행하도록 합니다.

mv glibc-ports-2.11.2 ./glibc-2.11.2 

mv glibc-2.11.2/glibc-ports-2.11.2 glibc-2.11.2/ports


glibc의 소스가 풀려있는 디렉토리 내에서 patch를 진행하도록 합니다.

cd glibc-2.11.2 
cat ../6020_all_alpha-floor_ceil_fix.patch | patch -p0


패치를 적용한후 Makeconfig에서 -lgcc_eh 라고 되어있는 문자열을 제거합니다. 아마도 2곳정도 될겁니다. 이건 glibc의 버전마다 틀린듯하니 참고해주세요.

mkdir buildx ; cd buildx


glibc configure 를 진행하기전에 아래의 2줄을 console에서 진행합니다.

echo "libc_cv_forced_unwind=yes" > config.cache 
echo "libc_cv_c_cleanup=yes"    >> config.cache


이제 glibc의 build 및 설치를 진행합니다

../configure --prefix=/mnt/compile/compile_source/embedded/arm-unknown-linux-gnueabi/ --host=arm-unknown-linux-gnueabi --without-cvs --disable-profile --disable-debug --without-gd --enable-shared --enable-add-ons=ports,nptl --with-headers=/mnt/compile/compile_source/embedded/src/linux/include --with-tls --with-__thread  --disable-sanity-checks --cache-file=config.cache 

make ; make install


보시면 알겠지만 glibc는 그 자체로 무언가를 만들어내는게 아니기때문에 별도로 target이 지정되지 않습니다. 그리고 실제 arm에서 사용될것이기때문에 당연히 $XBUILDROOT/arm-unknown-linux-gnueabi/ 안쪽으로 내용들이 설치되게 됩니다.

configure를 잡으실때는 --with-headers쪽을 잘 참고해주세요. Kernel source의 include디렉토리를 정확하게 지정해주셔야 합니다.


target platform용 gcc cross compiler full build

위의 gcc가 c compiler만 있는 glibc를 위한 상태라면 지금 빌드하는것은 위에서 만들어진 glibc와 kernel source를 이용해서 실제 arm용 binary를 만들어낼 수 있는 compiler를 만드는 과정입니다.


이 과정에서 별도의 patch는 적용할 필요가 없습니다. (특정플랫폼용 버그가 있는경우는 예외가 되겠습니다만)

gcc source의 압축을 해제합니다. 다만 위쪽에서 만든 gcc의 source와 섞일 수 있는 가능성이 있기때문에 bootstrap gcc 디렉토리의 이름을 다른이름으로 변경하도록 합니다.


디렉토리 정리 및 압축해제가 끝나면 아래의 명령어로 gcc 빌드를 진행합니다.

mkdir buildx ; cd buildx 

../configure --target=arm-unknown-linux-gnueabi --prefix=/mnt/compile/compile_source/embedded/ --disable-nls --enable-__cxa_atexit --enable-languages=c,c++,fortran,objc --enable-c99 --enable-long-long --enable-shared --enable-multilib --with-float=soft --enable-cxx-flags=-msoft-float –with-headers=/mnt/compile/compile_source/embedded/src/linux/include/

make ; make install


이상으로 가장 기본적인 toolchain의 빌드가 종료되었습니다.


toolchain의 기본 테스트

제대로 toolchain이 빌드되었는지 확인하기위해서 다음의 명령어를 진행해 보도록 합니다.

echo "int main() {return 0;}" > test.c 
arm-unknown-linux-gnueabi-gcc test.c -o test.bin


test.bin이라는 파일이 나오면 성공입니다. 이 파일을 file이라는 명령어를 통해서 상태를 점검해보도록 하겠습니다.

file test.bin 
test.bin: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped


자! 이로서 intel에서는 실행될 수 없는 arm용 바이너리를 PC에서 만들 수 있었습니다. 이외에 더 진행해야될 부분들이 많겠습니다만... toolchain에 대한 기본적인 내용은 이것으로 준비가 되는 것이기 때문에 이 글은 여기서 마치도록 하겠습니다.


참고문서