From bd648b6cb417e26c4b059a5ae9db546065126bbd Mon Sep 17 00:00:00 2001 From: Khem Raj Date: Mon, 7 Sep 2026 10:58:39 -0700 Subject: [PATCH] bpftrace: Fix tests to cross compile Signed-off-by: Khem Raj --- ...ker-flags-and-sysroot-to-raw-compile.patch | 79 +++++++++++++++++++ ...d-build-paths-in-split-DWARF-test-pr.patch | 61 ++++++++++++++ .../bpftrace/bpftrace_0.26.1.bb | 2 + 3 files changed, 142 insertions(+) create mode 100644 meta-oe/dynamic-layers/meta-python/recipes-devtools/bpftrace/bpftrace/0001-tests-pass-C-linker-flags-and-sysroot-to-raw-compile.patch create mode 100644 meta-oe/dynamic-layers/meta-python/recipes-devtools/bpftrace/bpftrace/0006-tests-do-not-embed-build-paths-in-split-DWARF-test-pr.patch diff --git a/meta-oe/dynamic-layers/meta-python/recipes-devtools/bpftrace/bpftrace/0001-tests-pass-C-linker-flags-and-sysroot-to-raw-compile.patch b/meta-oe/dynamic-layers/meta-python/recipes-devtools/bpftrace/bpftrace/0001-tests-pass-C-linker-flags-and-sysroot-to-raw-compile.patch new file mode 100644 index 0000000000..491b451ee9 --- /dev/null +++ b/meta-oe/dynamic-layers/meta-python/recipes-devtools/bpftrace/bpftrace/0001-tests-pass-C-linker-flags-and-sysroot-to-raw-compile.patch @@ -0,0 +1,79 @@ +From 94892d6ac971155b43a6bbff942acede21b60efb Mon Sep 17 00:00:00 2001 +From: x +Date: Mon, 7 Sep 2026 17:54:26 +0000 +Subject: [PATCH] tests: pass C/linker flags and sysroot to raw compiler + invocations in testprogs + +Several add_custom_command() rules in tests/testprogs invoke +${CMAKE_C_COMPILER} directly (false.bin and the split-DWARF dwo/dwp +builds). Unlike add_executable() targets, these do not automatically +receive CMAKE_C_FLAGS, CMAKE_EXE_LINKER_FLAGS or CMAKE_SYSROOT, so with +cross toolchains that have no built-in default sysroot (e.g. +Yocto/OpenEmbedded) the compile fails with: + + uprobe_test.c:1:10: fatal error: unistd.h: No such file or directory + +Build a flag list from CMAKE_C_COMPILER_ARG1, CMAKE_SYSROOT and +CMAKE_C_FLAGS and pass it to each raw compiler invocation. The dwo/dwp +commands compile and link in a single step, so also pass +CMAKE_EXE_LINKER_FLAGS to those. + +Upstream-Status: Pending +Signed-off-by: Khem Raj +--- + tests/testprogs/CMakeLists.txt | 23 ++++++++++++++++++++--- + 1 file changed, 20 insertions(+), 3 deletions(-) + +--- a/tests/testprogs/CMakeLists.txt ++++ b/tests/testprogs/CMakeLists.txt +@@ -17,6 +17,23 @@ test_and_add_testprog_cflag("-fno-omit-f + test_and_add_testprog_cflag("-mno-omit-leaf-frame-pointer") + get_property(testprog_cflags GLOBAL PROPERTY testprog_cflags) + ++# Flags for the add_custom_command() invocations below that call the C ++# compiler directly. Unlike add_executable(), custom commands do not ++# automatically receive CMAKE_C_FLAGS or the sysroot, which breaks cross ++# compilation with toolchains that have no default sysroot (e.g. Yocto). ++set(testprog_raw_cc_flags "") ++if(CMAKE_C_COMPILER_ARG1) ++ separate_arguments(_arg1 UNIX_COMMAND "${CMAKE_C_COMPILER_ARG1}") ++ list(APPEND testprog_raw_cc_flags ${_arg1}) ++endif() ++if(CMAKE_SYSROOT) ++ list(APPEND testprog_raw_cc_flags "--sysroot=${CMAKE_SYSROOT}") ++endif() ++separate_arguments(_c_flags UNIX_COMMAND "${CMAKE_C_FLAGS}") ++list(APPEND testprog_raw_cc_flags ${_c_flags}) ++# Linker flags for the custom commands that compile and link in one step. ++separate_arguments(testprog_raw_ld_flags UNIX_COMMAND "${CMAKE_EXE_LINKER_FLAGS}") ++ + file(GLOB testprog_sources CONFIGURE_DEPENDS *.c *.cpp) + set(testprogtargets "") + function(testprog_compile is_pie) +@@ -85,7 +102,7 @@ endif() + find_program(LLVM_OBJCOPY llvm-objcopy REQUIRED) + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/false.bin +- COMMAND ${CMAKE_C_COMPILER} -c ${CMAKE_CURRENT_SOURCE_DIR}/false.c -o ${CMAKE_CURRENT_BINARY_DIR}/false.o ++ COMMAND ${CMAKE_C_COMPILER} ${testprog_raw_cc_flags} -c ${CMAKE_CURRENT_SOURCE_DIR}/false.c -o ${CMAKE_CURRENT_BINARY_DIR}/false.o + COMMAND ${LLVM_OBJCOPY} -S --only-section=.text --keep-symbol=main -O binary ${CMAKE_CURRENT_BINARY_DIR}/false.o ${CMAKE_CURRENT_BINARY_DIR}/false.bin + COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_CURRENT_BINARY_DIR}/false.o + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} +@@ -147,7 +164,7 @@ add_custom_command( + OUTPUT + ${EXTERNAL_DEBUG_DIR}/dwo/uprobe_test-split + ${EXTERNAL_DEBUG_DIR}/dwo/uprobe_test-split-uprobe_test.dwo +- COMMAND ${CMAKE_C_COMPILER} -g -O0 -gsplit-dwarf ${CMAKE_CURRENT_SOURCE_DIR}/uprobe_test.c -o ${EXTERNAL_DEBUG_DIR}/dwo/uprobe_test-split ++ COMMAND ${CMAKE_C_COMPILER} ${testprog_raw_cc_flags} -g -O0 -gsplit-dwarf ${CMAKE_CURRENT_SOURCE_DIR}/uprobe_test.c -o ${EXTERNAL_DEBUG_DIR}/dwo/uprobe_test-split ${testprog_raw_ld_flags} + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/uprobe_test.c + ) + list(APPEND testprogtargets ${EXTERNAL_DEBUG_DIR}/dwo/uprobe_test-split) +@@ -159,7 +176,7 @@ add_custom_command( + OUTPUT + ${EXTERNAL_DEBUG_DIR}/dwp/uprobe_test-split + ${EXTERNAL_DEBUG_DIR}/dwp/uprobe_test-split.dwp +- COMMAND ${CMAKE_C_COMPILER} -g -O0 -gsplit-dwarf ${CMAKE_CURRENT_SOURCE_DIR}/uprobe_test.c -o ${EXTERNAL_DEBUG_DIR}/dwp/uprobe_test-split ++ COMMAND ${CMAKE_C_COMPILER} ${testprog_raw_cc_flags} -g -O0 -gsplit-dwarf ${CMAKE_CURRENT_SOURCE_DIR}/uprobe_test.c -o ${EXTERNAL_DEBUG_DIR}/dwp/uprobe_test-split ${testprog_raw_ld_flags} + COMMAND ${LLVM_DWP} -e ${EXTERNAL_DEBUG_DIR}/dwp/uprobe_test-split -o ${EXTERNAL_DEBUG_DIR}/dwp/uprobe_test-split.dwp + COMMAND ${CMAKE_COMMAND} -E rm -f ${EXTERNAL_DEBUG_DIR}/dwp/*.dwo + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/uprobe_test.c diff --git a/meta-oe/dynamic-layers/meta-python/recipes-devtools/bpftrace/bpftrace/0006-tests-do-not-embed-build-paths-in-split-DWARF-test-pr.patch b/meta-oe/dynamic-layers/meta-python/recipes-devtools/bpftrace/bpftrace/0006-tests-do-not-embed-build-paths-in-split-DWARF-test-pr.patch new file mode 100644 index 0000000000..aecbabc8d0 --- /dev/null +++ b/meta-oe/dynamic-layers/meta-python/recipes-devtools/bpftrace/bpftrace/0006-tests-do-not-embed-build-paths-in-split-DWARF-test-pr.patch @@ -0,0 +1,61 @@ +From bc125c84cffdbb23ea7977b1f235635607e00a18 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Mon, 7 Sep 2026 16:36:50 -0700 +Subject: [PATCH] tests: do not embed build paths in split DWARF test programs + +The two split-DWARF test binaries are compiled by add_custom_command() with +an absolute -o path. clang derives the .dwo file name from -o and records it +verbatim in DW_AT_dwo_name, without applying -ffile-prefix-map, so the +absolute build directory ends up baked into uprobe_test-split, its .dwo and +the .dwp built from it. gcc remaps it, clang does not. + +Compile from inside the target directory with a relative -o instead. The +recorded DW_AT_dwo_name then becomes a plain file name, which is what the +dwarf parser looks for anyway (it uses only the basename), and llvm-dwp +resolves it relative to its working directory. + +This keeps the shipped test programs free of build paths, which matters for +distributions that package tests/ and check for host paths in the output. + +Upstream-Status: Pending + +Signed-off-by: Khem Raj +--- + tests/testprogs/CMakeLists.txt | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +diff --git a/tests/testprogs/CMakeLists.txt b/tests/testprogs/CMakeLists.txt +index 4cc9967..2b407b7 100644 +--- a/tests/testprogs/CMakeLists.txt ++++ b/tests/testprogs/CMakeLists.txt +@@ -160,11 +160,16 @@ list(APPEND testprogtargets + ${CMAKE_CURRENT_BINARY_DIR}/.debug/uprobe_separate_debug-stripped.debug) + + # Build a binary with split DWARF (.dwo files) to verify parsing of the split debug info format. ++# Compile from within the output directory and pass a relative -o: some compilers ++# (e.g. clang) record the -o derived .dwo path verbatim in DW_AT_dwo_name without ++# applying -ffile-prefix-map, which would bake the absolute build directory into ++# both the binary and the .dwo file. + add_custom_command( + OUTPUT + ${EXTERNAL_DEBUG_DIR}/dwo/uprobe_test-split + ${EXTERNAL_DEBUG_DIR}/dwo/uprobe_test-split-uprobe_test.dwo +- COMMAND ${CMAKE_C_COMPILER} ${testprog_raw_cc_flags} -g -O0 -gsplit-dwarf ${CMAKE_CURRENT_SOURCE_DIR}/uprobe_test.c -o ${EXTERNAL_DEBUG_DIR}/dwo/uprobe_test-split ${testprog_raw_ld_flags} ++ COMMAND ${CMAKE_C_COMPILER} ${testprog_raw_cc_flags} -g -O0 -gsplit-dwarf ${CMAKE_CURRENT_SOURCE_DIR}/uprobe_test.c -o uprobe_test-split ${testprog_raw_ld_flags} ++ WORKING_DIRECTORY ${EXTERNAL_DEBUG_DIR}/dwo + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/uprobe_test.c + ) + list(APPEND testprogtargets ${EXTERNAL_DEBUG_DIR}/dwo/uprobe_test-split) +@@ -176,9 +181,10 @@ add_custom_command( + OUTPUT + ${EXTERNAL_DEBUG_DIR}/dwp/uprobe_test-split + ${EXTERNAL_DEBUG_DIR}/dwp/uprobe_test-split.dwp +- COMMAND ${CMAKE_C_COMPILER} ${testprog_raw_cc_flags} -g -O0 -gsplit-dwarf ${CMAKE_CURRENT_SOURCE_DIR}/uprobe_test.c -o ${EXTERNAL_DEBUG_DIR}/dwp/uprobe_test-split ${testprog_raw_ld_flags} +- COMMAND ${LLVM_DWP} -e ${EXTERNAL_DEBUG_DIR}/dwp/uprobe_test-split -o ${EXTERNAL_DEBUG_DIR}/dwp/uprobe_test-split.dwp ++ COMMAND ${CMAKE_C_COMPILER} ${testprog_raw_cc_flags} -g -O0 -gsplit-dwarf ${CMAKE_CURRENT_SOURCE_DIR}/uprobe_test.c -o uprobe_test-split ${testprog_raw_ld_flags} ++ COMMAND ${LLVM_DWP} -e uprobe_test-split -o uprobe_test-split.dwp + COMMAND ${CMAKE_COMMAND} -E rm -f ${EXTERNAL_DEBUG_DIR}/dwp/*.dwo ++ WORKING_DIRECTORY ${EXTERNAL_DEBUG_DIR}/dwp + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/uprobe_test.c + ) + list(APPEND testprogtargets diff --git a/meta-oe/dynamic-layers/meta-python/recipes-devtools/bpftrace/bpftrace_0.26.1.bb b/meta-oe/dynamic-layers/meta-python/recipes-devtools/bpftrace/bpftrace_0.26.1.bb index 44e32cb9a4..836f4d2483 100644 --- a/meta-oe/dynamic-layers/meta-python/recipes-devtools/bpftrace/bpftrace_0.26.1.bb +++ b/meta-oe/dynamic-layers/meta-python/recipes-devtools/bpftrace/bpftrace_0.26.1.bb @@ -19,6 +19,8 @@ SRC_URI = "git://github.com/iovisor/bpftrace;branch=release/0.26.x;protocol=http file://0003-cmake-BuildBPF.cmake-link-data-source-binary-without.patch \ file://0004-IRBuilderBPF-Fix-HasTerminator-on-LLVM-23.patch \ file://0005-CMakeLists-Add-support-for-LLVM-23.patch \ + file://0001-tests-pass-C-linker-flags-and-sysroot-to-raw-compile.patch \ + file://0006-tests-do-not-embed-build-paths-in-split-DWARF-test-pr.patch \ " SRCREV = "1bac8a8daad6e0aa579980e877d0c9d5fc296593"