cross compile

15
cross compile 교교 교교교 (projung)

Transcript of cross compile

Page 1: cross compile

cross compile

교차 컴파일 (projung)

Page 2: cross compile

목차1. 크로스 컴파일에 자주 등장하는 용어들2. 크로스 컴파일 환경 구축3. 크로스 컴파일 실습 하기

Page 3: cross compile

크로스 컴파일에 자주 등장하는 용어들i386 환경intel 80386 CPU

i686 환경intel 80686 CPU (Pentium Pro 이상급 )

x8632 비트 운영체제 , x32 기반 프로세서ex) 32 비트 처리 표현 “ 0xffffffff” == 8bit * 4 = 32bit“1111 1111 1111 1111 1111 1111 1111 1111”

x6464 비트 운영체제 , x64 기반 프로세서ex) 64 비트 처리 표현 “ 0xffffffffffffffff” == 8bit * 8= 64bit“1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111”

GCC(GNU Compiler Collection) 컴파일러우선 GCC 를 사용하는 이유는 무료이고 , Linux 와 함께 관리와 업데이트가 되고 있습니다 . GCC 안에는 C Com-plie 와 여러가지 유틸등이 포함 되어 있습니다 . 리눅스도 GCC 가 있으며 , 임베디드 시스템도 CPU 버전마다 ARM7, ARM9, ARM11, ARM Cortex .. 등이 있습니다 . 우리들은 CPU 에 맞는 GCC 버전을 다운받아 사용하면 됩니다 . 쉽게 말해 linux 용과 arm 용 컴파일러가 다릅니다 . 그러므로 생성된 바이너리도 달라질까요 ?직접 실습을 해서 알아 보시면 됩니다 .

Page 4: cross compile

크로스 컴파일에 자주 등장하는 용어들Target systemEmbedded System 환경이 말합니다 .

Host systemi386 인텔기반 cpu 환경을 말합니다 .

arm-linux-gnueabiEABI 는 ARM 에서 만들어낸 “ Embedded” ABI(Application Binary Interface ) 라고 합니다 .

arm 툴체인 종류arm-linux-gnueabi, arm-linux-gnueabihf, arm-none-linux-gnueabi-4.4.0_ARMv5TE

VFP(Vector Floating-Point)ARM 컴파일러는 소프트웨어와 하드웨어에서 부동 소수점 산술을 관리하기 위한 많은 기능을 제공합니다 . ( 소프트웨어지원 , 하드웨어지원 , 특정한 하드웨어 아키텍처와 IEEE 부동소수점 표준 준수 수준을 지정 가능 ) VFP 가 지원되는 CPU 가 있고 , 지원되지 않는 CPU 도 있습니다 . ARM Cpu 버전 마다 VFP 기능이 있는 것도 있고 , 없는 것도 있습니다 .

Page 5: cross compile

크로스 컴파일에 자주 등장하는 용어들임베디드 시스템이란 ?특수한 목적을 수행하기 위해 태어난 시스템이라고 생각하면 됩니다 . 단점은 일반 pc 보다 속도가 느리고 , 저장 공간도 제약이 많습니다 . ex) smart phone, ip camera, nvr, dvr, ip 공유기 , voip 단말기 , raspberry pi …

툴체인 (Toolchanin) 이란 ?“ 타겟 시스템”에서 프로그램 및 lib 가 인식해서 동작 될 수 있도록 개발에 필요한 “호스트 시스템”의 소프트웨어 (유틸리티 , 각종 gcc) 개발환경을 한데 묶어서 보통 Toolchanin 이라고 말합니다 .

크로스 컴파일이란 ?우선 임베디드 시스템을 개발하기 위해서는 크로스 컴파일 환경을 구축하는 것이 기본 입니다 .이유는 임베디드 시스템의 하드웨어는 제약 사항이 많습니다 . 대표적으로 성능과 저장공간이 문제가 됩니다 . 그렇기 때문에 상대적으로 성능이 좋은 “호스트 시스템” 에서 작업을 진행 합니다 . 즉 “타겟 시스템” 인식할 수 있는 있는 바이너리를 만듭니다 . 이러한 작업들을 통칭해서 크로스 컴파일 이라고 합니다 . [ 그림 1]

