우선 크로스 컴파일러를 만들어보자. root로 시작하는 것이 좋겠다. 혹은 적어도 설치할 땐 root로 할 필요가 있다. binutils와 gcc를 다음 사이트에서 다운 받는다.
인텔 SA1100 Assabet 보드에 관한 리눅스 개발 사이트를 참조하면 보다 자세한 사항을 알 수 있다. 인텔 사이트.
받은 파일이 /usr/devel/arm에 들었다고 가정하고 그 디렉토리에서 다음과 같은 절차를 사용해 컴파일러를 만든다.
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 installconfigure할 때의 --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
kernel setting
다른 작업을 하기 전에 kernel을 setting이 필요하다. kernel version은 2.4.2를 사용했다.
gcc를 설치할때 필요한 header file을 만들기 위해서...
patch까지 적용하고 나서 Makefile을 수정한다. /usr/src/linux/Makefile을 열어 'ARCH := arm'으로 수정하고 'CROSS_COMPILE =/usr/local/arm/bin/arm-linux-'으로 수정한다.%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 linuxgcc
이제 부터는 gcc를 설치하는 작업이다. gcc는 gcc-2.95.3.tar.gz과 gcc-2.95.3.diff.bz2를 사용하였다.
%gcc-2.95.3/gcc/config/arm/t-linux를 수정하여야 한다.%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
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
위와 같이 출력된다면 제대로 된 것이므로 인스톨된 것이다.
glibc를 만드는 절차에선 커널의 version.h가 필요하다. version.h는 make dep를 하면 생성된다. 이전 과정인 kernel setting에서 만들어 졌으므로 생략한다. glibc-2.2.3.tar.gz과 glibc-linuxthreads-2.2.3.tar.gz을 사용하였다.
Makeconfig file을 아래와 같이 수정한다.%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 -
gnulib := -lgcc -lgcc_eh --> gnulib := -lgcc 이렇게 수정.
libpthread.so가 없을때는 make install -i를 다시 실행하여 만든다.%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.sogcc 재설치
%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테스트
다 만들어진 컴파일러, 라이브러리를 테스트 해본다. 테스트 전에 /usr/local/arm/bin이 페스에 설정됐는지 확인. 없다면 넣어 주거나 아래 compiler 명령에서 적당히 path를 삽입해 줄것.%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
여기까지 툴체인을 만들어 봤다. 커널이 잘 돌아간다면 만든 툴체인은 잘 동작한다고 봐도 될것이다.