======================================================================
HOST 시스템 환경
autoconf 2.13
automake 1.11.1
texinfo-4.6
GCC : 4.1.3 or 4.4.3 (sudo apt-get install gcc-4.1)
gettext (sudo apt-get install gettext)
gawk (sudo apt-get install gawk)

======================================================================
BUILD 시스템 build_root 설정
export XTARGET=arm-linux  or  export XTARGET=arm-unknown-linux-gnueabi
export XBUILDSRC=path/to/src/root ($HOME/workspace/x-tool/src)
export XBUILDROOT=path/to/build-install/root ($HOME/workspace/x-tool/usr)
======================================================================

[[[[[ KERNEL HEADER or KERNEL LIBC HEADER ]]]]] - linux-2.6.25이후, chipset별 header 위치가 다름.
glibc를 빌드할때 include/asm-$ARCH(asm), include/asm-generic, include/linux 폴더의 헤더가 필요함
cd $XSRCROOT
w get ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.25.tar.gz
tar xzvf linux-2.6.25.tar.gz
ln -s linux-2.6.25 linux

-----------------------------------------------------------------
Kernel Config.
arm.config or eabi_arm.config



mv arm.config $XBUILDSRC/linux/.config
// config 중, system type, architecture를 확인해야 한다.
cd linux
make ARCH=arm menuconfig or make ARCH=arm oldconfig
-----------------------------------------------------------------
or
// config 중, system type, architecture를 확인해야 한다.
make ARCH=arm versatile_defconfig
make ARCH=arm menuconfig
-----------------------------------------------------------------

// toolchain이 참조할 헤더 구조를 만들어준다.
make ARCH=arm include/asm include/linux/version.h include/asm-arm/.arch
==> 이후 버전의 리눅스 커널은 headers_install 명령을 사용하면 되는데 참조할 헤더의 위치는 지정(INSTALL_HDR_DIR??)할 수도 있고 default로 linux/usr/include 일 것이다.
(make ARCH=arm headers_install)

#cd include
#ln -s asm-arm asm
======================================================================

cd $XBUILDSRC
[[[[[ BINUTIL ]]]]] - binutil-2.19.1
w get ftp://ftp.gnu.org/gnu/binutils/binutils-2.19.1.tar.gz
tar xzvf binutils-2.19.1.tar.gz
- ARM 패치
binutils-2.19.arm.patch



cd binutil-2.19.1
cat ../binutils-2.19.arm.patch | patch -p1
mkdir buildx & cd buildx
../configure --target=$XTARGET --prefix=$XBUILDROOT
make & make install

// lib 링크 변경
cd $XBUILDROOT/$XTARGET
mv lib lib.bak
ln ../lib lib
==> 이거 안하면 GCC cross-compiler 빌드시에 glibc 라이브러리를 못찾음

## 추가사항
[2011.06.30]
- 2.21버전에는 위의 arm patch가 들어가 있음
- gas/config/tc-arm.c : 'firsttype$defined' may be used uninitialized in this function ==> configure 옵션에 --diasble-werror 추가해서 임시 처리함


======================================================================

[[[[[ BOOTSTRAP GCC ]]]]] - gcc-4.4.3
cd $XBUILDSRC
w get ftp://ftp.gnu.org/gnu/gcc/gcc-4.4.3/gcc-4.4.3.tar.gz
tar xzvf gcc-4.4.3.tar.gz
mv gcc-4.4.3 gcc-4.4.3-bootstrap
cd gcc-4.4.3-bootstrap
// gcc source modify
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

// bootstrap gcc configure
gccpatch_libgcc_mvars.patch



cat ../gccpatch_libgcc-mvars.patch | patch -p0

gccpatch_130-cross-compile.patch



cat ../gccpatch_130-cross-compile.patch | patch -p1

gcc4.x 빌드를 위해 GMP, MPFR이 필요함
sudo apt-get install libgmp3-dev
sudo apt-get install libmpfr-dev

mkdir buildx & cd buildx

// arm-linux
../configure --target=$XTARGET --prefix=$XBUILDROOT --disable-multilib --with-newlib --disable-nls --disable-threads --enable-symvers=gnu --enable-__cxa_atexit --enable-languages=c --disable-shared --without-headers --disable-libmudflap --disable-libssp --disable-libgomp

or

// arm-eabi
../configure --target=$XTARGET --prefix=$XBUILDROOT --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

## 추가사항
[2011.06.30]
- 4.6.0 버전 : sudo apt-get install libmpc-dev
                     --disable-libquadmath : GCC_EXECUTABLE 어쩌고 에러

======================================================================

[[[[[ GLIBC ]]]]] - glibc-2.10.1, glibc-ports-2.10.1
cd $XBUILDSRC
w get ftp://ftp.gnu.org/gnu/glibc/glibc-2.10.1.tar.gz
w get ftp://ftp.gnu.org/gnu/glibc/glibc-ports-2.10.1.tar.gz

mv glibc-ports-2.10.1 ./glibc-2.10.1
mv glibc-2.10.1/glibc-ports-2.10.1 glibc-2.10.1/ports

cd glibc-2.10.1
Makeconfig에서 -lgcc_eh 부분 제거

export PATH=$XBUILDROOT/bin:$PATH

mkdir buildx & cd buildx
// glibc configure
echo "libc_cv_forced_unwind=yes" > config.cache
echo "libc_cv_c_cleanup=yes"    >> config.cache

##추가사항
[2011.06.30]
(glibc-2.13 테스트) echo "libc_cv_asm_cfi_directive_sections=yes" >> config.cache

