준비운동하기

정말 오랜만에 문서를 작성하는 것 같다. 그 동안 필자가 게으른 것도 이유라 하겠지만, 솔직히 문서로 만들 만한 작업이 거의 없었던 것 같다. 이번 문서는 Arm용 Toolchain(툴체인)을 소스(Source)로 설치하는 작업을 다뤄볼 것이다. 전까지는 그냥 RPM용으로 설치를 해서 사용했었지만, 이번에는 소스로 직접 컴파일해서 호스트 PC 환경을 구축해 볼 것이다. 이를 위해서 다음과 같은 것들을 준비해야 한다.

  1. binutils-2.11.2.tar.gz
  2. linux-2.4.18.tar.gz , patch-2.4.18-rmk7.gz
  3. gcc-2.95.3.tar.gz , gcc-2.95.3.diff.bz2
  4. glibc-2.2.5.tar.gz , patch-glibc-2.2.5-arm-jhp2 , glibc-linuxthreads-2.2.5.tar.gz
  1. 펜티엄 III 500MHZ
  2. RAM : 192MB
  3. OS : RedHat 8.0

본격적인 설치하기

위에서 필요한 환경을 모두 갖추었다면, 다음과 같이 한다. 이것은 어디까지나 필자의 환경이다. 꼭 맞출 필요는 없다.

  1. 소스 디렉토리 : /home/embedded/arm
  2. 설치 디렉토리 : /usr/local/arm-dev
#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
#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> 로 빠져나온다. 이 과정은 링크를 걸어주는 과정이다.)

#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
#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
#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
#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]
  • computer/embedded/toolchain_arm_설치하기.txt
  • Last modified: 4 years ago
  • by likewind