[ 그림 1] 크로스 컴파일 진행 과정

호스트 타겟

Page 6: cross compile

크로스 컴파일에 자주 등장하는 용어들임베디드 시스템 타겟 보드 종류 와 선택임베디드 시스템 타겟 보드의 종류는 여러 가지가 있습니다 . 제일 중요한 것은 무엇을 어떻게 만들 것인지 결정 후 목적에 맞는 보드와 칩을 선택 해야 합니다 .

익숙한 보드들이 눈에 보이시죠 ? 해당 보드를 홍보하려는 목적이 아님을 말씀 드립니다 .

[ 그림 5]삼성개발 보드[ 그림 4] 망고 보드[ 그림 3]오드로이드 보드[ 그림 2] 라즈베리파이 보드 [ 그림 6] 실제 삼성 보드

Page 7: cross compile

크로스 컴파일 환경 구축Toolchanin 다운로드인터넷을 잘 찾아보면 됩니다 . 그리고 ”호스트 시스템“ 에 다운을 받고 , opt 경로에 저장 합니다 .

Toolchanin 설치Toolchanin 설치 방법은 크게 2 가지로 볼 수 있습니다 . Toolchanin 을 다운받아 압축을 풀어 사용하는 방법Toolchanin 을 설치하는 방법

Page 8: cross compile

Toolchanin 환경 설정 확인$ pwd/opt/gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf/bin

$ lsarm-linux-gnueabihf-addr2line arm-linux-gnueabihf-c++filt arm-linux-gnueabihf-gcc arm-linux-gnueabihf-gcc-ranlib arm-linux-gnueabihf-ld arm-linux-gnueabihf-objdump arm-linux-gnueabihf-stringsarm-linux-gnueabihf-ar arm-linux-gnueabihf-cpp arm-linux-gnueabihf-gcc-4.9.4 arm-linux-gnueabihf-gcov arm-linux-gnueabihf-ld.bfd arm-linux-gnueabihf-ranlib arm-linux-gnueabihf-striparm-linux-gnueabihf-as arm-linux-gnueabihf-elfedit arm-linux-gnueabihf-gcc-ar arm-linux-gnueabihf-gdb arm-linux-gnueabihf-nm arm-linux-gnueabihf-readelf gdbserverarm-linux-gnueabihf-c++ arm-linux-gnueabihf-g++ arm-linux-gnueabihf-gcc-nm arm-linux-gnueabihf-gfortran arm-linux-gnueabihf-objcopy arm-linux-gnueabihf-size runtest

$ arm-linux-gnueabihf-gcc -vUsing built-in specs.COLLECT_GCC=arm-linux-gnueabihf-gccCOLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/arm-linux-gnueabihf/5/lto-wrapperTarget: arm-linux-gnueabihfConfigured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.4' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --en -able-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstd -cxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libitm --disable-libquadmath --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-armhf-cross/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-armhf-cross --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-armhf-cross --with-arch-directory=arm --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libgcj --enable-objc-gc --enable-multiarch --enable-multilib --disable-sjlj-exceptions --with-arch=armv7-a --with-fpu=vfpv3-d16 --with-float=hard --with-mode=thumb --disable-werror --enable-multilib --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=arm-linux-gnueabihf --program-prefix=arm-linux-gnueabihf- --includedir=/usr/arm-linux-gnueabihf/includeThread model: posixgcc version 5.4.0 20160609 (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.4)

크로스 컴파일 환경 구축[Toolchanin 을 다운받아 압축을 풀어 사용하는 방법 ]

Page 9: cross compile

