do_populate_sdk()
do_populate_sdk()
, do_populate_sdk_ext()
를 통해 SDK를 쉽게 구성할 수 있다./build/tmp/deploy/sdk/*.sh
로 만들어 지고, 해당 파일만 있다면 개발자는 Cross-compile 환경을 쉽게가져갈 수 있다.$ bitbake core-image-full-cmdline -c populate_sdk
${TMPDIR}/deploy/sdk/poky-glibc-x86_64-core-image-full-cmdline-aarch64-qemuarm64-toolchain-3.1.13.sh
sdk/*.sh
${TMPDIR}/deploy/sdk/poky-glibc-x86_64-core-image-full-cmdline-aarch64-qemuarm64-toolchain-3.1.13.sh
를 실행한다./opt/poky/3.1.13
이다. 하지만 원하는 디렉토리를 설정 할 수도 있다./opt/poky/3.1.13
)에 아래의 파일 및 디렉토리가 생성된다.install file | description |
---|---|
1. environment-setup-aarch64-poky-linux | 툴체인을 사용하기 위해 필요한 모든 환경 변수의 설정을 위해 사용 |
2. site-config-aarch64-poky-linux | 툴체인 생성에 사용되는 변수들을 담고 있는 파일 |
3. sysroots | SDK 생성을 위해 사용된 이미지 rootfs 디렉토리의 복사본 다음과 같은 하위 디렉토리는 바이너리, 헤더, 라이브러리 파일들을 포함한다.
|
4. version-armv5te-poky-linux-gnueabi | 버전과 타임스탬프 정보 |
source
명령어로 현재 쉘에 적용 시켜 보자.$ source ./environment-setup-aarch64-poky-linux
$ echo ${CC}
aarch64-poky-linux-gcc -march=armv8-a+crc -fstack-protector-strong -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security --sysroot=/opt/poky/3.1.13/sysroots/aarch64-poky-linux
$ echo ${LD}
aarch64-poky-linux-ld --sysroot=/opt/poky/3.1.13/sysroots/aarch64-poky-linux
$ echo ${LDFLAGS}
-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed -fstack-protector-strong -Wl,-z,relro,-z,now
hello_world.c
를 예로 들어, ARM 아키텍처를 타깃으로 빌드한다.$ source /opt/poky/2.4/environment-setup-armv5e-poky-linux-gnueabi
$ ${CC} hello_world.c -o hello_world
생성된 바이너리가 원하는 타깃 이키텍처에 맞게 생성됐는지 확인 하려면 다음과 같이 입력한다.
$ file hello-world
hello-world: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV),
dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.2.0,
BuildID[sha1]=ce9b7..., not stripped
일반적으로 이용하는 또다른 프로젝트는 리눅스 커널이다. 리눅스 커널은 LD 유틸리티를 이용해 링킹을 하기 때문에 GCC를 사용해 정의한 기본 값으로 unset을 사용해 LDFLAGS 변수를 재설정해야한다. 리눅스 커널 소스코드를 빌드하려면 다음 명령을 이용하면된다.
$ source /opt/poky/2.4/environment-setup-armv5e-poky-linux-gnueabi
$ unset LDFLAGS
$ make defconfig
$ make zImage
$ find /opt/poky/2.4/ -iname "*cmake*" 2> /dev/null
/opt/poky/2.4/sysroot/<arch>/usr/share/cmake/OEToolchainConfig.cmake
$ tree ./cmake-hello-world
CMakeLists.txt
main.cpp
CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(cmake-hello-world-cpp)
add_executable(${PROJECT_NAME} "main.cpp")
main.cpp
#include <iostream>
using namespace std;
int main()
{
cout << "Hello World!" << endl;
return 0;
}
$ mkdir build
$ cd build
$ cmake -DCMAKE_TOOLCHAIN_FILE=/opt/poky/2.4/sysroot/<arch>/\
usr/share/cmake/OEToolchainConfig.cmake ..
build!
$ make
meta-toolchain
meta-toolchain
$ bitbake meta-toolchain
qemuarm
머신을 위한 결과:${PN}-dev
패키지를 이미지에 설치한다.IMAGE_FEATRUES += "dev-pkgs"
1.4. local.conf 에서 기능을 넣고 싶은 경우 아래와 같이 한다.EXTRA_IMAGE_FEATRUES += "dev-pkgs"
meta/recipes-core/packagegroups/
packagegroup-core-tools-debug.bb
IMAGE_FEATURES += "tools-debug"
gdbserver
gdbserver
가 있는데, 이 패키지는 Embedded Target Device에서 메모리, 디스크 사용량 제약 때문에, On Device Runtime Debug가 불가능할 때 사용한다.gdbserver
는 타깃에서 실행하고, 디버깅 절차에 필요한 디버깅 정보들을 로드하지 않는다. gdbserver
로 제어 명령어를 보낸다.INHIBIT_PACKAGE_STRIP = "1"
설정하여 binary strips symbol을 방지하자!core-image-sato.bb
를 이용해본다.meta/recipes-sato/images/core-image-sato.bb
DESCRIPTION = "Image with Sato, a mobile environment and visual style for \
mobile devices. The image supports X11 with a Sato theme, Pimlico \
applications, and contains terminal, editor, and file manager."
HOMEPAGE = "https://www.yoctoproject.org/"
IMAGE_FEATURES += "splash package-management x11-base x11-sato ssh-server-dropbear hwcodecs"
LICENSE = "MIT"
inherit core-image
TOOLCHAIN_HOST_TASK:append = " nativesdk-intltool nativesdk-glib-2.0"
TOOLCHAIN_HOST_TASK:remove:task-populate-sdk-ext = " nativesdk-intltool nativesdk-glib-2.0"
QB_MEM = '${@bb.utils.contains("DISTRO_FEATURES", "opengl", "-m 512", "-m 256", d)}'
QB_MEM:qemuarmv5 = "-m 256"
QB_MEM:qemumips = "-m 256"
Pimlico
appTOOLCHAIN_HOST_TASK
:append
nativesdk-intltool
nativesdk-glib-2.0
TOOLCHAIN_HOST_TASK
:task-populate-sdk-ext
에서 :remove
nativesdk-intltool
nativesdk-glib-2.0
Variable in core-image-sato | description |
---|---|
TOOLCHAIN_HOST_TASK | nativesdk-packagegroup-sdk-host packagegroup-cross-canadian-raspberrypi4-64 nativesdk-intltool nativesdk-glib-2.0 |
TOOLCHAIN_HOST_TASK:remove:task-populate-sdk-ext | nativesdk-intltool nativesdk-glib-2.0 |
TOOLCHAIN_HOST_TASK_ATTEMPTONLY | - |
TOOLCHAIN_HOST_TASK_ESDK | meta-environment-extsdk-raspberrypi4-64 |
TOOLCHAIN_TARGET_TASK | packagegroup-core-standalone-sdk-target target-sdk-provides-dummy packagegroup-core-boot packagegroup-base-extended run-postinsts opkg psplash-raspberrypi packagegroup-core-ssh-dropbear packagegroup-core-x11-base packagegroup-core-x11-sato |
TOOLCHAIN_TARGET_TASK_ATTEMPTONLY | - |
QB_MEM = '${@bb.utils.contains("DISTRO_FEATURES", "opengl", "-m 512", "-m 256", d)}'
QB_MEM:qemuarmv5 = "-m 256"
QB_MEM:qemumips = "-m 256"
QB
?TOOLCHAIN_HOST_TASK
default: $BUILD_ARCH
)을 따른다.prefix
로 nativesdk-
를 가진다.$ bitbake -c populate_sdk <image>
sdk
관련 package를 추가하거나 제거할 수 있다.TOOLCHAIN_HOST_TASK
: HOST(native)에서 실행되는 툴체인에 개별 패키지 control 변수TOOLCHAIN_TARGET_TASK
: TARGET에서 개별 패키지 control 변수TOOLCHAIN_HOST_TASK_ESDK
: eSDK의 호스트 부분에 설치된 항목을 확장TOOLCHAIN_OUTPUTNAME
TOOLCHAIN_OUTPUTNAME ?= "${SDK_NAME}-toolchain-${SDK_VERSION}"
$ bitbake core-image-sato -c populate_sdk
nativesdk-
패키지IMAGE_FEATURES
에 대한 설명은 https://velog.io/@markyang92/Yocto-Image#image_features 참고PACKAGE_DEBUG_SPLIT_STYLE
package.bbclass
의 1100line 정도에 있다.PACKAGE_DEBUG_SPLIT_STYLE | Description |
---|---|
.debug 기본값 | 모든 src, dbg를 단일 -dbg 패키지로 만든다..debug 디렉토리에 디버그 심볼을 위치 시켜, binary가 /bin 에 설치되면, /bin/.debug 에 해당 binary와 일치하는 디버그 심볼을 넣는다.src파일 또한, -dbg 패키지에 있어, /usr/src/debug 에 소스코드를 위치시킨다. |
debug-file-directory | As above, all debugging and source info is placed in a single *-dbg package; debug symbol files are placed entirely under the directory /usr/lib/debug and separated by the path from where the binary is installed, so that if a binary is installed in /bin, the corresponding debug symbols are installed in /usr/lib/debug/bin, and so on. As above, source is installed in the same package under /usr/src/debug. |
debug-with-srcpkg | Debugging info is placed in the standard -dbg package as with the .debug value, while source is placed in a separate -src package, which can be installed independently. This is the default setting for this variable, as defined in Poky’s bitbake.conf file. |
debug-without-src | The same behavior as with the .debug setting, but no source is packaged at all. |
-dbg
패키지에서 저렇게 지정된대로 변환해야 -dbg
패키지로 file을 잘 가져올 수 있다.
core-image-sato
에서 PACKAGE_DEBUG_SPLIT_STYLE
PACKAGE_DEBUG_SPLIT_STYLE="debug-with-srcpkg"
PACKAGE_DEBUG_SPLIT_STYLE:toolchain-clang="debug-without-src"
core-image-sato
를 기반으로 원격 디버깅# === local.conf ==== #
IMAGE_INSTALL:append = " gdbserver"
EXTRA_IMAGE_FEATURES = "tools-debug"
$ bitbake core-image-sato -c populate_sdk
TOOLCHAIN_HOST_TASK:append
=
" nativesdk-intltool nativesdk-glib2.0"
TOOLCHAIN_HOST_TASK:remove:task-populate-sdk-ext
=
" nativesdk-intltool nativesdk-glib-2.0"
$ bitbake core-image-sato -c populate-sdk
.sh
파일을 설치하면, (default: /opt/<distro>
)sysroots 디렉토리가 생성되어 있는데, 엄밀히, Target sysroot는 저기 이다.sysroot
/usr/src/debug
에 있음not stripped
:10000
으로 열어주고 디버깅 대상 binary를 써준다."hello world!"
를 stdout에 출력하는 hello(/usr/bin/hello
)를 실행한다.# Target ssh 접속 후
root@raspberrypi4-64:~ $ gdbserver :10000 hello
Process hello created; pid = <PID>
Listening on port 10000
$ /opt/<distro>/<version>/
여기에 environment-setup-cortexa72-poky-linux
라는 파일이 있는데 쉘에 먹이면 툴체인이 적용된다.
$ source ./environment-setup-cortexa72-poky-linux
혹은
$ . environment-setup-cortexa72-poky-linux
툴체인이 쉘에 먹히면, PATH에 관련 툴들이 자동완성으로 뜬다.
여기 gdb를 사용한다.
do_populate_sdk로 Target용 sysroot가 설치되어 있으므로, 디버깅 바이너리가 있는 곳으로 가서 gdb를 실행한다.
$ aarch64-poky-linux-gdb ./hello
remote
명령으로 통신시켜준다.(gdb) target remote 192.168.1.2:10000
# Target board의 ssh ip가 192.168.1.2 이다.
# 해당 IP에 10000 포트에 연결시킨다.
(gdb) set sysroot /opt/poky/4.1+snapshot/sysroots/cortexa72-poky/linux
show directories
를 입력하면 보여준다.$cdir
: 소스가 컴파일 된 디렉토리. DW_AT_comp_dir 태그를 사용해 객체 파일로 인코딩 되어 있으며, objdump --dwarf
를 사용하면 태그를 볼 수 있다.$ aarch64-poky-linux-objdump --dwarf ./hello | grep DW_AT_comp_dir
<160> DW_AT_comp_dir : (indirect string, offset: 0x244:
/소스코드위치
$cwd
: 호스트에서 실행 중인 gdb 인스턴스의 현재 작업 디렉토리(gdb) set sysroot /opt/poky/4.1+snapshot/sysroots/cortexa72-poky/linux
(gdb) set substitute-path /usr/src/debug
/opt/poky/4.1+snapshot/sysroots/cortexa72-poky/linux/usr/src/debug
set solib-search-path
를 사용할 수 있다.solib-search-path
를 검색한다.directory
명령을 사용하는 것이다.(gdb) directory 'path'
local.conf
IMAGE_INSTALL:append = " gdb"
EXTRA_IMAGE_FEATURES += "dbg-pkgs"
set substitute-path
를 실행할 필요없이 이소스를 설치할 것이다라는 뜻PACKAGE_DEBUG_SPLIT_STYLE = "debug-without-src"
를 local.conf에 추가한다.dbg-pkgs
를 포함해 설치한 core-image-sato-sdk