이제 크로스 컴파일러, 즉 임베디드 보드를 위한 컴파일러를 설치하겠습니다.
따라하기 시리즈에 따라 설치하셨다면 이미 Native 컴파일러는 설치가 된 상태입니다.

네이티브 컴파일러

즉, 리눅스 PC에서 실행되는 컴파일러는 설치되어 있고 --version 옵션으로
설치된 컴파일러 버전을 확인하실 수 있습니다.

]$ gcc --vserion
gcc (GCC) 4.1.1 20070105 (Red Hat 4.1.1-52)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

크로스 컴파일러

리눅스를 설치하면서 설치된 컴파일러를 네이티브 컴파일러라고 한다면
임베디드 보드를 위한 컴파일러는 크로스 컴파일러라고 합니다.
크로스 컴파일러는 컴파일러가 실행되는 시스템에서 실행하는 프로그램을 만드는 것이 아니라
목적으로 하는 보드, 즉 다른 시스템에서 실행되는 프로그램을 컴파일해주는 컴파일러를 말합니다.

크로스 컴파일러를 설치하는 방법은 매우 간단합니다. 그냥 압축을 풀기만하면 되거든요. ^^
이렇게 간단하게 설치할 수 있는 이유는 FALINUX의 노고 때문입니다.
그냥 풀어서 사용할 수 있도록 여러 번 설치와 확인 과정을 거친 후에
압축파일 형태로 올려 주신 것입니다.

크로스 컴파일러 설치

임베디드 보드를 위한 컴파일러는 본 포럼으로 옮겨진 Tool Chain 페이지에서 내려 받으시면 되겠습니다.

페이지를 보시면 여러 가지가 있지요?
따라하기 시리즈 글에 따라 최근의 리눅스 배포판을 설치하셨다면
가장 최근의 컴파일러를 설치하시면 됩니다.
제가 사용하는 컴파일러는 페도라 코어 2, 코어3 ARM GCC 3.4.3 - arm-toolchain-3.4.3.tar.gz 입니다.

여기서 뭔가 좀 이상한 부분이 있습니다.
네이티브 컴파일러는 4.1.1 버전으로 4.x.x 버전인데
자료실에 올려진 컴파일러는 3.4.3 입니다.

버전이 네이티브와 달리 3.x.x로 낮지요. 그러나 걱정하실 필요는 없습니다.
네이티브와 크로스 컴파일러와의 버전차이가 있다고 하더라도
큰 불편이 없으며 별 다른 문제도 없습니다.
또한 FALINUX에서 4.x.x 버전 대의 크로스 컴파일러를 곧 올린다고 합니다.

자~ 설치해 보겠습니다. ^^
Tool Chain 페이지에서 페도라 코어 2, 코어3 ARM GCC 3.4.3 - arm-toolchain-3.4.3.tar.gz
리눅스 시스템에서 직접 내려 받던지,
아니면 윈도즈에서 내려 받고 삼바 공유 폴더로 복사하십시오.

루트 권한으로 로그인을 하신 후
내려 받은 파일을 루트 폴더(/)로 이동합니다.

]# mv arm-toolchain-3.4.3.tar.gz /               // 파일을 루트 폴더로 이동한 후
]# cd / // 루트 폴더로 이동합니다.
]# tar zxvf arm-toolchain-3.4.3.tar.gz // 압축 파일을 풀기를 합니다.

압축 풀기 작업이 끝나면 임베디드 보드를 위한 크로스 컴파일러 설치가 완료됩니다.
이제 클로스 컴파일러가 제대로 설치되었는지 확인해 보겠습니다.

먼저 버전 번호를 확인해 보겠습니다.
설치된 크로스 컴파일러의 컴파일러 이름은 arm-linux-gcc 입니다.
즉, arm-linux- 가 접두어로 붙게 되지요. ^^

]# arm-linux-gcc --version
arm-linux-gcc (GCC) 3.4.3
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

]# 

컴파일러 버전을 확인했습니다만,
간단한 프로그램을 작성해서 임베디드 보드에서 실행해 보겠습니다.
또는 리눅스에서 직접 vi 에디터를 이용하여 작성하셔도 되겠습니다.