$ ls /usr/bin/arm-linux-gnueabi*/usr/bin/arm-linux-gnueabi-addr2line /usr/bin/arm-linux-gnueabi-dwp /usr/bin/arm-linux-gnueabi-gcc-nm /usr/bin/arm-linux-gnueabi-gcov-tool /usr/bin/arm-linux-gnueabi-nm /usr/bin/arm-linux-gnueabi-strings/usr/bin/arm-linux-gnueabi-ar /usr/bin/arm-linux-gnueabi-elfedit /usr/bin/arm-linux-gnueabi-gcc-nm-5 /usr/bin/arm-linux-gnueabi-gcov-tool-5 /usr/bin/arm-linux-gnueabi-objcopy /usr/bin/arm-linux-gnueabi-strip/usr/bin/arm-linux-gnueabi-as /usr/bin/arm-linux-gnueabi-gcc /usr/bin/arm-linux-gnueabi-gcc-ranlib /usr/bin/arm-linux-gnueabi-gprof /usr/bin/arm-linux-gnueabi-objdump/usr/bin/arm-linux-gnueabi-c++filt /usr/bin/arm-linux-gnueabi-gcc-5 /usr/bin/arm-linux-gnueabi-gcc-ranlib-5 /usr/bin/arm-linux-gnueabi-ld /usr/bin/arm-linux-gnueabi-ranlib/usr/bin/arm-linux-gnueabi-cpp /usr/bin/arm-linux-gnueabi-gcc-ar /usr/bin/arm-linux-gnueabi-gcov /usr/bin/arm-linux-gnueabi-ld.bfd /usr/bin/arm-linux-gnueabi-readelf/usr/bin/arm-linux-gnueabi-cpp-5 /usr/bin/arm-linux-gnueabi-gcc-ar-5 /usr/bin/arm-linux-gnueabi-gcov-5 /usr/bin/arm-linux-gnueabi-ld.gold /usr/bin/arm-linux-gnueabi-size

크로스 컴파일 환경 구축[Toolchanin 을 설치하는 방법 ]

Page 10: cross compile

$ sudo apt-get install gcc-arm-linux-gnueabihf*$ ls /usr/bin/arm-linux-gnueabi*

/usr/bin/arm-linux-gnueabi-addr2line /usr/bin/arm-linux-gnueabi-gcc-nm-5 /usr/bin/arm-linux-gnueabi-objdump /usr/bin/arm-linux-gnue -abihf-elfedit /usr/bin/arm-linux-gnueabihf-gprof/usr/bin/arm-linux-gnueabi-ar /usr/bin/arm-linux-gnueabi-gcc-ranlib /usr/bin/arm-linux-gnueabi-ranlib /usr/bin/arm-linux-gnueabihf-gcc /usr/bin/arm-linux-gnueabihf-ld/usr/bin/arm-linux-gnueabi-as /usr/bin/arm-linux-gnueabi-gcc-ranlib-5 /usr/bin/arm-linux-gnueabi-readelf /usr/bin/arm-linux-gnueabihf-gcc-5 /usr/bin/arm-linux-gnueabihf-ld.bfd/usr/bin/arm-linux-gnueabi-c++filt /usr/bin/arm-linux-gnueabi-gcov /usr/bin/arm-linux-gnueabi-size /usr/bin/arm-linux-gnueabihf-gcc-ar /usr/bin/arm-linux-gnueabihf-ld.gold/usr/bin/arm-linux-gnueabi-cpp /usr/bin/arm-linux-gnueabi-gcov-5 /usr/bin/arm-linux-gnueabi-strings /usr/bin/arm-linux-gnueabihf-gcc-ar-5 /usr/bin/arm-linux-gnueabihf-nm/usr/bin/arm-linux-gnueabi-cpp-5 /usr/bin/arm-linux-gnueabi-gcov-tool /usr/bin/arm-linux-gnueabi-strip /usr/bin/arm-linux-gnueabihf-gcc-nm /usr/bin/arm-linux-gnueabihf-objcopy/usr/bin/arm-linux-gnueabi-dwp /usr/bin/arm-linux-gnueabi-gcov-tool-5 /usr/bin/arm-linux-gnueabihf-addr2line /usr/bin/arm-linux-gnueabihf-gcc-nm-5 /usr/bin/arm-linux-gnueabihf-objdump/usr/bin/arm-linux-gnueabi-elfedit /usr/bin/arm-linux-gnueabi-gprof /usr/bin/arm-linux-gnueabihf-ar /usr/bin/arm-linux-gnueabihf-gcc-ranlib /usr/bin/arm-linux-gnueabihf-ranlib/usr/bin/arm-linux-gnueabi-gcc /usr/bin/arm-linux-gnueabi-ld /usr/bin/arm-linux-gnueabihf-as /usr/bin/arm-linux-gnueabihf-gcc-ranlib-5 /usr/bin/arm-linux-gnueabihf-readelf/usr/bin/arm-linux-gnueabi-gcc-5 /usr/bin/arm-linux-gnueabi-ld.bfd /usr/bin/arm-linux-gnueabihf-c++filt /usr/bin/arm-linux-gnueabihf-gcov /usr/bin/arm-linux-gnueabihf-size/usr/bin/arm-linux-gnueabi-gcc-ar /usr/bin/arm-linux-gnueabi-ld.gold /usr/bin/arm-linux-gnueabihf-cpp /usr/bin/arm-linux-gnueabihf-gcov-5 /usr/bin/arm-linux-gnueabihf-strings/usr/bin/arm-linux-gnueabi-gcc-ar-5 /usr/bin/arm-linux-gnueabi-nm /usr/bin/arm-linux-gnueabihf-cpp-5 /usr/bin/arm-linux-gnueabihf-gcov-tool /usr/bin/arm-linux-gnueabihf-strip/usr/bin/arm-linux-gnueabi-gcc-nm /usr/bin/arm-linux-gnueabi-objcopy /usr/bin/arm-linux-gnueabihf-dwp /usr/bin/arm-linux-gnueabihf-gcov-tool-5

