Egloos | Log-in
F/OSS study
F/OSS study
크로스 컴파일
이 글은 Ian Lance Taylor님의 블로그에 실린 글을 저자의 동의를 거쳐 번역한 것입니다.
참고로 Ian님은 gcc 및 binutils의 핵심 개발자로 활동하고 있으며
최근에는 binutils의 새 링커인 gold와 gcc의 go 언어 지원 기능을 개발하신 분입니다.

원문 보기:
   http://www.airs.com/blog/archives/492

GCC는 크로스 컴파일에 대한 지원 기능을 모두 갖추고 있다.
크로스 컴파일이란 이 후에 다른 머신 상에서 동작할 프로그램을 빌드하는 것을 말한다.
하지만 컴파일러, 라이브러리 및 기타 도구들을 포함한 완전한 크로스 툴체인을 새로 빌드하는 것은 꽤나 고통스런 작업이다.
크로스 툴체인을 빌드하는 과정에 익숙치 않은 많은 사람들은 항상 같은 반응을 보인다:
"이렇게까지 어려울 필요가 있을까?". 하지만 실제로 그렇다.

기본적인 문제는, 크로스 툴체인은 서로 다른 여러 구성 요소들로 이루어지며,
그러한 각 구성 요소들은 별개의 프로젝트로 진행되기 때문에
서로 다른 배포 주기, 서로 다른 개발자, 서로 다른 목표를 가진다는 것이다.

이와 비슷한 문제는 (규모가 더 크긴 하지만) 운영 체제 전체를 만드는 경우에도 일어나게 된다.
이 경우 운영 체제 혹은 배포판 제작 작업은 별도의 프로젝트로 진행되며,
그 프로젝트에서는 단지 여러 프로젝트들을 조정하고 상호 협력해 나갈 수 있도록 총괄하는 역할 만을 수행한다.
하지만 크로스 툴체인에 대해서는 이러한 총괄 프로젝트가 존재하지 않는다.
(좀 더 정확히 말하면, 몇몇 회사에서 이러한 작업을 총괄하여 제작한 툴체인을 구매할 수는 있을테지만,
이러한 작업을 해 주는 F/OSS 프로젝트는 존재하지 않는다.)

만약 여러분이 크로스 툴체인을 빌드하고 싶다면 먼저 이러한 상황을 이해해야 한다.
크로스 툴체인을 만드는 것은 힘들고 지저분(?)한 작업이다.
일반적으로 작업이 제대로 이루어지지 않는다면, 작업이 잘못된 방향으로 진행되고 있는 것은 아닌가 생각하게 될 것이다.
하지만 크로스 툴체인의 세계에서는 반드시 그렇지는 않다.
물론 정말로 여러분이 잘못된 방향으로 작업을 진행하고 있을 수도 있지만,
단지 진행 중인 작업이 잘 이루어지지 않는다고 해서 방향 자체가 잘못된 것이라고 가정하지 않기를 바란다.

다음으로 알아두어야 할 것은 용어이다.
  • host 시스템은 컴파일러 및 기타 도구들이 동작하는 환경을 말한다.
  • target 시스템은 크로스 툴체인을 이용해 빌드한 프로그램이 실행될 환경을 말하는 것이다.
  • 흔치 않은 경우이지만) build 시스템도 다른 경우 (역주: 일반적으로는 크로스 툴체인을 빌드하는 경우에도 host 시스템과 build 시스템은 같다) 이는 실제로 (크로스) 컴파일러를 빌드하고 있는 환경을 말한다.

GCC 및 다른 도구들은 이러한 시스템 환경을 configure 스크립트 실행 시에
--host, --target, --build 옵션을 통해 지정할 수 있다.
host와 target 시스템이 동일하다면 이는 native 툴체인이라고 말한다.

