[OS]/Embedded

[펌] Cross Compiler 설치(arm-linux)

하늘을닮은호수M 2005. 6. 16. 13:31
반응형

Cross Compiler 설치(arm-linux)

(Workedin 와우 리눅스 7.0 까치 버전)

1. CrossCompiler란 ?

Target Board 즉 StrongARM에 무언가를 Porting하기 위하서는 Crosscompiler라는게 반드시 필요하다. 여기서 Crosscompiler가 무엇이냐고 물으신다면 말 그대로 해석해보면 교차 컴파일러라는 소리이다. 즉 CrossCompiler는 이렇게 생각하면 될 것이다. 우리가 사용하는 Host와 Target은 CPU가 다르다. 즉 일반적인 Host의 CPU는 intel계열인데 반해, Target의 CPU는 Strong ARM이다. 즉 우리가 Host에서 그냥 gcc로 컴파일하여 생성한 Binary파일을 Target에 다운로드 하여 실행시켜보면 당연히 실행이 되지 않는 것이다. 예를 들면 우리가 한글에서 작업한 파일을 스왑에서 읽을 수 없는 것과 같은 것이다. 그래서 CrossCompiler가 필요한 것이다.

이번장에서는 소스(tar)를 이용하여 크로스 컴파일러를 구성하는 방법과 아울러 이미 만들어져 있는 크로스컴파일러를 설치하는 방법에 대해서 기술해 보겠다!!!

2. 소스구하기

CrossCompiler를 구축하기 위해서 필요한 소스들이 있다.

- binutils : 어셈블러 및 로더 기타 툴(GNU)
- glibc : 크로스컴파일러 구축을 위한 라이브러리 및 일반 라이브러리
- gcc : 컴파일러
- kernel : ARM으로 패치된 커널소스

이러한 패키지를 필요로 하며 이 패키지들의 모임을 일반적으로 '크로스 컴파일 툴체인(CrossCompile ToolChain)' 이라고 한다.


소스는 다음과 같은 경로에서 구한다.

1) binutils : 어셈블러 및 로더 기타 툴(GNU)
ftp://linux.sarang.net/pub/mirror/gnu/gnu/binutils/binutils-2.14.tar.bz2

2) glibc : 크로스컴파일러 구축을 위한 라이브러리 및 일반 라이브러리
ftp://linux.sarang.net/pub/mirror/gnu/gnu/glibc/glibc-2.2.5.tar.gz
ftp://linux.sarang.net/pub/mirror/gnu/gnu/glibc/glibc-linuxthreads-2.2.5.tar.gz

3) gcc : 컴파일러
ftp://linux.sarang.net/pub/mirror/gnu/gnu/gcc/gcc-2.95.3.tar.gz
ftp://ftp.linuxfromscratch.org/lfs-packages/3.3/gcc-2.95.3-2.patch.bz2

4) 커널
http://ftp.kelp.or.kr/pub/arm-linux/kernel/v2.4/patch-2.4.19-rmk7.bz2
http://ftp.kelp.or.kr/pub/arm-linux/people/nico/diff-2.4.19-rmk7-pxa2.gz
ftp://ftp.kernel.org/pub/linux/kernel/v2.4/linux-2.4.19.tar.bz2


위 소스들을 받아서 우리가 작업하고자 하는 디렉토리(/var/ToolChain)에 카피한다

** 아래 과정을 수행하는데 있어서 반드시 이 순서대로 해야만 하며(순서를 뒤죽박죽으로하면 절대 안됨!!), 반드시 하나의 터미널에서 작업할것!!!(path때문에...)

3. Binutils 설치

[root@Flytaki /var/ToolChain]#ls -al
합계 63144
drwxr-xr-x 6 root root 4096 7월 24 21:46 .
drwxr-xr-x 6 root root 4096 7월 24 20:47 ..
-rw-r--r-- 1 root root 10921504 7월 24 20:59 binutils-2.14.tar.bz2
-rw-r--r-- 1 root root 253342 6월 12 10:56 diff-2.4.19-rmk7-pxa2.gz
-rw-r--r-- 1 root root 5697 7월 24 21:03 gcc-2.95.3-2.patch.bz2
-rw-r--r-- 1 root root 12911721 7월 12 2002 gcc-2.95.3.tar.gz
-rw-r--r-- 1 root root 13377170 7월 24 21:00 glibc-2.2.5.tar.bz2
-rw-r--r-- 1 root root 216310 7월 24 21:00 glibc-linuxthreads-2.2.5.tar.bz2
-rw-r--r-- 1 root root26042494 8월 3 2002 linux-2.4.19.tar.bz2
-rw-r--r-- 1 root root 788013 3월 20 07:25 patch-2.4.19-rmk7.gz
[root@Flytaki /var/ToolChain]#
[root@Flytaki /var/ToolChain]#bzip -dc binutils-2.14.tar.bz2 | tar xvf -
[root@Flytaki /var/ToolChain]#cd binutils-2.14
[root@Flytaki /var/ToolChain/binutils-2.14]#./configure --target=arm-linux
[root@Flytaki /var/ToolChain/binutils-2.14]#make
[root@Flytaki /var/ToolChain/binutils-2.14]#make install
[root@Flytaki /var/ToolChain/binutils-2.14]#