크로스 컴파일 환경 구축[Toolchanin 을 설치하는 방법 ]

이전 페이지와 현 페이지의 차이점을 이해 하시길 바랍니다 .

Page 11: cross compile

설치패키지 요약 내용$ sudo apt-get install emdebian-archive-keyring$ sudo apt-get install libc6-armel-cross libc6-dev-armel-cross$ sudo apt-get install binutils-arm-linux-gnueabi$ sudo apt-get install gcc-arm-linux-gnueabi$ sudo apt-get install g++-arm-linux-gnueabi$ sudo apt-get install u-boot-tools$ sudo apt-get install libncurses5-dev

크로스 컴파일 환경 구축[Toolchanin 을 설치하는 방법 ]

Page 12: cross compile

테스트 할 C 코드 작성소스코드는 “호스트 시스템” 에서 작성 한다 .

파일명test.c

소스코드#include <stdio.h>

int main(void){ printf("hello\n"); return 0;}

크로스 컴파일 실습 하기

Page 13: cross compile

바이너리 실행 파일 만들기$ /opt/gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc -o arm-hello test.c

바이너리 버전 확인하기$ file arm-helloarm-hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.6.16, BuildID[sha1]=c2bfa28dc043812bd6e1c95702a7a2952a593434, not stripped

바이너리 파일을 복사하기생성된 바이너리 arm-hello 파일을 “타겟 시스템” 에 복사합니다 .

바이너리 파일을 실행하기복사한 바이너리 파일을 실행하여 결과를 확인합니다 .$ ./arm-hello hello

크로스 컴파일 실습 하기

Page 14: cross compile

리눅스 버전과 arm 용 비교 하기$ gcc -o hello test.c$ file hellohello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=465eccf3c6ec7b684ee494da79c624f74ca23665, not stripped

$ ./arm-linux-gnueabihf-gcc -o arm-hello test.c$ file arm-hello arm-hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.6.16, BuildID[sha1]=2bbee689bf0e94b11a489d780200792a273acd6c, not stripped

크로스 컴파일 실습 하기

Page 15: cross compile

• 수고 했습니다 .