====== 이지보드-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}} ----