아무 에러없이 컴파일이 되었다면 /usr/local/arm-linux란 디렉토리가 생겼을것이다.이제 이 디렉토리 및의 bin/ 디렉토리를 패스로 잡아줘야한다.

#export PATH=/usr/local/arm-linux/bin:$PATH

(/root/.bash_profile에 직접 적어주어도 되지만 이 작업은 크로스컴파일러가 다 완성되었을때 하기로 하고 여기에서는 그냥 터미널상에서만 path를 잡아주기로 한다!!!)

** [TIP] 압축을 푸는 방법에 대해서...
xxx.tar.gz으로 압축이 되었을때 압축을 푸는 방법이 몇가지가 있다.
(1) #gzip -dc xxx.tar.gz | tar xvf -
(2) #gzip -d xxx.tar.gz
#tar xvf xxx.tar
(3) #tar xvfz xxx.tar.gz
자기 입맛에 맞는 방법으로 tar.gz을 푸시길.. ^^

** [TIP] 그리고 반드시 소스를 푼후에 보면 README, INSTALL, configure란 파일이 있다. README와 INSTALL은 작업하기 전에 꼭 한번씩은 읽어보기를 바라며(소스에 대한 전체적인 설명 및 컴파일하는 방법에 대해 나와있다. 주위에 보면 이것도 하나 읽어보지 않고 무작정 make부터 하는 친구들을 많이봤다.. 이렇게 하면 삽질만... ㅡ.ㅡ;;),
#./configure --help를 해보면 이 소스에대한 많은 옵션이 있는데 이것또한 꼭 한번씩은 보기바란다. 이 소스에 무슨 옵션이 있고, 무슨 기능들이 있는지.... ^^

4. kernel(linux-2.4.19) 설치

[root@Flytaki /var/ToolChain]#bzip -dc linux-2.4.19.tar.bz2 | tar xvf -
[root@Flytaki /var/ToolChain]#cd linux-2.4.19
[root@Flytaki /var/ToolChain/linux-2.4.19]#gzip -dc ../patch-2.4.19-rmk7.bz2 | patch -p1
[root@Flytaki /var/ToolChain/linux-2.4.19]#gzip -dc ../diff-2.4.19-rmk7-pxa2.gz | patch -p1
[root@Flytaki /var/ToolChain/linux-2.4.19]#make assabet_config
[root@Flytaki /var/ToolChain/linux-2.4.19]#make oldconfig
[root@Flytaki /var/ToolChain/linux-2.4.19]#make menuconfig
[root@Flytaki /var/ToolChain/linux-2.4.19]#
[root@Flytaki /var/ToolChain/linux-2.4.19]#mkdir -p /usr/local/arm-linux/include
[root@Flytaki /var/ToolChain/linux-2.4.19]#cp -dpR include/asm-arm /usr/local/arm-linux/include/asm
[root@Flytaki /var/ToolChain/linux-2.4.19]#cp -dpR include/linux /usr/local/arm-linux/include/linux
[root@Flytaki /var/ToolChain/linux-2.4.19]#cd /usr/local/arm-linux
[root@Flytaki /usr/local/arm-linux]#ln -s include sys-linux
[root@Flytaki /usr/local/arm-linux]#

** 여기에서는 앞에서 컴파일하게 될 소스에서 커널의 헤더파일을 필요로 하기에 커널이 필요한것이기에 단지 커널및 패치까지만 한것임을 알기 바란다!!

** [TIP] 패치를 시키는데 -p0, -p1이 있다...
이것이 뜻하는 바는... -p0는 현재 디렉토리, -p1은 상위디렉토리에서 패치를 시킨다는 소리!

** [TIP] 패치를 보면 rmkx, pxa*, diff*등등이 있다. 이러한 이름은 이 패치를 만든 사람의 이름을 따서 만든것이며 그 뒤에 패치 번호가 있다. 위에서는 rmk7이라고 있네요.그럼 분명 rmk1, rmk2 등등이 있을텐데 반드시 순서대로 패치를 해야한다는 점입니다.!즉 rmk7을 패치한후에 rmk6이나 그 이하번호의 rmk를 패치하면 안된다는 소리죠! (당연하 소리겠죠??)그리고 커널같은경우에는 한상 커널풀고(linux-2.4.19.tar.bz2), patch(patch-2.4.19-rmk7.bz2),diff(diff-2.4.19-rmk7-pxa2.gz) 이 순서대로 해야한다. 만약 순서가 틀어지만 패치가 잘 적용이안될것이다!!!

