크로스 컴파일러의 이름은 arm-linux-gcc 이런식으로 구성됩니다. 
오늘은 이놈의 이름이 왜 이렇게 붙어 들어 가는지 조금 더 알아 보겠습니다. 

이전 산책 시간에  arm- 까지는 알았죠..

그런데 인터넷에서 구하는 크로스 컴파일러를 보면 

arm-elf-gcc

이런 이름이 보입니다. 

예 두번째는 보통 운영체제와 관련되어 있습니다. 

세상에는 다양한 운영체제가 있습니다 .

운영체제와 크로스 컴파일러는 상호간에 밀접한 관련이 있습니다. 

어떤 부분이 서로 관련 있는 부분일까요?

예..

C 언어의 표준 라이브러리 부분입니다. 

이 표준 라이브러리 중 시스템 콜 부분이 운영체제와 밀접하게 관련 있습니다. 

이전 산책 시간에 printf() 함수도 결국 시스템 콜과 연결되어 있습니다 .

open() 같은 함수도 시스템 콜과 연결되어 있죠

이런 함수들은 모두  C 언어 표준 함수 입니다. 

그런데 

만약 여러분이 펌웨어를 작성한다고 합시다. 

요즘 가장 대세인 STM32 시리즈 는 

저렴하고 간단한 용도로 사용되는 ARM 에 가장 대표적인 MCU입니다 

자 이런 프로세서에 펌웨어를 작성합니다. 

아마 개발자는 익숙한 printf() 함수를 디버깅 용도로 구현하고 싶습니다 .

그런데 printf() 함수는 원래 C 표준 함수죠..

그런데 우리는 운영체제를 펌웨어에 넣기는 무리죠...

그럼 어떻게 하죠?

그렇습니다. 

없으면 만들어야 하죠...

여러분이 직접 printf() 함수를 구현해 주어야 합니다 .

인터넷을 뒤지면 printf()를 정말 초 간단 형태로 구현해 주는 부분이 있습니다. 

또 

여러분이 C 언어에서 흔히 사용하는 strcmp()  함수

이런 것도 역시 

C 표준 함수죠...

이 함수도 직접 만들어 주어야 합니다. 

그렇다면 결국 표준 라이브러리는 필요 없겠죠...

이런 경우라면 운영체제도 필요 없습니다. 

그냥  C 언어를 컴파일 해 주면 됩니다. 

여러분은 이런 헤더파일을 쓸 필요도 없습니다. 

#include <stdio.h>

만약 필요하면 이 헤더파일도 직접 만들어야 합니다. 

이런 경우라면 

크로스 컴파일러의 구성이 조금 더 간단해 집니다. 

binuitls
gcc

필요하다면  gdb 

이렇게 운영체제가 없을때라도 

gcc 는 

binutils 와 호환되어야 합니다. 

이런 호환성에 근거에 ELF 라는 것이 있습니다. 

ELF 는  Executable and Linkable Format 의 약자 입니다 

즉 실행 가능하고 링크 가능한 포맷이라는 겁니다. 

이전에는 이렇게 불렸습니다. 

Extensible Linking Format

즉 확장가능한 링크 포맷이라고도 했습니다 .

어찌되었든 

컴파일 결과는 ELF 포맷이어야 한다는 겁니다. 

그래서 

arm-elf-gcc 

라는 이름이 붙은 겁니다 .

즉 컴파일 결과물이 ELF 로 나오고 그외에는 특별한 기능이 없다는 것이죠...

즉 

arm-elf-gcc라고 이름이 붙었다면 

여러분은 그냥 펌웨어용이구나 하면 됩니다. 

부트로더나 정말 필요하다면 커널까지 이렇게 이름 붙은 컴파일러를 사용할 수 있습니다 .

그렇다고 커널을 컴파일 할때 arm-elf-gcc 를 사용하지는 마십시오..

조금 고생할 가능성도 있습니다. 

그런데 이런 이름이 붙은 경우도 있습니다. 

arm-elf-eabi-gcc

이건 이전에 바이너리 호출 규약이 ARM 에서는 abi 였습니다 .

매우 당연한 포맷이라 그냥 이 부분을 생략했죠

원래 쓰라면 이렇게 쓸수도 있었던 겁니다. 

arm-elf-abi-gcc

그런데 ARM 에서 임베디드용으로 EABI 라는 규칙을 만들었죠..

이전 산책길에 언급했던 부분입니다. 

ABI 와 EABI는 서로 호환되지 않습니다 

그래서 크로스 컴파일러도 조금 구별해야 할 필요가 있어서 

arm-elf-eabi-gcc

라고 씁니다.

자 그런데 크로스 컴파일러를 구하다 보면 이런 이름도 있습니다. 

arm-none-eabi-gcc

예 이게 조금 더 일반적인 이름이 될 수도 있습니다. 

여기서 요즘 나오는  gcc 는 기본이 ELF 죠..

그래서 굳이 ELF 란 이름을 붙이지 않다도 된다는 겁니다.

여기서 조금 정리하면 크로스 컴파일러 이름은 

다음과 같은 형식으로 이름 붙여 집니다 .

[컴파일 결과로 수행되는 프로세스명]-[운영체제명]-[기타]-[컴파일러 구분]

이런 규칙은 완전하게 강제적인 것은 아니고요 

상호간에 이렇게 하자는 규정입니다. 

그래서 그때 그때 달라집니다.

그.러.나.

강제적이지 않지만 이 규칙을 지키지 않으면 크로스 컴파일 하는 과정에 

많은 어려움을 겪습니다. 

가급적 지키는 것이 개발자가 스트레스 덜 받고 오래 사는 지름길입니다. 

자 다시 한번 살표 봅시다. 

[컴파일 결과로 수행되는 프로세스명]-[운영체제명]-[기타]-[컴파일러 구분]

[컴파일 결과로 수행되는 프로세스명]은 

설명 그대로 컴파일 결과로 생성된 목적물(프로그램)이 수행되는 프로세서의 구분입니다. 

arm  이려면 arm-  이런식으로 만들어 지겠죠?

[운영체제명]은 컴파일 결과로 생성된 목적물(프로그램)이 수행되는 운영체제 환경입니다. 

생략이 가능하기도 하고 쓸수 있습니다 .

에를 들어 arm 에서 사용되는 크로스 컴파일러 명은 이런식으로 여러가지 이름들을 가지고 있을 수 있죠

arm-linux-
arm-none-
arm-generic-

각각을 살펴 보면 

arm-linux- 은 linux 환경에 특화 되었다는 의미 입니다 .
arm-none-   은 운영체제가 없다는 의미 입니다 .
arm-generic- 은 일반적인 다양한 용도로 사용된다는 의미이기는 하지만 보통 linux 에 특화 되었다고 보시는 것이 맞습니다. 

헥...헥...

오늘은 여기까지만 걷죠...

저질 체력이다 보니 오래 못 걷습니다.