//arm-linux
CC=$XTARGET-gcc AR=$XTARGET-ar RANLIB=$XTARGET-ranlib ../configure --prefix=$XBUILDROOT --build=i686-pc-linux-gnu --host=$XTARGET --without-cvs --disable-profile --disable-debug --without-gd --enable-shared --enable-add-ons=ports,nptl --with-headers=$XBUILDSRC/linux/include --includedir=$XBUILDROOT/$XTARGET/include --disable-sanity-checks --cache-file=config.cache

or

//arm-eabi
CC=$XTARGET-gcc AR=$XTARGET-ar RANLIB=$XTARGET-ranlib ../configure --prefix=$XBUILDROOT --build=i686-pc-linux-gnu --host=$XTARGET --without-cvs --disable-profile --disable-debug --without-gd --enable-shared --enable-add-ons=ports,nptl --with-headers=$XBUILDSRC/linux/usr/include --with-tls --with-__thread --includedir=$XBUILDROOT/$XTARGET/include --disable-sanity-checks --cache-file=config.cache

make & make install


## 추가사항
[2011.06.30]
2.13버전 컴파일시에 .cfi_sections 관련 에러 ==> http://www.uclibc.org/downloads/ChangeLog-0.9.31_0.9.32
신규 pseudo op를 지원하지 않는 binutil을 사용하면 에러(ex.cfi_section)나므로 최신 binutil을 사용할 것



======================================================================

[[[[[ GCC CROSS COMPILER ]]]]]
cd $XBUILDSRC
w get ftp://ftp.gnu.org/gnu/gcc/gcc-4.4.3/gcc-4.4.3.tar.gz
tar xzvf gcc-4.4.3.tar.gz
mv gcc-4.4.3 gcc-4.4.3-cross
cd gcc-4.4.3-cross
mkdir buildx & cd buildx
// gcc configure

//arm-linux
../configure --target=$XTARGET --prefix=$XBUILDROOT --disable-nls --enable-__cxa_atexit --enable-languages=c,c++,fortran,objc --enable-c99 --enable-long-long --enable-shared --enable-multilib --with-headers=$XBUILDSRC/linux/include

or

//arm-eabi
../configure --target=$XTARGET --prefix=$XBUILDROOT --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=$XBUILDSRC/linux/usr/include

gcc의 --with-header configure 옵션은 해당 경로의 헤더를 prefix/target 하위의 sys-include 폴더($XBUILDROOT/$XTARGET/sys-include)를 생성하고 거기에 복사하도록 작동한다

make & make install

## 추가사항
[2011.07.04]
4.6.1버전 - --with-system-zlib configure 추가


Toolchain을 이용해 컴파일 시, 실제 타겟 architecture에 맞게 컴파일 옵션을 주어야한다.
==> 참조문서
ex. $XTARGET-gcc -march=armv6k -o hello hello.c




2010/08/31 18:31 2010/08/31 18:31
Posted by scott

트랙백 주소 :: 이 글에는 트랙백을 보낼 수 없습니다

댓글을 달아 주세요

  1. scott 2010/09/29 18:05  댓글주소  수정/삭제  댓글쓰기

    linux-2.6.25(?) 이후부터 소스트리 구조가 변경된 듯 하여 glibc와 gcc를 컴파일할 때 필요한 헤더 merge를 위해 아래의 명령을 사용한다.
    make ARCH=arm headers_install
    그러면 asm / architecture 포함 관련 헤더가 linux-x.x.x/usr/include 하위에 복사되며, glibc와 gcc를 빌드할 때 해당 경로를 참조하도록 configure 옵션을 수정해주면 된다

  2. scott 2010/09/29 18:12  댓글주소  수정/삭제  댓글쓰기

    최종 gcc를 빌드하는 과정에서 glibc의 헤더를 찾는 위치가 $XBUILDROOT/include가 아닌 현상이 있는데 원인을 못찾고 있음.
    대신 $XBUILDROOT/$XTARGET/include를 찾으므로 간단하게 symbolic link를 걸어서 임시 해결함

  3. scott 2010/10/26 11:40  댓글주소  수정/삭제  댓글쓰기

    gcc-4.5.1을 사용할 때는 libmpfr, libmpc, libgmp 등의 디펜던시가 있다.
    w get http://www.multiprecision.org/mpc/download/mpc-0.8.2.tar.gz
    w get http://www.mpfr.org/mpfr-current/mpfr-3.0.0.tar.gz
    w get ftp://ftp.gmplib.org/pub/gmp-5.0.1/gmp-5.0.1.tar.bz2

    - bootstrap 빌드시
    각 소스를 gcc 소스 디렉토리 하위로 압축해제하고 gcc configure option에 아래 option을 추가한다
    --with-gmp-include=$(pwd)/gmpdir --with-gmp-lib=$(pwd)/gmpdir/.libs

    - toolchain 빌드시
    gmp : configure --prefix=$XBUILDROOT --enable-mpbsd
    mpfr : LDFLAGS="-Wl,-rpath,$XBUILDROOT/lib" configure --prefix=$XBUILDROOT --enable-shared --with-gmp=$XBUILDROOT
    gcc : configure에서 --enable-multilib 제거, --with-gmp-include=$(pwd)/gmpdir --with-gmp-lib=$(pwd)/gmpdir/.libs 추가

  4. scott 2012/07/23 09:09  댓글주소  수정/삭제  댓글쓰기

    http://advogato.org/person/redi/diary/253.html
    libmpc,libgmp,libmpfr static build 관련 참고

  5. scott 2013/03/12 09:31  댓글주소  수정/삭제  댓글쓰기

    linux : 3.9 rc2 / binutils : 2.23 / glibc : 2.17 / gcc : 4.7 로 빌드 테스트 확인함.
    glibc 2.16 부터 rpc 지원이 사라져서 busybox 빌드시 networking 항목에서 rpc 지원 삭제해야 빌드됨.