
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.txtcmake_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-toolchainmeta-toolchain$ bitbake meta-toolchain

qemuarm 머신을 위한 결과:
${PN}-dev 패키지를 이미지에 설치한다.IMAGE_FEATRUES += "dev-pkgs"1.4. local.conf 에서 기능을 넣고 싶은 경우 아래와 같이 한다.EXTRA_IMAGE_FEATRUES += "dev-pkgs"
이 것들을 패키지 하나하나 일일히 image에 설치하지않고 meta/recipes-core/packagegroups/packagegroup-core-tools-debug.bb
IMAGE_FEATURES += "tools-debug"gdbservergdbserver가 있는데, 이 패키지는 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.bbDESCRIPTION = "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:appendnativesdk-intltoolnativesdk-glib-2.0TOOLCHAIN_HOST_TASK:task-populate-sdk-ext에서 :removenativesdk-intltoolnativesdk-glib-2.0Variable in core-image-sato | description |
|---|---|
| TOOLCHAIN_HOST_TASK | nativesdk-packagegroup-sdk-hostpackagegroup-cross-canadian-raspberrypi4-64nativesdk-intltoolnativesdk-glib-2.0 |
| TOOLCHAIN_HOST_TASK:remove:task-populate-sdk-ext | nativesdk-intltoolnativesdk-glib-2.0 |
| TOOLCHAIN_HOST_TASK_ATTEMPTONLY | - |
| TOOLCHAIN_HOST_TASK_ESDK | meta-environment-extsdk-raspberrypi4-64 |
| TOOLCHAIN_TARGET_TASK | packagegroup-core-standalone-sdk-targettarget-sdk-provides-dummypackagegroup-core-bootpackagegroup-base-extendedrun-postinstsopkgpsplash-raspberrypipackagegroup-core-ssh-dropbearpackagegroup-core-x11-basepackagegroup-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_TASKdefault: $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_OUTPUTNAMETOOLCHAIN_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_STYLEpackage.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_STYLEPACKAGE_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는 저기 이다.
GDB 심볼 정보
실행 파일의 소스코드는 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/debugset solib-search-path를 사용할 수 있다.solib-search-path를 검색한다.directory명령을 사용하는 것이다.(gdb) directory 'path'



local.confIMAGE_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
