목표
- Xilinx 사의 Zynq SoC 에서 동작하는 Linux Application 을 작성 및 컴파일 하고자 합니다.
환경
- Host OS : Windows 10
- Oracle VM VirtualBox (5.2.12 r122591)
- Guest OS : Xubuntu 18.04 (64bit)
설치도구
- Arm Cross Compiler
- git
- VS Code (editor)
Arm Cross Compiler
참고
- https://www.acmesystems.it/arm9_toolchain
- https://blog.thinkbee.kr/linux/crosscompile-arm/
- http://julrams.tistory.com/25
- https://stackoverflow.com/questions/16935168/cross-compile-helloworld-for-arm
Zynq SoC 는 ARM Core 를 사용하므로, 여기서 동작하는 Application 을 Build 할 수 있도록 Arm Cross Compiler 를 설치하도록 합니다.
설치
아래의 명령어를 사용하여 GCC, G++ 크로스 컴파일러와 도구들을 설치합니다.
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install libc6-armel-cross libc6-dev-armel-cross
$ sudo apt install binutils-arm-linux-gnueabi
$ sudo apt install libncurses5-dev
$ sudo apt install gcc-arm-linux-gnueabihf
$ sudo apt install g++-arm-linux-gnueabihf
이를 통해서 ARM에서 동작할 프로그램을 PC 에서 크로스 컴파일을 할 수 있습니다.
C 크로스 컴파일러 동작확인
설치한 ARM 용 C 컴파일러의 동작을 확인해보도록 하겠습니다. 아래의 프로그램을 작성하고, zynq가 장착된 보드에서 프로그램을 실행해보도록 합니다.
▼ 시험용 예시 프로그램 (hello.c)
#include "stdio.h"
int main(void) {
printf("Hello world !\n");
return 0;
}
소스코드를 컴파일 합니다.
$ arm-linux-gnueabihf-gcc hello.c -o hello
생성된 실행파일(hello
)을 보드로 복사하여, 실행해보도록 합니다.
~$ scp hello root@[your_board_ip]:/root
보드에 접속하여 아래와 같이 프로그램을 실행합니다. 결과는 예상과 달리 동작하지 않습니다. 오류 내용은 다음과 같습니다.
$ ./hello
-sh : hello not found
다음의 명령어를 사용하여 파일의 속성을 확인합니다.
$ file ./hello
./hello: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=da22746ad5173464f07450c7de54643f865a89ca, not stripped
위 실행파일은 /lib/ld-linux-armhf.so.3 을 인터프리터로 사용하고 있지만, 제가 사용하는 Zynq 보드 내에는 해당이름으로 되어 있는 파일(라이브러리가)이 없기 때문에 발생하는 오류 입니다.
조치방법은 타겟 보드에서 다음과 같이 링크를 생성함으로써 해결할 수 있었습니다.
$ sudo ln -s /lib/ld-linux.so.3 /lib/ld-linux-armhf.so.3
혹은 해당 라이브러리를 복사하여 넣을 수도 있습니다.
또 다른 방법으로는 compile 시 -static
옵션을 사용하여 static linking 을 할 수도 있으나, 필요한 모든 라이브러리를 실행파일에 모두 포함하게 되므로 실행파일의 용량이 증가하게 됩니다.
$ arm-linux-gnueabihf-gcc hello.c -o hello -static
다시 실행하면 아래와 같이 정상 동작하는 것을 확인할 수 있습니다.
$ ./hello
Hello world
git
소스코드의 형상관리를 위하여 git
을 설치하였습니다. git
의 설치 및 동작확인은 아래와 같은 명령어를 사용하면 됩니다.
설치
$ sudo apt install git
$ git --version
VS Code
요즘 코딩시 편리하게 사용하고 있는 VS Code 를 설치하고, C/C++ 프로그래밍 환경을 구성하였습니다.
참고
설치
본 링크에서 VS Code 패키지를 다운로드 받습니다. 이후, 해당 파일을 설치합니다.
만약 GUI 인터페이스를 사용할 수 없다면, 터미널에 다음과 같은 명령어를 사용하여 설치할 수도 있습니다.
$ sudo dpkg -i code_1.29.1-1542309157_amd64.deb
$ sudo apt-get install -f # Install dependencies
다음의 스크립트를 사용하여 수동으로 저장소와 키를 등록하여 설치할 수도 있습니다.
$ curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
$ sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg
$ sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list'
저장소를 추가한 후, 다음과 같이 패키지를 설치할 수 있습니다.
$ sudo apt-get update
$ sudo apt-get install code # or code-insiders
새로 표시되는 화면에서 Install 을 누릅니다.
C/C++ 개발환경 설정
Build 환경 꾸미기
이제, Vs Code에서 앞서 작성하였던 hello.c 코드를 빌드를 할 수 있도록 구성하겠습니다.
Ctrl
+Shift
+P
를 눌러 Command Palette 를 엽니다.- Tasks: Configure Task 를 입력하여 검색 후 선택합니다.
Create tasks.json file from templates
를 클릭합니다. task runner template 목록을 확인할 수 있습니다. - 외부명령어를 실행하기 위하여 Other 를 선택합니다.
command
항목에 compile 을 위한 명령어를 넣습니다.- 그 외의 필요한 옵션은
args
항목에 넣습니다. Ctrl
+Shift
+B
를 눌러 Build 를 할 수 있도록group
항목에kind
를"build
로 추가합니다.
예를 들어 저의 경우는 앞서 Build 를 위하여 사용하였던 명령(arm-linux-gnueabihf-gcc hello.c -o hello
) 아래와 같이 구성하여 동작을 시험하였습니다.
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "Build",
"type": "shell",
"command": "arm-linux-gnueabihf-gcc",
"args": [
"hello.c",
"-o",
"hello"
],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
Ctrl
+Shift
+B
를 눌러 Build 를 진행합니다. VSCode Terminal 에 다음과 같이 명령어 실행 결과가 표시됩니다.
> Executing task: arm-linux-gnueabihf-gcc hello.c -o hello <
Terminal will be reused by tasks, press any key to close it.
이를 통해 성공적으로 build 가 됨을 확인할 수 있습니다.
'개발도구' 카테고리의 다른 글
VIM Color Scheme 변경하기 (0) | 2019.10.20 |
---|---|
스위치 모니터링 모드 설정을 통한 Wireshark 에서 패킷캡쳐 하기 (0) | 2018.11.29 |
안드로이드 - Hello World (0) | 2018.07.13 |
개발 및 시험을 위한 간단 웹서버 프로그램 (0) | 2018.07.07 |
Ubuntu(Xubuntu) Virtual Box 설치 후 화면 깨짐 (0) | 2018.06.28 |