본문 바로가기
컴퓨터 관련/Linux || Unix

[Linux] 크로스 컴파일러(Cross Compiler) 정리.

by _BlankSpace 2017. 6. 7.

 0. 글을 들어가기 전에.. 

크로스 컴파일러.. 


컴파일러인데 엇갈리게 컴파일을 하는 건가? 다른 환경에서 컴파일을 한다는 소리인가? 


제가 처음 접하게 되었을 때, 상당히 혼란을 주었던 단어였습니다.


지금도 계속해서 쓰고는 있지만 확실하게 아는 건 아닙니다. 그래서 크로스 컴파일러라는 용어를 정리하고자 합니다.


어찌되었든 정리한다면 더욱 이해할 수 있는 프로그래밍을 할 수 있지 않을까요.


 1. 크로스 컴파일러란? 

우선 위키백과에서는 간단하게 다음과 같이 정의하고 있습니다.


크로스 컴파일러는 컴파일러가 실행되는 플랫폼이 아닌 다른 플랫폼에서 실행 가능한 코드를 생성할 수 있는 컴파일러.

크로스 컴파일러 툴은 임베디드 시스템 혹은 여러 플랫폼에서 실행파일을 생성하는 데 사용이 된다.

이것은 마이크로 컨트롤러와 같이 컴파일이 실현 불가능한 플랫폼에서 컴파일하는 데 사용한다.


즉, 컴파일이 불가능한 곳에서 컴파일을 하여 실행파일을 생성하는 데 사용하기 위한 것으로 파악할 수 있을 것 같습니다.


그럼 다시 자세하게 정리하겠습니다.


보통 우리는 PC 라는 동일한 환경에서 프로그램을 작성하고 있습니다. 이 곳에서 프로그램을 설계하고, 컴파일하여 실행파일을 생성하여 수행까지 가능합니다.


위에서 말한 것처럼 동일한 환경에서 동작되는 컴파일러와 이로인해 생성되는 실행 파일을 동일한 환경에서 수행할 수 있다면 이러한 컴파일러를 네티이브(Native) 컴파일러라고 합니다.


그럼 이와 반대의 개념도 있겠죠? 이것을 바로 크로스(Cross) 컴파일러라고 합니다.


크로스 컴파일러는 컴파일러가 동작하는 시스템과 컴파일러에 의해서 생성된 실행 파일이 동작하는 시스템이 다를 때를 말합니다.


따라서 임베디드 시스템을 개발할 때는 이러한 크로스 컴파일 환경을 구축해야 합니다. 그 이유는 개발 환경은 보통 PC 이고, 실행 파일이 동작하는 시스템은 다른 환경인 임베디드 시스템일 것이기 때문입니다.


이 말은 PC와 같은 구조를 갖는 임베디드 시스템이라면 따로 환경을 구축하지 않아도 된다는 말도 되겠습니다.


 2. 크로스 컴파일러는 기존의 컴파일러와 다르다.?

물론, 다른 환경에서 컴파일이 가능하도록 만드는 것이므로 다를 것입니다.


하지만 그 부모? 는 같다고 합니다.


먼저, gcc 라는 것을 알아야 됩니다. gcc는 많이 들어보셨을 겁니다. 보통 리눅스 유저라면요.


gcc는 현재까지 인지는 모르겠지만, 많은 프로세서를 지원할 수 있는 컴파일러라고 합니다.


따라서 gcc는 한 가지의 컴파일러라고 할 수 없다고 말하고 싶습니다. 한정된 것이아니고, 다양한 모습으로 변할 수 있다는 것입니다.


이 말은 다른 내용으로 바뀐다는 뜻이 아니라, 서로 다른 프로세서에서도 동작 할 수 있는 실행 파일을 만들 수 있도록 설계되어 있다는 말입니다.


기존에 i386에서 동작하는 gcc를 아예 다른 프로세서에서 동작하는 실행 파일을 만드는 gcc로 바꾸면 문제가 생기겠죠? 왜냐하면 그 뒤로는 i386에서 동작하는 프로그램을 만드는 데 제한이 있을 것이기 때문입니다.


따라서 우리가 사용할 때는 이름만 바꾸어서 사용한다고 합니다. 저도 사용하고 있습니다만, 보통 arm 계열의 프로세서에서 동작하는 실행 프로그램을 만들기 위해서는 arm-linux-gcc와 비슷하게 사용하는 것처럼 말입니다.


 3. 정리 

인터넷에 여러 글들을 보면서 제 나름대로 정리해봤습니다. 크로스 컴파일러를 직접 사용하고 있기 때문에 저에게는 어느정도 이해할 수 있는 내용이었던 것 같습니다.


그와 반대로 아직 사용하지 않는 분들이라면 이해하기 힘든 부분일 수도 있겠습니다.


하지만 임베디드 시스템을 개발하기 위해서는 꼭 필요한 내용이라고 생각하네요. 제 글이 아니더라도 여러 글들을 보시면서 이해하셨으면 좋겠습니다.


임베디드 시스템을 개발하게되면 일의 양때문에 힘든 것이 아닌 것 같습니다. 테스트를 하기 위한 시간이 오래 걸린다는 게 문제인 것 같았습니다. 물론 저야 초보 개발자 이므로... 모든 분들이 공감하실 지는 모르겠습니다만..


여튼, 테스트를 줄이기 위해서는 실수를 줄이고 정확한 프로그래밍이 가장 중요한게 아닐까 싶습니다. (물론 이게 쉬운 것이였다면, 모든 프로그래머가 이미 해결한 일이겠지만요..)


그럼 이만 글을 줄이겠습니다. 글을 읽어 주셔서 감사합니다.


참고 자료 출처: 

https://ko.wikipedia.org/wiki/크로스_컴파일러

http://lowchen.tistory.com/195


제 글이 도움이 되셨거나 공감이 되시는 부분이 있으셨다면, 밑에 있는 공감 버튼 한 번씩 꾸욱 눌러주시면 감사하겠습니다.


공감 버튼은 저에게 큰 도움이 됩니다. 감사합니다.

댓글