세상에는 많은 종류의 target 시스템이 존재한다.
이들은 모두 특정한 종류의 시스템 라이브러리 (일반적으로 libc라고 한다)를 필요로 한다.
GCC 자체로는 시스템 라이브러리를 제공하지 않는다.
따라서 스스로 자신의 target 시스템에 적합한 시스템 라이브러리가 무엇인지 알아내야 한다.
  • 만약 target 시스템 상에 GNU/Linux를 사용해야 한다면 아마 glibc 혹은 uClibc가 필요할 것이다. 하지만 안드로이드의 경우 bionic 라이브러리를 사용하며, 그 외에도 이용할 수 있는 몇 가지 시스템 라이브러리가 존재한다. glibc는 대부분의 일반적인 native 시스템에서 사용된다. uClibc는 임베디드 환경을 위해 설계되었으며 크로스 컴파일에 관한 문서화가 잘 되어 있다.
  • 만약 target 시스템 상에 Windows를 사용해야 한다면 MinGW 혹은 Cygwin이 필요할 것이다. 이들은 크로스 컴파일 작업이 꽤나 간단하다.
  • 만약 target 시스템 상에 다른 (완전한 기능을 갖춘) 운영체제를 사용해야 한다면 (예: Solaris) 기존에 동작 중인 시스템에서 시스템 라이브러리와 모든 헤더 파일들을 복사해 와야 할 것이다.
  • 만약 target 시스템 상에 RTEMS나 eCos와 같은 임베디드 운영체제을 사용해야 한다면 해당 운영체제에서 시스템을 구축하는 법을 설명한 문서를 제공할 것이다.
  • 마지막으로 기존 운영체제의 도움 없이 처음부터 시스템을 새로 구축하는 경우라면, GCC와 함께 newlib이라는 시스템 라이브러리가 종종 사용된다. newlib을 사용하려면 시스템의 I/O를 처리하기 위한 몇 가지 BSP (Board Support Package - 역주: 간단히 드라이버라고 생각해도 무방할 듯)가 필요하다. libgloss 디렉터리에 몇몇 예제가 포함되어 있다.

위의 선택에 따라 크로스 툴체인을 빌드하기 위한 방식이 달라질 수 있으며,
여기서 모든 경우에 대한 완전한 레시피를 다루지는 않을 것이다.
또한 완전한 레시피를 작성해 두었다 하더라도 시간이 흘러감에 따라 그 내용이 변경될 수 밖에 없다.

기본적으로는 통합 트리(one-tree) 빌드와 개별 트리(separate-tree) 빌드라는 두 가지 접근 방식이 존재한다.

통합 트리 빌드 방식은 Cygnus 사에서 근무하던 K. Richard Pixley님과 David Zuhn님이 개발하였다.
이 방식의 기본 아이디어는 모든 소스 코드를 하나의 디렉터리로 합치는 것이다.
실제로 gcc, binutils, gdb, newlib, cygwin/MinGW의 소스 트리를 하나의 디렉터리로 복사하여 빌드할 수 있다.
이 프로젝트들은 모두 동일한 최상위 configure 스크립트와 Makefile을 공유한다.

하지만 이 방식을 사용하기 위해서는 모든 소스들이 동일한 날짜/시간을 갖도록 맞춰주어야 한다.
여기에는 (libiberty와 같은) 여러 공유 라이브러리들이 (중복하여?) 포함되어 있으며 이들은 모두 동일해야 한다.
만약 서로 다른 시간으로 설정된 소스 트리를 섞어서 사용한다면
(이를테면 각각의 프로젝트 별로 따로 제공하는 공식 버전을 사용한다면) 여러 복잡한 문제들을 겪게 될 것이다.
개인적으로 이 방식을 이용하는 것을 그리 권장하지 않는다.

통합 트리 빌드 방식은 glibc에는 사용할 수 없다. glibc를 사용하기 위해서는 개별 트리 빌드 방식을 사용해야 한다.
필자는 약 20년 전에 Cygnus 사의 release manager로 근무했었지만, 요즘은 보통 개별 트리 빌드 방식을 이용한다.
개별 트리 빌드 방식을 사용하면 서로 다른 프로젝트들을 별도로 빌드하면 된다.
하지만 이 때 모든 프로젝트에 대해 동일한 configure 옵션을 사용해야 한다는 것을 반드시 기억하자.
일반적인 과정은 다음과 같다.
  1. GNU binutils을 설정 (configure), 빌드 (make), 설치 (make install)
  2. GCC 설정. "make all-gcc" 실행 (이 명령은 기타 라이브러리를 제외한 컴파일러 자체만을 빌드하는 명령이다). 설치 ("make install-gcc" 실행)
  3. 시스템 라이브러리 설정, 빌드, 설치
    • 만약 기존의 시스템에서 라이브러리를 복사해 오는 경우라면 특별히 해야할 일은 없다. 대신 라이브러리와 헤더 파일들을 특정한 디렉터리에 복사한 후, 다른 도구들을 설정할 때 --with-sysroot 옵션을 통해 해당 디렉터리를 가리키도록 해야 한다.
    • newlib이나 cygwin 라이브러리를 빌드하는 경우는 별 문제가 없을 것이다. 이들은 앞서 빌드한 크로스 컴파일러를 통해 잘 빌드될 것이다.
    • 만약 glibc를 빌드하는 경우라면 configure 스크립트 실행 시에 주의를 기울여야 한다. 아직 우리가 빌드한 컴파일러가 완전한 프로그램을 빌드하지 못하는 상태이기 때문이다. 불행히도 이 단계에서 발생할 수 있는 문제들에 대해서는 필자도 그리 익숙하지가 않다. 이에 대한 자세한 이슈 및 보조 스크립트들에 대해서는 crosstool-ng 프로젝트를 살펴보도록 하자.
  4. GCC의 다른 구성 요소들 (주로 보조 라이브러리들)을 빌드하고 설치

