GCC 크로스 컴파일러 만들기
build system : Linux
Host system : Linux
Target system : Linux
필수 패키지 설치
$ sudo apt-get install g++ make gawk
소스 코드 다운로드
http://ftp.kaist.ac.kr/gnu/binutils/
$ wget http://ftpmirror.gnu.org/binutils/binutils-2.24.tar.gz
$ wget http://ftpmirror.gnu.org/gcc/gcc-4.9.2/gcc-4.9.2.tar.gz
$ wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.17.2.tar.xz
$ wget http://ftpmirror.gnu.org/glibc/glibc-2.20.tar.xz
$ wget http://ftpmirror.gnu.org/mpfr/mpfr-3.1.2.tar.xz
$ wget http://ftpmirror.gnu.org/gmp/gmp-6.0.0a.tar.xz
$ wget http://ftpmirror.gnu.org/mpc/mpc-1.0.2.tar.gz
$ wget ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.12.2.tar.bz2
$ wget ftp://gcc.gnu.org/pub/gcc/infrastructure/cloog-0.18.1.tar.gz
프로젝트 사이트 정의
Binutils: https://www.gnu.org/software/binutils/
GCC: https://gcc.gnu.org/
Linux kernel: https://www.kernel.org/
Glibc : https://www.gnu.org/software/libc/
크로스 컴파일 구성 방법
Host Programs: X64
C Cross-Compile: aarch64-linux-gcc Built from GCC
C++ Cross-Compiler: aarch64-linux-g++ built from GCC
CROSS-Assember Cross-Link: aarch64-linux-as, aarch64-linux-ld, built from Binutils
Target Programs & libraries : AArch64
a.out: sample program
Standard C++ Library: libstdc++.so built from GCC
Standard C Library : libc.so, built from Glibc
Linux Kernel
Glibc 과련 사이트
Newlib: https://sourceware.org/newlib/
Libgolss: http://ieee.uwaterloo.ca/coldfire/gcc-doc/docs/porting_1.html
빌드
압축 해제
$ for f in *.tar*; do tar xf $f; done
gcc 심볼링크 생성
gcc 의존성 때문에 심볼링크 설정 해주면 자동으로 의존성을 해결함.
https://gcc.gnu.org/install/download.html
$ cd gcc-4.9.2
$ ln -s ../mpfr-3.1.2 mpfr
$ ln -s ../gmp-6.0.0 gmp
$ ln -s ../mpc-1.0.2 mpc
$ ln -s ../isl-0.12.2 isl
$ ln -s ../cloog-0.18.1 cloog
$ cd ..
툴 체인 설치 위치 지정
$ sudo mkdir -p /opt/cross
$ sudo chown jeff /opt/cross
패스 지정.
$ export PATH=/opt/cross/bin:$PATH
1. 빌드
$ mkdir build-binutils
$ cd build-binutils
$ ../binutils-2.24/configure --prefix=/opt/cross --target=aarch64-linux --disable-multilib
$ make -j4
$ make install
$ cd ..
$ cd linux-3.17.2
$ make ARCH=arm64 INSTALL_HDR_PATH=/opt/cross/aarch64-linux headers_install
$ cd ..
$ mkdir -p build-gcc
$ cd build-gcc
$ ../gcc-4.9.2/configure --prefix=/opt/cross --target=aarch64-linux --enable-languages=c,c++ --disable-multilib
$ make -j4 all-gcc
$ make install-gcc
$ cd ..
--target=aarch64-linux 지정
--disable-multilib 64비트 명령어 세트 사용, 32 명령어 세트 사용하지 않음.
2. 리눅스 커널 헤더
/opt/cross/aarch64-linux/include 새로운 툴 체인을 사용하여 빌드, 시스템 호출 할 수 있게 환경 적용
$ cd linux-3.17.2
$ make ARCH=arm64 INSTALL_HDR_PATH=/opt/cross/aarch64-linux headers_install
$ cd ..
GCC components:
- C/C++ Compilers
-- aarch64-linux-gcc
-- aarch64-linux-g++ ----> Build Order
Glibc Components:
Standard C Library Headers and Startup Files
stdio.h, stdlib.h pthread.h,...
crti.o crtn.o crtl.o/libc.so
<----+
Compile Support Library
- Libgcc.a/libgcc.so ------> Standard C Library:
libc.a/libc.so
<---------+
Standard C++ Library
libstdc++.a/libstdc++.so
3. C/C++ 컴파일
$ mkdir -p build-glibc
$ cd build-glibc
// 20180103 이 옵션 사용.
$ ../gcc-4.9.2/configure --prefix=/opt/cross --target=aarch64-linux --enable-languages=c,c++ --disable-multilib
$ make -j4 all-gcc
$ make install-gcc
$ cd ..
--target=aarch64-linux : 타켓 이름 지정(aarch64-linux)
--enable-languages=c,c++: Fortran, Go 또는 Java와 같은 GCC 제품군의 다른 컴파일러가 빌드되지 않도록한다.
4. 표준 C 라이브러리 및 헤더
Glibc의 표준 C 라이브러리 헤더 opt/cross/aarch64-linux/include 설치한다.
라이브러리는 설치 경로 /opt/cross/aarch64-linux/lib.
$ mkdir -p build-glibc
$ cd build-glibc
$ ../glibc-2.20/configure --prefix=/opt/cross/aarch64-linux --build=$MACHTYPE --host=aarch64-linux --target=aarch64-linux --with-headers=/opt/cross/aarch64-linux/include --disable-multilib libc_cv_forced_unwind=yes
$ make install-bootstrap-headers=yes install-headers
$ make -j4 csu/subdir_lib
$ install csu/crt1.o csu/crti.o csu/crtn.o /opt/cross/aarch64-linux/lib
$ aarch64-linux-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o /opt/cross/aarch64-linux/lib/libc.so
$ touch /opt/cross/aarch64-linux/include/gnu/stubs.h
$ cd ..
--prefix=/opt/cross/aarch64-linuxGlibc의 configure 스크립트에서 헤더와 라이브러리 설치 위지 설정
--build, --host및 --target시스템 유형
$MACHTYP 미리 정의 된 환결 변수
--build=$MACHTYP : 추가 도구 컴파일
5. 컴파일러 지원 라이브러리.
http://www.ifp.illinois.edu/~nakazato/tips/xgcc.html --> 이 구성에서 추가된 방식으로 진행.
$ cd build-gcc
$ make -j4 all-target-libgcc
$ make install-target-libgcc
$ cd ..
두 정적 라이브러리 libgcc.a, libgcc_eh.a 설치
/opt/cross/lib/gcc/aarch64-linux/4.9.2/.
공유 라이브러리 /opt/cross/aarch64-linux/lib64/libgcc_s.so 설치
6. 표준 C 라이브러리
/opt/cross/aarch64-linux/lib/lib.a
/opt/cross/aarch64-linux/lib/libc.so
$ cd build-glibc
$ make -j4
$ make install
$ cd ..
7. 표준 C++ 라이브러리
/opt/cross/aarch64-linux/lib64/libstdc++.a
/opt/cross/aarch64-linux/lib64/libstdc++.so
$ cd build-gcc
$ make -j4
$ make install
$ cd ..
댓글 없음:
댓글 쓰기