단, root 로 로그인된 상태에서 작성하시기 보다는 추가한 유저명을 이용하여
로그인하시고 작성하시기 바랍니다.

잠깐!! 보통 root 권한으로 작업하시는 경우가 많은데
아무래도 편하기 때문에 그럴 것입니다.
그러나 root권한으로 작업하시다 보면 작은 실수로 돌이킬 수 없는 상황을 만들 수 있고,
앞으로 외부에 작업하시는 경우 일반 계정에서 작업하시는 것에 대해
매우 불편하고 거부감을 느끼실 수 있습니다.
그러므로 가급적 일반 유저로 로그인하여 작업하시기 바랍니다.

저는 jwjw 라는 유저를 등록했기 때문에 jwjw로 로그인해서 작업하겠습니다.
또한 만들어지는 소스는 main.c 파일 이름을 이용하겠습니다.

#include <stdio.h>

int main( void)
{
   printf( "Hello World!!");
}

우선 네이티브 컴파일러로 컴파일을 하고 실행하겠습니다.

]$ gcc main.c
main.c:6:2: warning: no newline at end of file
]$ ./a.out
Hello World!!
]$ 

vi 에디터를 이용해서 프로그램을 작성하면 이런 문제가 없는데,
MS 윈도우에서 프로그램 파일을 만들면 " warning: no newline at end of file" 이라는
경고 메시지가 출력되는데 맨 마지막행에 빈행이 없어서 그렇습니다.

경고 메시지라 컴파일에 문제없고 만들어진 파일에도 이상이 없지만
저는 컴파일 에러 보다도 경고메시지를 더 무서워하고 눈에 걸립니다.
그래서 저는 꼭 맨 끝 행에 빈 문자열을 추가해 줍니다.

파일 속성 보기, file 명령

만들어진 a.out 의 속성을 볼까요?
file 명령을 이용하면 파일의 속성을 보실 수 있습니다.

]$ file a.out
a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, 
dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped ]$

속성 내용글을 보면 intel 386에서 실행되는 32bit 프로그램임을 알 수 있습니다.

크로스 컴파일러 사용

이제 임베디드용 실행 파일로 컴파일해 보겠습니다.
별다른 작업은 없습니다. 그저 컴파일러만 크로스 컴파일러를 이용하면 됩니다.

]$ arm-linux-gcc main.c
]$ 

임베디드용 프로그램을 작성한다고 해서 특별하게 소스를 수정하거나
별다른 작업은 필요없고 다만 크로스 컴파일러인 arm-linux-gcc 를 사용한 것 뿐입니다.

컴파일을 했으니 실행해 봐야 겠는데, 당연히 리눅스 시스템에서는 실행이 안됩니다.

]$ ./a.out
bash: ./a.out: cannot execute binary file
]$

정말 다른 시스템용 프로그램으로 만들어 졌는지 확인해 볼까요?

]$ file a.out
a.out: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.6.8, 
dynamically linked (uses shared libs), for GNU/Linux 2.6.8, not stripped ]$

속성 내용이 달라졌죠. 이제는 ARM CPU에서 실행되는 32bit 파일입니다.

임베디드 보드에서 테스트

이제 텔넷으로 임베디드 보드와 연결합니다.

falinux login: root                  // root로 로그인하고
[root@falinux ~]$ mount -t nfs -o nolock 192.168.10.50:/home/jwjw /mnt/nfs   // nfs 폴더를 마운트 합니다.
[root@falinux ~]$ cd /mnt/nfs        // 마운트 폴더로 이동한 후
[root@falinux nfs]$ ./a.out          // 실행파일을 실행합니다.
Hello World!!
[root@falinux nfs]$ 

어떻습니까? 네이티브용으로 만들어진 소스를 아무런 수정없이
컴파일러만 바꾸어서 임베디드 보드용 프로그램을 작성했습니다.

이렇게 크로스 컴파일러를 운영할 수 있다는 점이
임베디드 리눅스 시스템의 가장 큰 장점
이 되겠습니다.