B001_01.jpg



안녕하세요.

 

유형석입니다.


크로스 컴파일에 대해서 소개를 해 드리려고 합니다.


1. 크로스 컴파일

    

    분명 제대로 컴파일 했는데 왜 보드에서 실행이 안되지?

    하라는 대로 했는데 왜 안될까?


    i386에서 주로 작업 하신 분들이 겪는 증상이라 봅니다.

    우분투에서 열심히 컴파일 해서 아무리 보드에서 실행해도 오류만 나오고..


    그건 바로 컴파일러를 잘못 선택해서 사용하고 계셔서 그렇습니다.

    (물론 다른 이유가 있을 수 도 있겠지만 지금은 크로스 컴파일이 중점이니 넘어갑시다~으하하)


    일단 크로스 컴파일이 뭔지 알아봅시다.


    자 이해 하시기 편하도록 아래와 같이 예를 들어 보았습니다.


    corss_01.png


    i386계열이 영어고 ARM이 일본어라고 예를 들어봤습니다.

    C언어는 한국어라고 봅시다.


    제가 한국어로 영어나 일본어를 쓰는 사람에게 아무리 떠들어도 그사람은 뭐라고 하는지 이해하지 못하겠죠?

    그렇기 때문에 통역사가 필요 하게 됩니다. 그 통역사를 컴파일러라고 합니다.


corss_02.png  


    그림으로 그려보면 위처럼 나오겠죠?

    저렇게 컴파일 했을때 i386계열의 CPU를 쓰고 있다면 바로 실행이 될겁니다.

    하지만 ARM 계열이면 일본어니깐 저렇게 만들어도 알지 못하겠죠?


    그렇기 때문에 ARM을 쓰기 위해서 한국어를 일본어로 바꿔줘야 합니다.

    이렇게만 말해 놓으면 왜 크로스인지 이해가 안됩니다.


 corss_03.png corss_04.png


    i386에서 i386으로 컴파일 하는 이유는 i386을 타깃으로 하여 바이너리 파일을 실행 하기 위해서 입니다.

    하지만 타깃 시스템이 ARM일 경우는 타깃 시스템(ARM)이 컴파일 하는 시스템(i386)과 일치 하지 않습니다.

    이럴 경우 그냥 컴파일가 아닌 크로스 컴파일이라고 하고 있습니다.

    뭐 이렇게만 보면 ARM CPU에서 i386 바이너리를 만들어도 크로스 컴파일러라고 할 수 있겠네요.


2. 이유


  그런데 왜 ARM은 크로스 컴파일을 할까요?


    그 이유에는 몇가지가 있습니다.

    일단 요새는 용량도 많아지고 매우 빨라졌지만 얼마전만 해도 ARM에 컴파일러와 수많은 라이브러리를 탑제 하기에는

    용량이나 퍼포먼스가 매우 좋지 않았습니다.

    때문에 퍼포먼스가 매우 뛰어난 i386계열에서 컴파일을 하고 nfs등을 사용하여 ARM 계열에서 테스트를 많이 합니다.

    요새 ARM도 퍼포먼스가 좋아 졌다 하지만 그건 모바일폰에 들어가는 씨리즈일뿐 자동차나 네트워크 장비에 들어 갈 경우

    높은 퍼포먼스도 필요 없고 용량도 한정적으로 가져야 가격대비 성능비를 뽑아낼 수 있습니다.

    때문에 크로스컴파일을 i386에서 수행 한다~ 저는 그렇게 생각 하고 있습니다.


    일반 적으로 ARM일 경우는 컴파일러에 "arm-어쩌고-저쩌고-gcc" 이렇게 쓰여져 있을겁니다.

    arm이 붙어 있지 않으면 일반적으로 ARM용 컴파일러가 아니니 잘 확인해 보시기 바랍니다.


    또한 컴파일러의 경우 버전이 무조건 높다고 좋은게 아닙니다.

    컴파일러의 경우 업데이트 되면서 약간씩 변화가 생기는데요.

    3.x번대의 컴파일러를 기준으로 제작한 프로그램이 4.x에서는 제대로 컴파일이 안되는 상황도 발생 하게 됩니다.

    물론 컴파일을 못하는건 아니지만 유저가 일일이 수정해서 고쳐줘야 합니다.


    그리고 테스트보드를 구매 하셨을 경우는 꼭!! 구매처에서 알려준 컴파일러를 사용하시길 바랍니다.

    안그러면 이리 꼬이고 저리 꼬이고 컴파일 환경 만들다가 일주일이 갈수가 있습니다.emoticon


    이번주에는 여기까지!


    짧은 글 읽어 주셔서 감사합니다!