5. gcc 설치

[root@Flytaki /var/ToolChain]#gzip -dc gcc-2.95.3.tar.gz | tar xvf -
[root@Flytaki /var/ToolChain]#cd gcc-2.95.3
[root@Flytaki /var/ToolChain/gcc-2.95.3]#bzip2 -dc ../gcc-2.95.3-2.patch.bz2 | patch -p1
[root@Flytaki /var/ToolChain/gcc-2.95.3]#cd gcc/config/arm
[root@Flytaki /var/ToolChain/gcc-2.95.3/gcc/config/arm]#vi t-linux

이 파일의 3라인에 있는 TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fPIC 라인을TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fPIC -Dinhibit_libc -D__gthr_posix_h 이렇게 수정한다.

[root@Flytaki /var/ToolChain/gcc-2.95.3/gcc/config/arm]#cd ../../..
[root@Flytaki /var/ToolChain/gcc-2.95.3]#mkdir ../gcc-build
[root@Flytaki /var/ToolChain/gcc-2.95.3]#cd ../gcc-build
[root@Flytaki /var/ToolChain/gcc-build]#../gcc-2.95.3/configure --target-arm-linux -v
--with-gnu-as --with-gnu-ld --with-gnu-newlib
--prefix=/usr/lcoal/arm-linux
[root@Flytaki /var/ToolChain/gcc-build]#
[root@Flytaki /var/ToolChain/gcc-build]#make -w all-gcc install-gcc LANGUAGE="c c++"

** 도중에에러가 뜬다.이 에러는 헤더파일의 트리상의 문제로 gcc의 헤더파일 경로에 위에서 카피해준 커널의헤더파일을 링크를 걸어서 해결한다!!

[root@Flytaki /var/ToolChain/gcc-build]#cd ../gcc-2.95.3/include
[root@Flytaki /var/ToolChain/gcc-2.95.3/include]#ln -s /usr/local/arm-linux/include/asm asm
[root@Flytaki /var/ToolChain/gcc-2.95.3/include]#ln -s /usr/local/arm-linux/include/linux linux
[root@Flytaki /var/ToolChain/gcc-2.95.3/include]#cd ../../gcc-build/
[root@Flytaki /var/ToolChain/gcc-build]#make -w all-gcc install-gcc LANGUAGE="c c++"
[root@Flytaki /var/ToolChain/gcc-build]#cd gcc
[root@Flytaki /var/ToolChain/gcc-build]#./xgcc -dumpmachine arm-linux
[root@Flytaki /var/ToolChain/gcc-build]#cd /usr/local/arm-linux/bin
[root@Flytaki /usr/local/arm-linux/bin]#./arm-linux-gcc -v Reading specs from /usr/local/arm-linux/lib/gcc-lib/arm-linux/2.95.3/specsgcc version 2.95.3 20010315 (release)

[root@Flytaki /usr/local/arm-linux/bin]#cd -
[root@Flytaki /var/ToolChain/gcc-build]#

** 위에서 는 라인 길이가 길어서 다음라인으로 넘어가서 적는다는 것을 뜻한다. 절대 를 적으면 안된다는 것이다! 다만 다음라인표시 ^^(혹시나해서... ^^ㅋㅋ)

** gcc/ 디렉토리에서 ./xgcc -dumpmachine을 해주는 이유는 GCC가 재대로 설치되어 있는지를보기 위함이다. 여기에서 arm-linux가 나와야 재대로 설치가 된것이다!!!

** ./arm-linux-gcc -v를 함으로인해서 만들어진 GCC의 버전을 확인한다!

** [TIP] make다음에 여러명령어를 같이 적어주면 순서대로 실행하게 된다. 즉 make all zImage라고 했다면 우선 make all이 수행된후에 make zImage가 수행된다는 소리이다!(그냥 알아두라구영... ^^ 귀차니즘... )


** [TIP] #cd - 라는 것이 있다. 이것은 전에 있던 디렉토리로 이동하라는 소리이다.즉 전에 작업하던 디렉토리로 가고자 할때 cd - 하면 바로 갈 수가 있다.. ^^

6. glibc 설치

