컴퓨터공부

Arm Toolchain 만들기

achivenKakao 2006. 7. 22. 03:43
툴체인 만들기

우선 크로스 컴파일러를 만들어보자. root로 시작하는 것이 좋겠다. 혹은 적어도 설치할 땐 root로 할 필요가 있다. binutils와 gcc를 다음 사이트에서 다운 받는다.

인텔 SA1100 Assabet 보드에 관한 리눅스 개발 사이트를 참조하면 보다 자세한 사항을 알 수 있다. 인텔 사이트.

받은 파일이 /usr/devel/arm에 들었다고 가정하고 그 디렉토리에서 다음과 같은 절차를 사용해 컴파일러를 만든다.

  1. binutils

    %cd /usr/devel/arm 
    %tar xzf binutils-2.15.tar.gz
    %cd binutils-2.15
    %./configure --target=arm-linux --prefix=/usr/local/arm
    %make
    %make install

    configure할 때의 --target은 만들어질 binutils가 arm-linux용이란 것을 나타내고, --prefix는 만들어진 binutils가 설치될 디렉토리를 나타낸다.

    설치된 디렉토리의 리스트는 다음과 같이 될 것이다.

    drwxr-xr-x 4 root root 16 2월 26 09:58 arm-linux 
    drwxr-xr-x 2 root root 4096 2월 26 09:58 bin
    drwxr-xr-x 2 root root 48 2월 26 09:58 include
    drwxr-xr-x 2 root root 4096 2월 26 09:58 lib
    drwxr-xr-x 3 root root 8 2월 26 09:58 man
    drwxr-xr-x 2 root root 1 2월 26 09:58 share

    정상적으로 만들어 졌으면 다음 절차에서 사용되게 하기 위해 path에 임시로 추가해 준다. bash를 사용한다고 가정했다.

    export PATH=/usr/local/arm/bin:$PATH

  2. kernel setting
    다른 작업을 하기 전에 kernel을 setting이 필요하다. kernel version은 2.4.2를 사용했다.
    gcc를 설치할때 필요한 header file을 만들기 위해서...

    %cd /usr/local/arm
    %cp linux-2.4.2.tar.gz /usr/src
    %cp patch-2.4.2-rmk1.gz /usr/src
    %cp diff-2.4.2-rmk1-np3.gz /usr/src
    %cd /usr/src
    %mv linux linux.org
    %tar xvzf linux-2.4.2.tar.gz
    %cd linux
    %gzip -dc ../patch-2.4.2-rmk1.gz | patch -p1
    %gzip -dc ../diff-2.4.2-rmk1-np3.gz | patch -p1
    %cd ..
    %mv linux linux-rmk1-np3
    %ln -s linux-rmk1-np3 linux
    %cd linux
    %make assabet_config
    %make oldconfig
    %make menuconfig
    %make dep
    %cd /usr/local/arm/arm-linux
    %mkdir -p include
    %ln -s /usr/src/linux/include/asm-arm asm
    %in -s /usr/src/linux/include/linux linux
    patch까지 적용하고 나서 Makefile을 수정한다. /usr/src/linux/Makefile을 열어 'ARCH := arm'으로 수정하고 'CROSS_COMPILE =/usr/local/arm/bin/arm-linux-'으로 수정한다.

  3. gcc

    이제 부터는 gcc를 설치하는 작업이다. gcc는 gcc-2.95.3.tar.gz과 gcc-2.95.3.diff.bz2를 사용하였다.

    %cd /usr/devel/arm 
    %tar xvzf gcc-2.95.3.tar.gz
    %cd gcc-2.95.3
    %bzip2 -dc ../gcc-2.95.3.diff.bz2 | patch -p1
    %gcc-2.95.3/gcc/config/arm/t-linux를 수정하여야 한다.
    TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fPIC(변경전)
    TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fPIC -Dinhibit_libc -D__gthr_posix_h(변경후)

    %cd /usr/devel/arm/gcc-2.95.3
    %mkdir -p gcc-build
    %cd gcc-build
    %../configure --target=arm-linux --prefix=/usr/local/arm \
    --with-headers=/usr/src/linux/include --disable-shared \
    --disable-threads --enable-languages=c
    %make
    %make install

    컴파일 후 에러가 나는 것 처럼 보이지만 에러 나도 필요한 파일은 만들어졌으므로 아래 명령으로 확인 한다. 만약 gcc/xgcc가 없다면 make가 제대로 되지 않은 것이다. 아래 명령의 출력은 'arm-linux'가된다.

    %arm-linux-gcc -dumpmachine

    위와 같이 출력된다면 제대로 된 것이므로 인스톨된 것이다.

     

  4. glibc를 만드는 절차에선 커널의 version.h가 필요하다. version.h는 make dep를 하면 생성된다. 이전 과정인 kernel setting에서 만들어 졌으므로 생략한다. glibc-2.2.3.tar.gz과 glibc-linuxthreads-2.2.3.tar.gz을 사용하였다.

    %cd /usr/devel/arm
    %tar xvzf glibc-2.2.3.tar.gz
    %cd glibc-2.2.3
    %gzip -dc ../glibc-linuxthreads-2.2.3.tar.gz | tar xvf -
    Makeconfig file을 아래와 같이 수정한다.
    gnulib := -lgcc -lgcc_eh --> gnulib := -lgcc 이렇게 수정.
    %mkdir -p glibc-build
    %cd glibc-build
    %CC=arm-linux-gcc ../configure --host=arm-linux \
    --build=i686-pc-linux-gnu --prefix=/usr/local/arm \
    --with-headers=/usr/src/linux/include \
    --enable-add-ons=linuxthreads --enable-shared
    %make
    %make install


    %cd /usr/local/arm/lib
    %strings libc.so
    %cp libc.so libc.so.org
    %sed '/BUG/d' libc.so > libc.so.new
    %mv -f libc.so.new libc.so
    %strings libpthread.so
    %cp libpthread.so libpthread.so.org
    %sed '/BUG/d' libpthread.so > libpthread.so.new
    %mv -f libpthread.so.new libpthread.so
    libpthread.so가 없을때는 make install -i를 다시 실행하여 만든다.

  5. gcc 재설치 

    %cd /usr/devel/arm
    %rm -rf gcc-2.95.3
    %%tar xvzf gcc-2.95.3.tar.gz
    %cd gcc-2.95.3
    %bzip2 -dc ../gcc-2.95.3.diff.bz2 | patch -p1
    %mkdir -p gcc-build
    %cd gcc-build
    %../configure --target=arm-linux --prefix=/usr/local/arm \
    --exec-prefix=/usr/local/arm --with-headers=/usr/local/arm/include \
    --libdir=/usr/local/arm/lib
    %make
    %make install
    %arm-linux-gcc -v

  6. 테스트
    다 만들어진 컴파일러, 라이브러리를 테스트 해본다. 테스트 전에 /usr/local/arm/bin이 페스에 설정됐는지 확인. 없다면 넣어 주거나 아래 compiler 명령에서 적당히 path를 삽입해 줄것.

  7. %cat > hello.c /* * hello.c */ #include <stdio.h> int main() { printf("hello.\n"); return 0; } 
    %arm-linux-gcc -o hello hello.c

    에러 없이 컴파일되고 hello가 만들어졌는지 확인할 것. 그리고 file 명령으로 만들어진 hello가 어떤 내용인지 확인해 본다. 아래 처럼 ELF이고 ARM용이면 OK.

    %file hello hello: ELF 32-bit LSB executable, ARM, version 1, 
    dynamically linked (uses shared libs), not stripped

여기까지 툴체인을 만들어 봤다. 커널이 잘 돌아간다면 만든 툴체인은 잘 동작한다고 봐도 될것이다.