카테고리

asm (27) bootloader_x86_grub (1) C (92) compile (11) config (76) CPP (13) CSS (1) debugging (7) gimp (1) Go (1) html (1) Java (1) JavaScript (1) kernel (19) LibreOffice (3) Linux system progamming (21) MFC (1) opencv (4) OpenGL (1) PHP (1) Python (4) qemu (29) shell (3) socket (7) troubleshooting (2) ubuntu18.04 (2) windows (1)

2019/01/03

크로스 컴파일러 제작.

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

댓글 없음:

댓글 쓰기