[root@Flytaki /var/ToolChain]#gzip -dc glibc-2.2.5.tar.gz | tar xvf -
[root@Flytaki /var/ToolChain]#cd glibc-2.2.5
[root@Flytaki /var/ToolChain/glibc-2.2.5]#gzip -dc ../glibc-linuxthreads-2.2.5.tar.gz | tar xvf -
[root@Flytaki /var/ToolChain/glibc-2.2.5]#mkdir ../glibc-build
[root@Flytaki /var/ToolChain/glibc-2.2.5]#cd ../glibc-build
[root@Flytaki /var/ToolChain/glibc-build]#CC=arm-linux-gcc ../glibc-2.2.5/configure arm-linux
--prefix=/usr/local/arm-linux --enable-add-ons=linuxthreads
--with-headers=/var/ToolChain/linux-2.4.19/include
--with-cpu=strongarm110

** 추가적으로 만약 LD_LIBRARY_PATH가 현재의 디렉토리를 가지지 않아야 한다는 메시지가 나오면
** ~/.bashrc 파일에 있을지도 모르는 LD_LIBRARY_PATH를 변수를 없애기 위해서 아래와 같이 한다.

[root@Flytaki /var/ToolChain/glibc-build]#export LD_LIBRARY_PATH=
[root@Flytaki /var/ToolChain/glibc-build]#make -i
[root@Flytaki /var/ToolChain/glibc-build]#make install
[root@Flytaki /var/ToolChain/glibc-build]#


** 현재 libc.so 파일이 재대로 생성이 되지 않아서 컴파일 도중 에러가 발생한다. 우선은 make -i로 강제 컴파일을 시켰다.. 이에 대한 컴파일부분은 계속 수정, 보완하기로 한다!!!

7. TEST

[root@Flytaki /var/ToolChain]#vi test.c
#include

main()
{
printf("TEST----n");
}

[root@Flytaki /var/ToolChain]#arm-linux-gcc -o test test.c
[root@Flytaki /var/ToolChain]#file test
test: ELF 32-bit LSB executable, Advanced RISE Machines ARM, version 1,
dynamically linked(uses shared libs). net stripped

위와 같이 나오면성공!!!

8. 환경설정

[root@Flytaki /var/ToolChain]#vi /root/.bash_profile


이 파일을 열어서... PATH=/usr/local/sbin:/usr/sbin:/sbin:$PATH:$HOME/bin 이 부분에위에서 설치된 크로스컴파일러의 패스를적어준다.
PATH=/usr/local/sbin:/usr/sbin:/sbin:$PATH:$HOME/bin:/usr/local/arm-linux/bin 이렇게~~~
이제 source란 명령어로 바로 적용시켜주거나, reboot한다.


[root@Flytaki /var/ToolChain]#source /root/.bash_profile

이제 아무디렉토리에서건 arm-linux-gcc를 사용할 수가 있다!!! ^^;;


8. 이미 만들어져있는 크로스컴파일러 다운받아 설치하기

위는 소스를 가지고 크로스컴파일러를 구축하는 방법에 대해서 알아보았다.이번에는 이미 만들어져있는 크로스컴파일러를 받아서 설치하는(?) 방법에 대해서 기술해보기로 한다.소스는 handhelds에서 만들어놓은 것을 받기로 한다.

[root@Flytaki /]#wget ftp://ftp.handhelds.org/pub/linux/arm/toolchain/arm-linux-toolchain-post-2.2.13.tar.gz
[root@Flytaki /]#gzip -dc arm-linux-toolchain-post-2.2.13.tar.gz | tar xvf -


이제 위와같이 /skiff/local/bin 디렉토리를 path만 잡아주면 된다.

** 난 솔찍히 이 방법을 권한다. 왜냐하면 경험상 이 방법이 설치하기가 훨씬 간단하고, 빠르며..여러가지 Application을 컴파일해본 결과 첫번째 방법대로 했을경우에 각종 lib및 include파일들때문에컴파일이 더러 안되는 경우가 있었으나(QT컴파일시) 이것으로 하면 그런 경우가 적었기때문이다.!!!

** wget이란 명령어는 웹상의 문서를 가져올때 사용하는 명령어이다.터미널상에서 웹에 있는 자료를 가져올때 아주 편하다!!!


이것으로 크로스컴파일러 구축을 끝내기로 한다.여기서 중요한 점 한가지는...제 리눅스컴(와우리눅스7.0)에서 작업을 한 사항이기에...다른 환경에서 위와 똑같이 되지 않다는 것이다.그리고 TIP으로 한가지가 있다면...각종 Application을 컴파일할때 컴파일이 headerfile이나 라이브러리때문에 컴파일이 안될때가 더러있다.(내 경험상으로는 많다... ^^) 이럴땐... 크로스컴파일러를 의심해보라는 점이다.크로스컴파일러에 없는 라이브러리같은 것은 직접 컴파일시켜서 카피도 해놓고, 아니면... 현재 나와있는 여러가지의 크로스컴파일러(arm-linux)를 다운받아서 해보기를 바란다!!!

반응형