cross compile
-
Upload
he4722 -
Category
Devices & Hardware
-
view
187 -
download
0
Transcript of cross compile
cross compile
교차 컴파일 (projung)
목차1. 크로스 컴파일에 자주 등장하는 용어들2. 크로스 컴파일 환경 구축3. 크로스 컴파일 실습 하기
크로스 컴파일에 자주 등장하는 용어들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 용 컴파일러가 다릅니다 . 그러므로 생성된 바이너리도 달라질까요 ?직접 실습을 해서 알아 보시면 됩니다 .
크로스 컴파일에 자주 등장하는 용어들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 기능이 있는 것도 있고 , 없는 것도 있습니다 .
크로스 컴파일에 자주 등장하는 용어들임베디드 시스템이란 ?특수한 목적을 수행하기 위해 태어난 시스템이라고 생각하면 됩니다 . 단점은 일반 pc 보다 속도가 느리고 , 저장 공간도 제약이 많습니다 . ex) smart phone, ip camera, nvr, dvr, ip 공유기 , voip 단말기 , raspberry pi …
툴체인 (Toolchanin) 이란 ?“ 타겟 시스템”에서 프로그램 및 lib 가 인식해서 동작 될 수 있도록 개발에 필요한 “호스트 시스템”의 소프트웨어 (유틸리티 , 각종 gcc) 개발환경을 한데 묶어서 보통 Toolchanin 이라고 말합니다 .
크로스 컴파일이란 ?우선 임베디드 시스템을 개발하기 위해서는 크로스 컴파일 환경을 구축하는 것이 기본 입니다 .이유는 임베디드 시스템의 하드웨어는 제약 사항이 많습니다 . 대표적으로 성능과 저장공간이 문제가 됩니다 . 그렇기 때문에 상대적으로 성능이 좋은 “호스트 시스템” 에서 작업을 진행 합니다 . 즉 “타겟 시스템” 인식할 수 있는 있는 바이너리를 만듭니다 . 이러한 작업들을 통칭해서 크로스 컴파일 이라고 합니다 . [ 그림 1]
[ 그림 1] 크로스 컴파일 진행 과정
호스트 타겟
크로스 컴파일에 자주 등장하는 용어들임베디드 시스템 타겟 보드 종류 와 선택임베디드 시스템 타겟 보드의 종류는 여러 가지가 있습니다 . 제일 중요한 것은 무엇을 어떻게 만들 것인지 결정 후 목적에 맞는 보드와 칩을 선택 해야 합니다 .
익숙한 보드들이 눈에 보이시죠 ? 해당 보드를 홍보하려는 목적이 아님을 말씀 드립니다 .
[ 그림 5]삼성개발 보드[ 그림 4] 망고 보드[ 그림 3]오드로이드 보드[ 그림 2] 라즈베리파이 보드 [ 그림 6] 실제 삼성 보드
크로스 컴파일 환경 구축Toolchanin 다운로드인터넷을 잘 찾아보면 됩니다 . 그리고 ”호스트 시스템“ 에 다운을 받고 , opt 경로에 저장 합니다 .
Toolchanin 설치Toolchanin 설치 방법은 크게 2 가지로 볼 수 있습니다 . Toolchanin 을 다운받아 압축을 풀어 사용하는 방법Toolchanin 을 설치하는 방법
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 을 다운받아 압축을 풀어 사용하는 방법 ]
$ 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 을 설치하는 방법 ]
$ 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 을 설치하는 방법 ]
이전 페이지와 현 페이지의 차이점을 이해 하시길 바랍니다 .
설치패키지 요약 내용$ 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 을 설치하는 방법 ]
테스트 할 C 코드 작성소스코드는 “호스트 시스템” 에서 작성 한다 .
파일명test.c
소스코드#include <stdio.h>
int main(void){ printf("hello\n"); return 0;}
크로스 컴파일 실습 하기
바이너리 실행 파일 만들기$ /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
크로스 컴파일 실습 하기
리눅스 버전과 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
크로스 컴파일 실습 하기
• 수고 했습니다 .