티스토리 뷰

Raspberry Pi의 경우 간단한 C/C++ 프로그램은 그냥 보드 상에서 빌드를 하여도 가능하지만, 본격적인 application 개발 작업을 위하여 cross compile 로 빌드하는 것이 소스 관리 면이나 시간 단축 면에서 좋다. 


설정 방법은 Ubuntu 15.04 를 기준으로 설명한다. 본 내용은 “CODE CRAFT: CROSS COMPILING FOR THE RASPBERRY PI” 페이지를 참고하여 작성한 것이다. 


1. Host Program 설치

다음과 같이 cross compile 개발에 필요한 툴을 설치한다. 

$ sudo apt-get install build-essential

$ sudo apt-get install g++-arm-linux-gnueabihf

$ sudo apt-get install gdb-multiarch


build-essential은 ubuntu host 빌드에 필요한 gcc 등의 기본 툴을 설치한다. 

g++-arm-linux-gnueabihf 는 cross compile을 위한 g++을 설치한다. 이를 설치하면 gcc, binutils 등 의존성 있는 프로그램도 같이 설치된다. 

Ubuntu에는 arm compile환경은 gcc-arm-none-eabi, gcc-arm-linux-gnueabi, gcc-arm-linux-gnueabihf, gcc-arm-linux-arndroideabi 를 제공한다. EABI(Embedded Application Binary Interface)는 ARM의 C 호출 관행이라고 이해하면 된다. Gcc-arm-none-eabi는 RTOS와 같은 환경을 위한 것이고, gcc-arm-linux-gnueabi, gcc-arm-linux-gnueabihf는 linux를 위한 컴파일러이다. 뒤의 hf는 hardware floating point를 말한다. Raspberry Pi의 모든 버전에 있는 SOC는 hardware floating point를 지원하므로 gcc-arm-linux-gnueabihf를 사용한다. 

Gdb-multiarch로 여러 architecture를 지원하는 gdb도 설치한다. 


2. 시험 해 보기

제대로 컴파일, 디버깅 되는지를 다음과 같이 확인한다. 

Raspberry Pi의 IP는 192.168.0.10, Ubuntu는 192.168.0.20 로 IP를 가지고 있는 것으로 설명한다. 


Ubuntu에서 아래 코드를 작성하여 빌드한다. 

#include <iostream>

using namespace std;

 

int main() {

    cout << "!!!Hello World From Pi!!!" << endl;

    return 0;

}


빌드는 아래와 같이 실행하여 hello 파일이 생성되는지 확인한다. 

$ arm-linux-gnueabihf-g++ -g -o hello hello.cpp

$ file hello

hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=6eabae0d7840768461723df1c5d60dc1b88239fa, not stripped


hello를 scp를 이용하여 target board로 복사한다. 

$ scp hello pi@192.168.0.10:~


Target board에서 gdbserver로 실행시킨다.

$ gdbserver —multi 192.168.0.20:2001 ./hello

이때 주소는 target의 주소가 아니라 접속할 ubuntu PC의 ip 주소를 적는다. 이렇게 하면 gdbserver가 target에서 실행되고, host에서 gdb-multiarch로 접속할 수 있다.


Host에서 아래와 같이 접속하여 실행해 본다.

$ gdb-multiarch ./hello

(gdb) target extended-remote 192.168.0.10:2001

Remote debugging using 192.1678.0.10:2001

(gdb) c


정상적으로 실행되고 출력이 target에 나오면 모든 것이 완료된 것이다.


댓글
댓글쓰기 폼