====== 이지보드-X5 툴 체인 설치하기 ======
====== 들어가기 전에 ======
여기서는 이지보드-X5 에서 사용가능한 툴 체인을 설치해 볼 것이다. 솔직히 툴체인의 설치 방법은 제이닷디엔티http://falinux.com 에도 있다. 주소는 http://wiki.falinux.com/wiki.php/CROSSGCC3.3REZ-X5 이다.
여기서는 기본적으로 .rpm 과 src 를 지원한다.
하지만 나의 경우, 호스트가 젠투이기 때문에 rpm 을 설치할 수는 없었다.
참고로 젠투에서도 rpm 을 설치할 수는 있는 걸로 알고 있다. 나 역시 시도해본 적이 있다. 하지만, rpm 의 가장 큰 단점인 의존성문제가 있었다. 그래서 결국 src 로 방향을 바꿨다.
나의 호스트 환경은 다음과 같다.
| OS | gentoo-2004.1 |
| kernel | 2.6.7-gentoo-r8 |
| gcc | 3.3.3 |
====== 준비해야 할 것들 ======
- binutils http://www.ibiblio.org/pub/Linux/kernel.org/pub/linux/devel/binutils/binutils-2.14.90.0.6.tar.gz
- glibc ftp://ftp.gnu.org/gnu/glibc/glibc-2.3.2.tar.gz
- glibc-linuxthreads ftp://ftp.gnu.org/gnu/glibc/glibc-linuxthreads-2.3.2.tar.gz
- gcc ftp://ftp.gnu.org/gnu/gcc/gcc-3.3/gcc-3.3.tar.gz
- kernel http://falinux.com/pds/data/linux-2.4.19-x5-v05.tar.gz
위의 것들을 모두 다운로드 받았다면, 정리하기 쉽게 하나의 디렉토리에 모아두자. 나의 경우 /root/ez 이라는 디렉토리에 모두 모았다.
이제 본격적으로 설치해보자!
====== 컴파일 및 설치 ======
===== 커널 설치 =====
여기서는 커널을 직접 컴파일해서 부팅하는 것을 목적으로 하지 않는다. 단지 압축만 풀어서, 뒤에서 gcc 와 glibc 의 링크를 걸어주는 역할이다. 이 커널은 제조사에서 제공하는 커널로 사용한다.
#cd /root/ez
#tar xzvf linux-2.4.19-x5-v05.tar.gz
===== binutils 설치 =====
아래와 같이 압축을 풀고,
#tar xzvf binutils-2.14.90.0.6.tar.gz
#cd binutils-2.14.90.0.6
#./configure --target=armv5l-linux --prefix=/usr --program-prefix=armv5l-linux- # 여기서 설치되는 경로는 /usr 아래이고, 컴파일한 오프젝트 파일들은 armv5l-linux- 로 시작한다.
#make
#make install
설정한 다음 컴파일하고 설치하면 된다.
===== gcc 설치 =====
역시 앞과 같은 과정이다. 참고로 gcc 는 전기 컴파일과 후기 컴파일을 해야 한다.
#tar xzvf gcc-3.3.tar.gz
#cd gcc-3.3
#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
#./configure --target=armv5l-linux --prefix=/usr --with-headers=/root/ez/linux-2.4.19-x5-v04/include \
>--disable-shared --disable-threads --enable-languages="c" --nfp --with-cpu=xscale --without-fp \
>--with-softfloat-support=internal
#make
#make install
그러니까 후에 가서 또한번 컴파일을 해야 한다는 것이다.
===== glibc 설치 =====
가장 까다롭다고(?) 하는 glibc 과정이다. 거의 이부분에서 좌절하게 되는 경우가 많은데, 다음을 고대로 따라하면 큰 문제가 없을 것이다.
#tar xzvf glibc-2.3.2.tar.gz
#tar -C glibc-2.3.2 -zxt glibc-linuxthreads-2.3.2.tar.gz
#cd glibc-2.3.2
여기서 몇가지 수정해야 할 것들이 있다.
./sysdeps/unix/sysv/linux/arm/sysdep.h 파일에서
161 : "a1", "memory"); \
의 내용을
161 : "memory"); \
로 바꾼다.
./stdio-common/sscant.c 파일에서
30 sscanf (s, format)
31 const char *s;
32 const char *format;
을
30 sscanf (const char *s, const char *format, ...)
로 바꿉니다.
./linuxthreads/sysdeps/unix/sysv/linux/arm/sysdep-cancel.h 화일에서
37 ENTRY (name) \
을
37 ENTRY (name); \
로 바꾼다.
컴파일 할 디렉토리를 만든다.
#mkdir ../glibcbuild
#cd ../glibcbuild
환경 설정을 한다.
CC=armv5l-linux-gcc ../glibc-2.3.2/configure armv5l-linux --build=i686-pc-linux-gnu \
--with-headers=/root/ez/linux-2.4.19-x5-v04/include --enable-add-ons --enable-shared --prefix=/usr/armv5l-linux \
--with-cpu=xscale --without-fp --enable-kernel=2.4.19
컴파일을 하고 설치한다.
#make
#make install
===== gcc 재설치 =====
이제 마지막으로 gcc를 재설치하여야 한다. 물론 옵션이 달라진다. 나중에 컴파일 할때 라이브러리 의존성 문제가 생기므로 사전에 링크를 걸어 준다.
#cd /usr/armv5l-linux/lib
#ln -s ../../lib/* .
#sed -e '/*** BUG/d' /usr/armv5l-linux/lib/libc.so > /usr/armv5l-linux/lib/libc.so.new
#mv -f /usr/armv5l-linux/lib/libc.so.new -f /usr/armv5l-linux/lib/libc.so
#sed -e '/*** BUG/d' /usr/armv5l-linux/lib/libpthread.so > /usr/armv5l-linux/lib/libpthread.so.new
#mv -f /usr/armv5l-linux/lib/libpthread.so.new -f /usr/armv5l-linux/lib/libpthread.so
#cd /project/toolchain/
기존의 내용을 모두 지운다.
#rm -rf gcc-3.3
다시 압축을 푼다.
#tar xzvf gcc-3.3.tar.gz
#cd gcc-3.3
이제 환경설정과 컴파일을 수행합니다. 환경을 설정한다.
./configure --target=armv5l-linux --prefix=/usr --program-prefix=armv5l-linux- \
--with-headers=/root/ez/linux-2.4.19-x5-v04/include/ \
--with-cpu=xscale --with-softfloat-support=internal --enable-languages=c,c++ --nfp
컴파일을 하고 설치한다.
#make
#make install
아~ 이제 툴체인 설치를 위한 모든 과정이 끝났다. 이제 남은 건 테스트 뿐이다.
====== 테스트 ======
간단한 C 프로그램을 만들어서 툴 체인으로 컴파일 해보자!
그리고 다음과 같이 명령을 내려보자!
#file a.out
test: ELF 32-bit LSB executable, ARM, version 1 (ARM), dynamically linked (uses shared libs), not stripped
아래와 같이 나오면 성공이다.
----
{{indexmenu>:#1|skipns=/^(wiki|etc|diary|playground)$/ skipfile=/^(todays|about|guestbook)$/ nsort rsort}}
----