[ BBB - yocto (4) ] 크로스 컴파일

1) c컴파일러

c컴파일러는 다들 알다싶이 우리가 c언어로 작성한 파일을 어셈블리에서 바이너리로 변환해주는 역할을 하는 코드야


컴파일을 하면 c언어 -> 어셈블리 -> 바이너리


이런식으로 바뀌지. 


리눅스에서는 여태까지 에디터가 해줬던 컴파일을 직접 해줘야 해. 간단하게 실습을 해보자


코드를 컴파일러를 사용해서 바이너리 파일로 변환해 줄거야


파워쉘에서 wsl키를 쳐서 wsl로 진입해줘

cd ~
mkdir source_code
cd source_code
code .

vscode가 열릴탠데 여기서 code .을 치면 현제 디랙토리를 workplace로 설정해서 열게 돼.


ctrl + shift + ~(물결선) 누르면 터미널이 열려


여기서 code main.c를 쳐주자

code main.c

main.c라는 파일이름으로 열린걸 볼 수 있어

#include <stdio.h>

int main()
{
    printf("hellow world\n");
}

소스코드 적은뒤에 ctrl + s 눌러서 저장해주고, 


다시 터미널로 돌아와서

gcc -o main main.c

자 이렇게 하면 gcc라는 컴파일러를 사용해서 main.c 코드를 사용해 main 이라는 파일을 뱉어내게 돼


gcc 명령어에 대해 설명을 좀 하면


사용법은 gcc -o [바이너리 파일 이름] [소스코드들] [링크 옵션]


이런식으로 사용해


gcc : c컴파일러

-o : 바이너리 파일의 이름을 지정하는 옵션 뒤에는 반드시 바이너리 이름이 따라나와야 함

main : 바이너리 이름

main.c : 소스코드


더 자세히 알고 싶으면 터미널에서 'man gcc'를 쳐보면 됨

chmod +x main
main.c

실행 권한을 추가해보고 실행하면 hellow world!를 찍어줄거야.


자 여기까지가 컴파일하는 과정이고, 이제 비글본에서 바이너리 파일을 실행 해볼건데...


어떻게 하는지 알려면 크로스 컴파일의 개념에 대해서 알아야해








2) 크로스 컴파일과 네이티브 컴파일


크로스 컴파일 : 다른 환경에서 빌드해서 바이너리 파일만 빼와서 쓰는 것


네이티브 컴파일 : 같은 환경에서 빌드하는 것, 아까 위에서 한게 네이티브 컴파일이야.


비글본을 예로 들어 설명하자면 비글본내에서 소스코드를 짜고 gcc를 이용해 컴파일함

-> 네이티브 컴파일


PC에서 비글본에 쓸 소스코드를 작성하고 컴파일하여 비글본에 전송하여 사용

-> 크로스 컴파일


이런 개념이야


아까 위에서 빌드한 파일 걍 보내서 하면 안됨?

-> 안됨, 왜냐하면 아키텍쳐가 다르기 때문이야


우리가 쓰는 환경은 64비트 윈도우의 경우 x86 아키텍쳐이고, 비글본은 32bit hardware floating 아키텍쳐야. 


따라서 아키텍쳐에 맞는 컴파일러를 사용해서 바이너리 파일을 만들어 줘야해


x86 전용으로 빌드된 바이너리 파일은 32bit hf인 비글본이 실행할 수 없어.


자 비글본이 알아먹을 수 있도록 크로스 컴파일을 하기 위해서 크로스 컴파일러를 설치할거야

sudo apt-get install gcc-arm-linux-gnueabihf
#다운로드 완료후
arm-linux-gnueabihf-gcc -o main main.c

이게 크로스 컴파일이야.


컴파일을 완료하면 file 명령어로 얘가 무슨 아키텍쳐의 실행 파일인지 알 수 있어

file main
main: ELF 32-bit LSB pie executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, BuildID[sha1]=683dd8007db2433f3547cbe5e6b88d888bf40a65, for GNU/Linux 3.2.0, not stripped
자 보면 32비트 arm으로 나오지? 아까 gcc로 컴파일 한걸 찍으면 

main: ELF 64-bit LSB pie executable, x86-64, ~~
64비트 x86 전용으로 컴파일 된 걸 볼 수 있어

크로스 컴파일 된 파일을 ~/share로 옮겨주자

mv main ~/share

자 이제 다운로드 후 실행만 남았어.


3) 다운로드 하기(테라텀 zmodem 사용)


비글본에서 로그인 해주고 zmodem으로 파일 전송을 할거야

lrzsz라는 이미지를 깔았었는데

lrzsz는 터미널 파일 전송을 해주는 이미지야

rz : 파일을 zmodem 수신
sz : 파일을 zmodem 전송

비글본 터미널에서 rz를 치면 파일을 전송받을 수 있어

이러면 파일 전송 받기 대기 상태가 된거야

테라텀에서 

alt -> f -> t -> z -> s

전송 파일을 선택해주면 돼. C:\share에 main이 있을거야

chmod +x
./main

메인을 실행해보면 hellow world가 찍힐거야


댓글

이 블로그의 인기 게시물

[ BBB - yocto (9) ] 장치트리(DEVICE TREE)

[ BBB - yocto (11) ] uart

[ BBB - yocto (5) ] makefile 작성법과 컴파일 자동화