강좌 & 팁
글 수 2,412
2012.10.29 10:38:09 (*.52.177.29)
42787
크로스 컴파일러의 이름은 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 에 특화 되었다고 보시는 것이 맞습니다.
헥...헥...
오늘은 여기까지만 걷죠...
저질 체력이다 보니 오래 못 걷습니다.
아.. .커널 산책이 여기서 멈춰있네요...ㅜㅜ