1) GCC의 소개GCC(이하 gcc)는 FSF(Free Software Foundation : 자유 소프트웨어 재단)에서 추진중인 GNU(GNU is Not Unix) 프로젝트의 일환으로 개발된 공개 C 언어 컴파일러이다. 공개임에도 불구하고 gcc는 매우 뛰어난 성능과 안정성을 갖추고 있으며, 전세계의 해커들에 의해서 보완 발전되고 있다. 이런 이유로 gcc는 매우 다양한 유닉스 시스템에 이식되어 있으며, 특히 Linux 시스템의 경우 기본적으로 gcc를 시스템용 C 컴파일러로 채택하고 있다.2) GCC의 특징gcc의 여러 특징들 가운데 하나는 이식성(portability)이다. 이는 본래 GNU 프로젝트가 여러 유닉스 시스템 지원을 목표로 삼고 있으며 gcc 역시 그러한 특성을 물려 받았기 때문이다. 아마도 gcc는 가장 많은 하드웨어 플랫폼을 지원하는 C 컴파일러가 아닌가 싶다(실제로 지금까지 나온 거의 모든 CPU를 지원한다). 이러한 특징으로 gcc는 여러 플랫폼에 대하여 거의 동일한 개발환경(development environment)과 소스 코드 호환성(source code compatibility)을 제공한다. 개발자에게 있어서 개발환경은 매우 중요하다. 특히 CPU가 바뀜에 따라서 변화하는 개발환경은 개발자에게 매우 긴 적응 시간을 소비하게 만든다. gcc의 경우는 플랫폼에 상관없이 대부분의 컴파일러 옵션을 이용할 수 있다. 그리고 소스 코드 호환성 역시 중요한데, 예를 들면 x86 계열의 시스템에서나 PowerPC 또는 SPARC 계열의 시스템에서 약간의 소스 코드 수정만으로도 호환되는 프로그램 개발이 가능하다는 것을 의미한다. 이 역시 개발자가 다른 플랫폼을 지원하기 위해 소스 코드를 재작성하는 시간을 줄여주기 때문에 매우 중요한 점이다. 이외에도 많은 뛰어난 특징들이 있다. 자세한 사항들은 gcc homepage를 참고하기 바란다.3) 크로스 컴파일러(Cross Compiler)크로스 컴파일러를 이해하기 전에 먼저 호스트 플랫폼(host platform)과 타겟 플랫폼(target platform)이라는 용어를 먼저 이해해야 한다. 타겟 플랫폼은 크로스 컴파일러가 생성하는 오브젝트 코드가 실제로 수행되는 시스템을, 호스트 플랫폼은 크로스 컴파일러를 수행하는 시스템을 일컫는다. 예를 들어 펜티엄 컴퓨터 상에서 8051 C 컴파일러를 이용하여 8051용 오브젝트 코드를 생성하고 그 결과 코드를 롬에 담아서 8051에서 수행하였을 경우에, 펜티엄 컴퓨터는 호스트 플랫폼이 되는 것이고, 8051은 타겟 플랫폼이 된다. 여기에서 크로스(Cross-교차하다. 가로지르다. 즉, 플랫폼을 가로질러서 컴파일하다.)라는 말이 생긴 것이다. 따라서 호스트 플랫폼과 타겟 플랫폼이 같은 경우는 크로스라는 말이 붙지 않는다. 이 경우의 대표적인 예는 x86 호환 컴퓨터에서 Boland C 컴파일러를 이용해서 386EX(x86과 호환되는 임베디드용 프로세서)용 오브젝트 코드를 생성하는 경우이다.4) AVR-GCC와 크로스 컴파일러앞에서 말했듯이 gcc는 뛰어난 이식성을 가지고 있다. 이러한 특징을 가능하게 하기 위해 gcc는 플랫폼에 의존적인 부분과 플랫폼에 비의존적인 부분으로 모듈화되어 있으며, 각 모듈은 서로 특정한 규칙으로 인터페이스되어 있다. 따라서 플랫폼에 의존적인 부분만 수정하고 다른 모듈과 인터페이스를 맞추어 주면 새로운 플랫폼을 지원하는 gcc를 제작할 수가 있다. 사실 AVR-GCC(이하 avr-gcc)도 그런 방식으로 만들어졌다.gcc가 크로스 컴파일러로써 동작하기 위해서는 몇 개의 도움이 더 필요하다. 사실 gcc는 단지 C언어를 어셈블러로 변환하는 기능을 갖는다. 따라서 변환된 어셈블러를 오브젝트 코드로 변환 시켜주는 어셈블러(assembler) 그리고 여러 개의 오브젝트 코드를 하나로 오브젝트 코드로 병합하는 링커(linker)가 필요하다. 호스트 플랫폼과 타겟 플랫폼이 같은 경우는 어셈블러와 링커를 따로 제작할 필요가 없이 호스트 플랫폼의 것을 이용하면 된다(왜냐면 호스트 어셈블러와 링커가 생성하는 오브젝트 코드가 타겟과 호환되므로). 하지만 크로스 컴파일러의 경우 변환된 어셈블러를 타겟용 오브젝트 코드로 만들어줄 어셈블러와 링커가 필요하다(이를 각각 크로스 어셈블러와 크로스 링커라고 부른다).GNU 프로젝트에도 어셈블러와 링커가 포함되어 있다. 그러나 그것들은 크로스 플랫폼용으로 이용되지 않았었다. 적어도 Cygnus 사에서 크포스 플랫폼 지원을 하기 전에는 말이다. Cygnus는 최근에(약 1~2년전) 임베디드 시스템용 솔루션을 개발하고 상품화하는 과정에서 GNU 툴인 gas(GNU assembler, as라고도 불린다), ld(linker) 등을 크로스 플랫폼용으로 이식하였다. 그렇게 해서 나온 것이 Binutils이다.