준비운동하기
정말 오랜만에 문서를 작성하는 것 같다. 그 동안 필자가 게으른 것도 이유라 하겠지만, 솔직히 문서로 만들 만한 작업이 거의 없었던 것 같다. 이번 문서는 Arm용 Toolchain(툴체인)을 소스(Source)로 설치하는 작업을 다뤄볼 것이다. 전까지는 그냥 RPM용으로 설치를 해서 사용했었지만, 이번에는 소스로 직접 컴파일해서 호스트 PC 환경을 구축해 볼 것이다. 이를 위해서 다음과 같은 것들을 준비해야 한다.
Software
- binutils-2.11.2.tar.gz
- linux-2.4.18.tar.gz , patch-2.4.18-rmk7.gz
- gcc-2.95.3.tar.gz , gcc-2.95.3.diff.bz2
- glibc-2.2.5.tar.gz , patch-glibc-2.2.5-arm-jhp2 , glibc-linuxthreads-2.2.5.tar.gz
Hardware
- 펜티엄 III 500MHZ
- RAM : 192MB
- OS : RedHat 8.0
본격적인 설치하기
위에서 필요한 환경을 모두 갖추었다면, 다음과 같이 한다. 이것은 어디까지나 필자의 환경이다. 꼭 맞출 필요는 없다.
- 소스 디렉토리 : /home/embedded/arm
- 설치 디렉토리 : /usr/local/arm-dev
binutils 설치
#tar xzvf binutils-2.11.2.tar.gz #cd binutils-2.11.2 #./configure --target=arm-linux --prefix=/usr/local/arm-dev #make #make install
kernel 패치 및 링크 생성
#tar xzvf linux-2.4.18.tar.gz #cd linux #zcat ../patch-2.4.18-rmk7.gz | patch -p1 #cd ../ #mv linux linux-2.4.18-rmk7 #cd linux-2.4.18-rmk7 #mv -f Makefile Makefile.org #sed "s/ARCH := .*$/ARCH := arm/1" Makefile.org > Makefile #mv -f Makefile Makefile.org #sed "s/CROSS_COMPILE .*=$/CROSS_COMPILE = arm-linux-/1" Makefile.org > Makefile #rm -f Makefile.org #make menuconfig
(☞ 여기서는 옵션을 따로 지정하지 말고, <EXIT> → <YES> 로 빠져나온다. 이 과정은 링크를 걸어주는 과정이다.)
gcc 초기 컴파일
#tar xzvf gcc-2.95.3.tar.gz #cd gcc-2.95.3 #bzcat ../gcc-2.95.3.diff.bz2 | patch -p1 #cd .. #mv gcc-2.95.3 gcc-2.95.3-arm #echo "T_CFLAGS = -Dinhibit_libc -D__gthr_posix_h" >> gcc-2.95.3-arm/gcc/config/arm/t-linux #cd gcc-2.95.3-arm #export PATH=`echo $PATH`:/usr/local/arm-dev/bin #./configure --target=arm-linux --prefix=/usr/local/arm-dev --with-headers=../linux-2.4.18-rmk7/include --enable-languages=c #make #make install
glibc 초기 컴파일
#tar xzvf glibc-2.2.5.tar.gz #cd glibc-2.2.5 #cat ../patch-glibc-2.2.5-arm-jhp2 | patch -p1 #cat ../glibc-linuxthreads-2.2.5.tar.gz | tar xzvf - #cd .. #mv glibc-2.2.5 glibc-2.2.5-jhp2 #cd glibc-2.2.5-jhp2 #export PATH=`echo $PATH`:/usr/local/arm-dev/bin
이제 linux-2.4.18-rmk7/include/asm-arm/arch-integrator/ 디렉토리 안에 있는 헤더 파일을 모두/usr/local/arm-dev/lib/gcc-lib/arm-linux/2.95.3/../../../../arm-linux/sys-include/asm/arch/ 디렉토리 안으로 복사한다.
주의: 만일 /usr/local/arm-dev/lib/gcc-lib/arm-linux/2.95.3/../../../../arm-linux/sys-include/asm/arch/ 디렉토리가 존재하지 않으면 만든다.
그리고 linux-2.4.18-rmk7/include/asm-arm/proc-armv/ 디렉토리 안에 있는 헤더 파일을 모두 /usr/local/arm-dev/lib/gcc-lib/arm-linux/2.95.3/../../../../arm-linux/sys-include/asm/proc/ 디렉토리 안으로 복사합니다.
주의: 만일 /usr/local/arm-dev/lib/gcc-lib/arm-linux/2.95.3/../../../../arm-linux/sys-include/asm/proc/ 디렉토리가 존재하지 않으면 만든다.
☞ autoconf라는 패키지가 있다. 레드햇8.0의 경우 2.5.x 가 설치되어 있을 것이다. 이것을 지우고 2.13 으로 다운그레이드 해야 한다. 참고로 와우 파란 7.1 CD #1장에 들어 있다.
#rpm -qa|grep autoconf #rpm -e autoconf-2.5.x --nodeps #rpm -Uvh autoconf-2.13.10.noarch.rpm
제대로 다운 그레이드가 되었는지 확인하고, 아래와 같이 명령을 내려준다.
#CC=arm-linux-gcc ./configure arm-linux --prefix=/usr/local/arm-dev/arm-linux --enable-add-ons #make all #make install
gcc 후기 컴파일
#mv gcc-2.95.3-arm gcc-2.95.3-bootstrap #tar xzvf gcc-2.95.3.tar.gz #cd gcc-2.95.3 #bzcat ../gcc-2.95.3.diff.bz2 | patch -p1 #cd .. #mv gcc-2.95.3 gcc-2.95.3-arm #cd gcc-2.95.3-arm #export PATH=`echo $PATH`:/usr/local/arm-dev/bin #./configure --target=arm-linux --prefix=/usr/local/arm-dev --enable-languages=c,c++ #make all #make install
glibc 후기 컴파일
#mv glibc-2.2.5-jhp2 glibc-2.2.5-jhp2-bootstrap #tar xzvf glibc-2.2.5.tar.gz #cd glibc-2.2.5 #cat ../patch-glibc-2.2.5-arm-jhp2 | patch -p1 #cat ../glibc-linuxthreads-2.2.5.tar.gz | tar xzvf - #cd .. #mv glibc-2.2.5 glibc-2.2.5-jhp2 #cd glibc-2.2.5-jhp2 #export PATH=`echo $PATH`:/usr/local/arm-dev/bin #CC=arm-linux-gcc ./configure arm-linux --prefix=/ --enable-add-ons #make all #mkdir -p /usr/local/arm-dev/target/glibc-2.2.5 #make install_root=/usr/local/arm-dev/target/glibc-2.2.5 install
여기까지 에러 없이 컴파일을 마쳤다면, 99% 성공했다고 생각해도 된다. 이제 마지막으로 제대로 컴파일러가 작동하는지 테스트해보자!!
테스트
1. 다음과 같이 예제 프로그램을 사용해서 테스트해보자!!
#include <stdio.h> int main() { printf("hello\n"); }
#export PATH=`echo $PATH`:/usr/local/arm-dev/bin #arm-linux-gcc -o hello hello.c
아무 에러 메시지가 없고, hello 파일이 생성되었다면 성공한 것이다.
#file hello hello: ELF 32-bit LSB executable, ARM, version 1 (ARM), dynamically linked (uses shared libs), not stripped #arm-linux-readelf -a hello | grep NEEDED 0x00000001 (NEEDED) Shared library:[libc.so.6]