From: Mathieu Othacehe <othacehe@gnu.org>
To: openembedded-core@lists.openembedded.org
Cc: Quentin Schulz <quentin.schulz@cherry.de>,
Mathieu Othacehe <othacehe@gnu.org>
Subject: [PATCH v2] lib/oe/package: Add strip keep-section support
Date: Tue, 4 Feb 2025 11:37:44 +0100 [thread overview]
Message-ID: <20250204103744.27883-1-othacehe@gnu.org> (raw)
Add a 'PACKAGE_KEEP_SECTIONS' variable to keep some specific ELF sections
while stripping binaries and libraries.
That one can then be used to keep the .debug_frame section around for
example, this way:
PACKAGE_KEEP_SECTIONS = ".debug_frame"
By using libunwind + minidebuginfo, that provides a way for users to get
debug_frame based backtraces on target.
Signed-off-by: Mathieu Othacehe <othacehe@gnu.org>
---
v1: https://lists.openembedded.org/g/openembedded-core/message/209545
documentation: https://lists.yoctoproject.org/g/docs/message/6243
meta/classes-global/staging.bbclass | 4 +++-
meta/classes-recipe/kernel.bbclass | 2 +-
meta/lib/oe/package.py | 23 +++++++++++++----------
3 files changed, 17 insertions(+), 12 deletions(-)
diff --git a/meta/classes-global/staging.bbclass b/meta/classes-global/staging.bbclass
index 1008867a6c..7083878c73 100644
--- a/meta/classes-global/staging.bbclass
+++ b/meta/classes-global/staging.bbclass
@@ -91,10 +91,12 @@ python sysroot_strip () {
base_libdir = d.getVar("base_libdir")
qa_already_stripped = 'already-stripped' in (d.getVar('INSANE_SKIP:' + pn) or "").split()
strip_cmd = d.getVar("STRIP")
+ keep_sections = d.getVar('PACKAGE_KEEP_SECTIONS') or ""
max_process = oe.utils.get_bb_number_threads(d)
oe.package.strip_execs(pn, dstdir, strip_cmd, libdir, base_libdir, max_process,
- qa_already_stripped=qa_already_stripped)
+ qa_already_stripped=qa_already_stripped,
+ keep_sections=keep_sections)
}
do_populate_sysroot[dirs] = "${SYSROOT_DESTDIR}"
diff --git a/meta/classes-recipe/kernel.bbclass b/meta/classes-recipe/kernel.bbclass
index 617727a989..d3d3d9fa65 100644
--- a/meta/classes-recipe/kernel.bbclass
+++ b/meta/classes-recipe/kernel.bbclass
@@ -770,7 +770,7 @@ python do_strip() {
if (extra_sections and kernel_image.find(d.getVar('KERNEL_IMAGEDEST') + '/vmlinux') != -1):
kernel_image_stripped = kernel_image + ".stripped"
shutil.copy2(kernel_image, kernel_image_stripped)
- oe.package.runstrip((kernel_image_stripped, 8, strip, extra_sections))
+ oe.package.runstrip((kernel_image_stripped, 8, strip), '', extra_sections)
bb.debug(1, "KERNEL_IMAGE_STRIP_EXTRA_SECTIONS is set, stripping sections: " + \
extra_sections)
}
diff --git a/meta/lib/oe/package.py b/meta/lib/oe/package.py
index 1af10b7eb0..468f331fce 100644
--- a/meta/lib/oe/package.py
+++ b/meta/lib/oe/package.py
@@ -18,7 +18,7 @@ import shutil
import oe.cachedpath
-def runstrip(arg):
+def runstrip(arg, keep_sections='', extra_strip_sections=''):
# Function to strip a single file, called from split_and_strip_files below
# A working 'file' (one which works on the target architecture)
#
@@ -27,12 +27,7 @@ def runstrip(arg):
# 4 - executable
# 8 - shared library
# 16 - kernel module
-
- if len(arg) == 3:
- (file, elftype, strip) = arg
- extra_strip_sections = ''
- else:
- (file, elftype, strip, extra_strip_sections) = arg
+ (file, elftype, strip) = arg
newmode = None
if not os.access(file, os.W_OK) or os.access(file, os.R_OK):
@@ -60,6 +55,10 @@ def runstrip(arg):
for section in extra_strip_sections.split():
stripcmd.extend(["--remove-section=" + section])
+ if keep_sections != '' and not elftype & 16:
+ for section in keep_sections.split():
+ stripcmd.extend(["--keep-section=" + section])
+
stripcmd.append(file)
bb.debug(1, "runstrip: %s" % stripcmd)
@@ -115,7 +114,8 @@ def is_static_lib(path):
return start == magic
return False
-def strip_execs(pn, dstdir, strip_cmd, libdir, base_libdir, max_process, qa_already_stripped=False):
+def strip_execs(pn, dstdir, strip_cmd, libdir, base_libdir, max_process, qa_already_stripped=False,
+ keep_sections=''):
"""
Strip executable code (like executables, shared libraries) _in_place_
- Based on sysroot_strip in staging.bbclass
@@ -194,7 +194,8 @@ def strip_execs(pn, dstdir, strip_cmd, libdir, base_libdir, max_process, qa_alre
elf_file = int(elffiles[file])
sfiles.append((file, elf_file, strip_cmd))
- oe.utils.multiprocess_launch_mp(runstrip, sfiles, max_process)
+ oe.utils.multiprocess_launch_mp(runstrip, sfiles, max_process,
+ extraargs=(keep_sections, ''))
TRANSLATE = (
("@", "@at@"),
@@ -1305,7 +1306,9 @@ def process_split_and_strip_files(d):
for f in staticlibs:
sfiles.append((f, 16, strip))
- oe.utils.multiprocess_launch(oe.package.runstrip, sfiles, d)
+ keep_sections = d.getVar('PACKAGE_KEEP_SECTIONS') or ""
+ oe.utils.multiprocess_launch(oe.package.runstrip, sfiles, d,
+ extraargs=(keep_sections, ''))
# Build "minidebuginfo" and reinject it back into the stripped binaries
if bb.utils.contains('DISTRO_FEATURES', 'minidebuginfo', True, False, d):
--
2.25.1
next reply other threads:[~2025-02-04 10:37 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-04 10:37 Mathieu Othacehe [this message]
2025-02-04 11:37 ` [OE-core] [PATCH v2] lib/oe/package: Add strip keep-section support Alexander Kanavin
2025-02-04 11:39 ` Alexander Kanavin
2025-02-04 12:36 ` Mathieu Othacehe
2025-02-04 12:50 ` Alexander Kanavin
2025-02-04 14:25 ` Mathieu Othacehe
2025-02-04 19:02 ` Alexander Kanavin
2025-02-27 15:28 ` Richard Purdie
2025-02-28 9:09 ` Mathieu Othacehe
2025-02-28 10:37 ` Richard Purdie
2025-03-01 9:31 ` Mathieu Othacehe
2025-03-01 9:57 ` Richard Purdie
2025-03-06 7:34 ` Mathieu Othacehe
2025-03-01 16:11 ` Khem Raj
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250204103744.27883-1-othacehe@gnu.org \
--to=othacehe@gnu.org \
--cc=openembedded-core@lists.openembedded.org \
--cc=quentin.schulz@cherry.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox