분류

2018년 2월 8일 목요일

Yocto 학습 : 작업 #8 - 생성된 툴 체인을 사용하여 수동으로 커널 빌드

---------------------------------------------------------------------------------------------------
이 문서는 Yocto Training - HOME 문서를 한글 화 한 것입니다. 저자이신 Daiane Angolini 님의 수락 하에 한글 화 작업을 진행하고 있습니다. 일부 주석을 첨부 할 것이며, 필요하면 의역을 통해 일부 내용이 변경 되거나 누락 될 수 있습니다. 하지만 기본은 구글이 번역하겠습니다.

원본은 https://community.nxp.com/docs/DOC-94849 입니다.
---------------------------------------------------------------------------------------------------

$bitbake meta-toolchain을 실행한 후 툴채인 패키지를 설치하는 스크립트는 아래와 같습니다.


$ ls tmp/deploy/sdk/poky-eglibc-x86_64-arm-toolchain-1.4.1.sh
   tmp/deploy/sdk/poky-eglibc-x86_64-arm-toolchain-1.4.1.sh

※ 늘곰씨는 ami6solo를 선택해서 파일 명칭이 조금 다릅니다.
tmp/deploy/sdk/poky-eglibc-i686-meta-toolchain-cortexa9hf-vfp-neon-toolchain-1.5.4.sh


아래는 이것을 설치하기 위한 명령입니다.

$ ./tmp/deploy/sdk/poky-eglibc-x86_64-arm-toolchain-1.4.1.sh
   [sudo] password for daiane:
   Enter target directory for SDK (default: /opt/poky/1.4.1):
   You are about to install the SDK to "/opt/poky/1.4.1". Proceed[Y/n]?y
   Extracting SDK...done
   Setting it up...done
   SDK has been successfully set up and is ready to be used.


Hello World 

$ source /opt/poky/1.4.1/environment-setup-armv7a-vfp-neon-poky-linux-gnueabi
$ cd ~/test/
$ arm-poky-linux-gnueabi-gcc helloworld.c
$ ls
a.out helloworld.c
$ ./a.out
-bash: ./a.out: cannot execute binary file
$ file a.out
a.out: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped

Kernel
설치된 툴 체인을 사용하여 커널 빌드하기 
$ source /opt/poky/1.4.1/environment-setup-armv7a-vfp-neon-poky-linux-gnueabi 

커널 소스는 github.com/boundarydevices/linux-imx6.git 에 가보시면 확인하실 수 있습니다. 
커널 소스 다운로드 (user 폴더에 생성합니다. 원문에서는 전체를 클론 하지만, 용량과 시간이 과다하게 투입되므로, 특정 버전을 다운로드 합니다. ) 
$ git clone --branch imx_3.0.35_4.0.0 --depth=1 git://github.com/boundarydevices/linux-imx6.git
imx6의 커널 환경 파일을 복제합니다. 

$ cp ../fsl-community-bsp/build/tmp/work/imx6qsabresd-poky-linux-gnueabi/linux-imx/3.0.35-r37.14/git/arch/arm/configs/imx6_defconfig ./

$ cd linux-imx 
$ export ARCH=arm
$ export CROSS_COMPILE=$TARGET_PREFIX 

$ unset LDFLAGS 
$ make imx6_defconfig
$ make uImage


bin 패치에서 mkimage를 사용할 수 있는지 확인해보세요
(만약 u-boot에서 mkimage를 내보냈다면 이것이 패치입니다.)

또는 ubuntu 패키지를 다운로드 하셔도 됩니다.

$ sudo apt-get install uboot-mkimage

※mkimage는 uimage를 만들어주는 도구라고 합니다.
※ ubuntu 14.04 64bit 버전에서 uboot-mkimage가 설치되지 않습니다. 따라서 다음 명령으로 대체합니다. 
$ sudo apt-get install u-boot-tools

※ 다른 툴 체인을 사용하여 빌드하기
※ 툴체인 중 arm-linux-gnueabihf- 툴체인이 cortex-a 계열을 지원합니다.  
apt-get install을 통한 cross compiler 를 설치하세요 
sudo apt-get install gcc-4.7-arm-linux-gnueabihf
gcc가 여러개인 경우 update-alternatives를 설정합니다.
$ sudo update-alternatives --install /usr/bin/arm-linux-gnueabihf-gcc arm-linux-gnueabihf /usr/bin/arm-linux-gnueabihf-gcc-4.7 473 --slave /usr/bin/arm-linux-gnueabihf-g++ arm-linux-gnueabihf-g++ /usr/binbin/arm-linux-gnueabihf-g++-4.7

$ export CROSS_COMPILE=arm-linux-gnueabihf-
$ export ARCH=arm
$ make imx6_defconfig
※커널 개별 설정을 할경우 아래 명령 
$ make menuconfig

$ make -j3 uImage LOADADDR=0x10008000
※ -j3는 병렬처리 코어 개수 설정입니다. 
※ 이 과정에서 kernel git이 잘못되었으면 dtb파일이 생성되지 않는다고 합니다. dtb가 없을 경우 커널의 정상 적용이 안될 수 있습니다. 

업데이트
아래와 같은 오류가 발생했다면

OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
multiple (or no) load addresses:
This is incompatible with uImages
Specify LOADADDR on the commandline to build an uImage
make[1]: *** [arch/arm/boot/uImage] Error 1
make: *** [uImage] Error 2
LOADADDR이 누락되었습니다.
mkimage 가 uImage를 생성하는데 사용할 수 있는 권한이 LOADADDR에 있어야 합니다.

주소 값은 하드웨어에 종속됩니다. 같은 imx6 보드라도 . 해당 하드웨어의 올바른 값에 대해 알고 계셔야 합니다.

예를 들어, 사용 중인 머신이 Yocto project/meta-fsl-arm에서 지원된다면 , 보드와 관련된 값을 conf/machine/include/imx-base.inc 파일이나, meta-fsl-arm - Freescale ARM 하드웨어 지원 메타데이터가 포함된 레이어 에서 구할 수 있습니다.
이것은 UBOOT_ENTRYPOINT에 사용된 값과 같습니다.

예를 들어 Freescale SABRE-SD 보드의 정보는 conf/machine/include/imx-base.inc에 기록되어 있습니다.
UBOOT_ENTRYPOINT_mx6 = "0x10008000"

따라서 빌드 명령은 다음과 같습니다.
make uImage LOADADDR=0x10008000

빠른 참조를 위해 필자가 가장 많이 사용하는 명령은 다음과 같습니다.
imx28evk:
$ make LOADADDR=0x40008000
imx53qsb:
$ make LOADADDR=0x70008000
imx6qsabresd:
$ make LOADADDR=0x10008000

업데이트2
Craig McQueen이 제안한
autotools 기반 패키지 만들기 예 :

$ source /opt/poky/1.4.1/environment-setup-armv7a-vfp-neon-poky-linux-gnueabi
$ ./configure ${CONFIGURE_FLAGS}
$ make
$ make install

CONFIGURE_FLAGS는 프로젝트에 완전히 귀속된 의존성 변수 입니다.

Yocto 교육 문서 - 홈
Yocto 학습 : 작업 #7 - 툴 체인 만들기
Yocto 학습 : 작업 #9 - bad/ugly 추가 방법 (플러그인에 대한 옵션 인 것 같습니다.)

댓글 없음:

댓글 쓰기