이 단계에서 본다면, 아마도 크로스 툴체인을 만드는 일이 별 것 아니라고 생각할 수도 있을 것이다. 하지만 다음을 생각해 보자.
만약 (여러분이 원하는) 특정 host 및 target 환경에서 동작하는 특정 (버전의) 크로스 툴체인을 빌드하고자 하는 경우
해당 조합에 대해서 세계에서 가장 첫 번째로 시도하고 있는 사람이 될 수 있는 약간의 가능성이 존재한다.
또한 (여러분이) 빌드를 시도하고 있는 특정 조합에 대해서 개별 프로젝트의 주요 개발자들 중 어느 누구도 이를 시도해보지
않았을 가능성이 농후하다. 이는 빌드 과정에서 몇몇 미묘한 문제들을 겪게될 가능성이 아주 크다는 의미이며,
즉 어떤 프로젝트 (소스)는 빌드되지 않을 수도 있다는 것을 말한다.

필자가 Cygnus 사에서 release manager로 근무하던 당시, Cygnus에서는 3개월마다 새로운 버전(release)을 빌드했었다.
필자의 주요 업무는 빌드 과정에서 발생하는 모든 미묘한 문제들을 해결하는 일이었다.
이러한 도구들을 이용해 업무를 수행했던 경험은 필자에게는 매우 좋은 훈련이 되었다.

여러분은 아마도 시간이 흘러감에 따라 상황이 더 좋아졌을 것이라고 생각할 것이다.
하지만 실상은 그렇지 않다. 왜냐하면 아직 이러한 통합 과정의 개선 자체를 목적으로 하는 (dedicated)
프로젝트가 존재하지 않기 때문이다. 각각의 (개별) 프로젝트들은 항상 호환성을 해치는 방향으로 변경되며
이는 어떤 (잠재적인) 조합의 빌드를 불가능하게 만들 것이지만 아무도 이를 인식하지 못한다.

이 부분은 누군가가 (혜성처럼?) 나타나서 말끔히 정리해 주었으면 하는 분야이다.
하지만 그런 일은 쉽지 않다. 이러한 작업은 꾸준한 테스트와 패치 작업이 반복되어야 한다.
즉, 문제를 찾아내고 이 문제가 해결될 때까지 관련 개발자들을 계속 괴롭혀야하는 일의 연속이다.
또한 각 버전 사이를 넘나들거나 아직 배포되지 않은 코드들을 신뢰할 수 있는 방법을 통해 사용할 수 있어야 하고
이 모든 프로그램들을 알고 있어야 하며, 각각의 목표와 내부 구조를 이해하고 있어야 함을 뜻한다.

이러한 작업은 아무도 알아주지 않는 (혹은 고마워하지 않는) 일은 아니지만
거의 대부분의 프로그래머들은 크로스 툴체인을 사용하지 않으며
크로스 툴체인을 사용하는 개발자들도 대부분은 특정 업체에서 제공하는 툴체인을 사용하기 때문에
실제로 이러한 작업에 대해 고마움을 표현하는 사람을 만나기는 힘들 것이다.
하지만 누군가가 (GCC를 위해) 이러한 작업을 맡아준다면 매우 고맙겠다.
by namhyung | 2011/04/03 23:04 | System | 트랙백 | 덧글(3)
트랙백 주소 : http://studyfoss.egloos.com/tb/5506854
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented at 2011/04/07 12:34
비공개 덧글입니다.
Commented by namhyung at 2011/04/07 14:54
감사합니다.. 메일 보내드렸습니다. ^^
잘 보고 후기 남기겠습니다..
Commented by 이상훈 at 2011/04/20 02:18
안녕하세요 ~ 오랜만입니다.
개인적으로 4번이 정말 힘든 것 같습니다 ;;;

:         :

:

비공개 덧글

◀ 이전 페이지 다음 페이지 ▶

카테고리
General
Application
System
Kernel
Book
Tips
태그
gcc awk elf script computer-architecture SMP git C vcs sed memory perf build patch x86 emacs algorithm CAaQA3 scm blktrace documentation glibc compiler synchronization kernel linux block-layer binutils bash CARM
전체보기
이글루 파인더

최근 등록된 덧글
http://serbaserbiinfoterkini56..
by cakra at 09/22
informsi yang bagus dan b..
by cakra at 09/16
informsi yang bagus dan be..
by pordanaia at 08/05
최근 등록된 트랙백
Tod's Ferrari Homme
by Tods Pas Cher,Kodak did ..
Mocassin Femme
by Mocassins Homme, I got so..
natural garcinia cambogia
by
rss

skin by jiinny


X