gcc cross-compiler
글쓴이: soohyunc / 작성시간: 월, 2003/02/03 - 11:38오전
안녕하세요? 처음으로 질문 드리는데요...
개발을 하다보니, 다음과 같은 질문이 생겼어요.
gcc Cross-Compiler 라는 것을 build 해야한다는데, 이것이 어떤건지 생소합니다.
1) gcc cross-compiler는 무엇인지요?
2) gcc cross-compiler를 구축하려면 어디에서 어떤 소스를 받아서 어떤 방식으로 설치 해야하는지요?
제가 사용하는 OS는 SunOS 5.8 입니다.
감사합니다.
Forums:
[quote]1) gcc cross-compiler는 무엇인지요? [/q
임베디드쪽 프로그램을 작성하시나 보군요. ^^
대개 그럴때 크로스 컴파일러를 쓰게 됩니다.
임베디드 시스템의 경우 메모리나 CPU가 데스크탑 컴퓨터처럼 풍부(?)하지 못하고,
빈곤(?)한 경우가 많아서, 개발도구나 모니터 등을 제대로 갖추지 못하는 경우가 많은데요.
그럴 때, 데스크탑 컴퓨터에서 컴파일한 실행파일을 임베디드 시스템 등에서 실행하고자 할 때
크로스 컴파일러를 사용하게 됩니다.
이때 이 데스크탑 컴퓨터를 호스트라고 하구요. 크로스 컴파일된 실행파일을 내려받는 컴퓨터를
타겟이라고 지칭합니다.
예를 들어
Intel CPU기반의 호스트 PC에서 IBM 크로스 컴파일러를 이용해서 컴파일 한다면
IBM CPU기반의 임베디드 시스템에서 동작을 하겠죠. ^^
그리고 이러한 크로스 컴파일 환경을 만드는 도구들의 집합을 툴 체인이라고 합니다.
2.1 SunOS용 Binutils 다운로드 받기
http://rpm.rutgers.edu/rpm-html/binutils.html
2.2 크로스 컴파일러 설치 및 사용법
http://bytesex.org/cross-compiler.html
이 문서를 참고하세요. ^^
... Do It Now!!!
저두 써본적은 없는데요. D 일반적으로 크로스컴파일러 라는게 현재
저두 써본적은 없는데요. D
일반적으로 크로스컴파일러 라는게 현재의 플랫폼에서
다른 플랫폼내에서 실행되는 목적파일을 생성하는것입니다.
이를테면 X86 머신에서 ARM의 목적파일을
ARM gcc를 이용해서 생성해 내는것이지요..
물론 ARM을 타켓으로 생성했기 때문에 X86에선 실행이 안되겠죠.
그리고 이러한 크로스컴파일러는 주로 커널 제작등에 사용이 됩니다.
기본적으로 gcc는 크로스컴파일러에 대한 지원이 있구요.
gcc를 컴파일 할때 --target 등의 옵션으로 활성화 하는거 같습니다.
또한.. binutils, glibc등도 함께 타켓에 맞게 컴파일해야 할 것 같네요..
저두 그쪽은 초보인지라.. 잘 모르겠는데.. 도움이 됐을런지??? )
크로스 컴파일러
임베디드에서 프로그램( 어플리케이션)을 돌리기 위해서 그에 맞는 바이너리 파일이 필요하죠.
여기서 컴파일러는 소스 -> 어셈블리어
어셈블러는 어셈블리어 -> 기계어
로더는 기계어들 을 이쁘게 뭉쳐서 실행 가능한 파일로 만들어 주죠
그래서 크로스 컴파일러를 만들면 끝이 아니고, 다른 실행 파일을 만들기 위해선
전체적인 작업이 필요 하죠.
1) 빈유틸을 타겟 아키 텍쳐에 맞게 컴파일을 합니다. (여기에 어셈블러, 로더가 포함되는 듯 합니다. )
2) 그리고 컴파일러도 타겟에 맞게 컴파일을 하고요.
3) 라이브러리도 크로스 컴파일 된 것을 이용해서 다시 컴파일 합니다.
그러하면 간단한 환경은 구축 되었다고 할수있겠습니다.
sa-1110 보드는 falinux.com의 강좌가 매우 도움이 됩니다
1)에 대한 답변은 다른 분들이 잘 해 주신거 같으니.2)에 대해서만
1)에 대한 답변은 다른 분들이 잘 해 주신거 같으니.
2)에 대해서만 간단히 말씀드리겠습니다.
크로스컴파일러는 보통 chip 벤더들이 제공해 주는 경우도 있는데 질문의 내용으로 미루어보아 이것 보다는 gnu의 crooss toolchain에 대한 질문이라고 여기고 답변 드리겠습니다.
ftp://ftp.gnu.org/gnu에서 binutils, gcc, glibc 세개 디렉토리에서 적당한 버젼의 tool들을 다운 받으십시요. 간혹 툴들간에 의존성 문제가 있는 경우도 있으므로 도큐먼트를 한번 읽어보시고요. (예, glibc-2.3.1을 build 하려면 gcc-3.2 이상을 쓰셔야 합니다.)
다운 받은 소스들을 빌드합니다.
일반적으로 binutils -> static gcc -> glibc -> gcc 순으로 빌드합니다.
물론 이미 target platform용 컴파일러를 가지고 계신다면 굳이 static gcc는 build하지 않으셔도 됩니다.
빌드하는 법은 여느 툴들과 크게 다르지 않습니다.
configure --target=powerpc-mysys-linux-gnu --prefix=/usr/local/toolchain 블라블라...
make
make install
정도이죠.
경험에 따르면 binutils는 대개의 경우 별문제 없이 빌드되고 target 외에는 특별히 옵션에도 신경쓰지 않아도 되지 싶습니다.
static gcc는 기존에 가지고 있는 target platform용 컴파일러가 없을 경우인데 좀 복잡합니다. 먼저 kernel source 디렉토리의 Make 파일을 좀 손보셔서("arch := " 일 겁니다..) 커널 소스를 target platform용으로 config 합니다. make dep 까지 하셔서 target platform용 header를 생성하신 다음 이 header를 사용하고 --disable-shared 옵션으로 gcc를 configure 한 다음에 BOOT_LDFLAGS=--static 옵션을 줘서 make 합니다. 시스템 구성에 따라서 소소한 차이가 많을 수 있으므로 상세한 option은 build 메시지를 봐가면서 추가/삭제 하십시요.
처음하시는 거라면 기존의 컴파일러를 구해서 하시길 권합니다. 웬만한 플랫폼은 어렵지 않게 구하실 수 있을 겁니다. 기존 compiler로 gcc를 빌드하실때는 alias나 configure의 host, build,target, with-as, with-ld 옵션을 잘 조정하셔서 의도한 컴파일러가 호출되도록 해야 합니다. 이 부분도 각자 기존에 시스템을 어떻게 사용하고 있었는가와도 연관이 있기 때문에 build 메시지 봐가면서 고쳐봐야 합니다.
이렇게 gcc를 만들고 나면 glibc를 빌드합니다. glibc는 cpu에 따라서 적절한 옵션을 주면 어렵지 않게 build하고 install 할 수 있습니다.
glibc를 build한 컴파일러가 static gcc라면 glibc를 사용해서 다시 컴파일러를 빌드하시고 아니면 gcc -v 하면 나오는 spec 파일을 바꿔 주십시요. 이건 glibc-howto를 보면 나옵니다.
아참, gcc build하실때 enable-languges configure option로 gcc에서 사용할 language를 제한 할 수 있습니다. 보통 --enable-languages=c,c++ 정도거나 아예 c++도 없지 싶은데요...:)
예전에 비해 toolchain 빌드가 많이 쉬워졌지만 여전히 경우의 수가 많고 약간 까다로운 일이라서 아마 일회성 답변가지고는 한계가 많을 겁니다. 이어서 질문 올리시면 제가 아는한(별로 없지만...:?) 답변 드리죠.
댓글 달기