[RFC,v2,2/3] package: Add support for kernel stripping

Message ID 20220111235840.81471-3-saul.wold@windriver.com
State Accepted, archived
Commit e09a8fa931fe617afc05bd5e00dca5dd3fe386e8
Headers show
Series Extend create-spdx to build kernel spdx info | expand

Commit Message

Saul Wold Jan. 11, 2022, 11:58 p.m. UTC
Extend runstrip() to accept additional argument to enable
sharing it with the kernel do_strip() to that
KERNEL_IMAGE_STRIP_EXTRA_SECTIONS can be passed.

Since is_elf() understands kernel modules there is no need to keep a
seperate list for kernmodules or hardcode the values to runstrip.

Signed-off-by: Saul Wold <saul.wold@windriver.com>
---
 meta/classes/package.bbclass | 21 +++++++--------------
 meta/lib/oe/package.py       |  7 +++++--
 2 files changed, 12 insertions(+), 16 deletions(-)

Comments

Bruce Ashfield Jan. 12, 2022, 2:21 p.m. UTC | #1
On Tue, Jan 11, 2022 at 6:59 PM Saul Wold <saul.wold@windriver.com> wrote:
>
> Extend runstrip() to accept additional argument to enable
> sharing it with the kernel do_strip() to that
> KERNEL_IMAGE_STRIP_EXTRA_SECTIONS can be passed.
>
> Since is_elf() understands kernel modules there is no need to keep a
> seperate list for kernmodules or hardcode the values to runstrip.
>
> Signed-off-by: Saul Wold <saul.wold@windriver.com>
> ---
>  meta/classes/package.bbclass | 21 +++++++--------------
>  meta/lib/oe/package.py       |  7 +++++--
>  2 files changed, 12 insertions(+), 16 deletions(-)
>
> diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass
> index 09cd376f4af..794996e6d6d 100644
> --- a/meta/classes/package.bbclass
> +++ b/meta/classes/package.bbclass
> @@ -390,10 +390,6 @@ def splitdebuginfo(file, dvar, debugdir, debuglibdir, debugappend, debugsrcdir,
>      dvar = d.getVar('PKGD')
>      objcopy = d.getVar("OBJCOPY")
>
> -    # We ignore kernel modules, we don't generate debug info files.
> -    if file.find("/lib/modules/") != -1 and file.endswith(".ko"):
> -        return (file, sources)
> -
>      newmode = None
>      if not os.access(file, os.W_OK) or os.access(file, os.R_OK):
>          origmode = os.stat(file)[stat.ST_MODE]
> @@ -1122,7 +1118,6 @@ python split_and_strip_files () {
>      #
>      elffiles = {}
>      symlinks = {}
> -    kernmods = []
>      staticlibs = []
>      inodes = {}
>      libdir = os.path.abspath(dvar + os.sep + d.getVar("libdir"))
> @@ -1145,9 +1140,6 @@ python split_and_strip_files () {
>                  if file in skipfiles:
>                      continue
>
> -                if file.endswith(".ko") and file.find("/lib/modules/") != -1:
> -                    kernmods.append(file)
> -                    continue
>                  if oe.package.is_static_lib(file):
>                      staticlibs.append(file)
>                      continue
> @@ -1164,8 +1156,11 @@ python split_and_strip_files () {
>                  if not s:
>                      continue
>                  # Check its an executable
> -                if (s[stat.ST_MODE] & stat.S_IXUSR) or (s[stat.ST_MODE] & stat.S_IXGRP) or (s[stat.ST_MODE] & stat.S_IXOTH) \
> -                        or ((file.startswith(libdir) or file.startswith(baselibdir)) and (".so" in f or ".node" in f)):
> +                if (s[stat.ST_MODE] & stat.S_IXUSR) or (s[stat.ST_MODE] & stat.S_IXGRP) \
> +                        or (s[stat.ST_MODE] & stat.S_IXOTH) \
> +                        or ((file.startswith(libdir) or file.startswith(baselibdir)) \
> +                        and (".so" in f or ".node" in f)) \
> +                        or (f.startswith('vmlinux') or ".ko" in f):
>
>                      if cpath.islink(file):
>                          checkelflinks[file] = ltarget
> @@ -1311,12 +1306,10 @@ python split_and_strip_files () {
>          for file in elffiles:
>              elf_file = int(elffiles[file])
>              #bb.note("Strip %s" % file)
> -            sfiles.append((file, elf_file, strip))
> -        for f in kernmods:
> -            sfiles.append((f, 16, strip))
> +            sfiles.append((file, elf_file, strip, ''))
>          if (d.getVar('PACKAGE_STRIP_STATIC') == '1' or d.getVar('PACKAGE_DEBUG_STATIC_SPLIT') == '1'):
>              for f in staticlibs:
> -                sfiles.append((f, 16, strip))
> +                sfiles.append((f, 16, strip, ''))
>
>          oe.utils.multiprocess_launch(oe.package.runstrip, sfiles, d)
>
> diff --git a/meta/lib/oe/package.py b/meta/lib/oe/package.py
> index dd700cbb0c9..7842a614e9f 100644
> --- a/meta/lib/oe/package.py
> +++ b/meta/lib/oe/package.py
> @@ -16,7 +16,7 @@ def runstrip(arg):
>      # 8 - shared library
>      # 16 - kernel module
>
> -    (file, elftype, strip) = arg
> +    (file, elftype, strip, extra_strip_sections) = arg
>
>      newmode = None
>      if not os.access(file, os.W_OK) or os.access(file, os.R_OK):
> @@ -40,6 +40,9 @@ def runstrip(arg):
>      # shared or executable:
>      elif elftype & 8 or elftype & 4:
>          stripcmd.extend(["--remove-section=.comment", "--remove-section=.note"])
> +        if file.find("boot/vmlinux") != -1 and extra_strip_sections != '':
> +            for section in extra_strip_sections.split():
> +                stripcmd.extend(["--remove-section=" + section])

One thought that came to mind when reading this, is does that really
need to be restricted to boot/vmlinux ? The code would be simplified
by just testing for 'if extra_strip_sections:' .. and then the
sections are only passed for the kernel components that need it.

The more broadly available functionality obviously isn't used (or
maybe ever needed), but it does simplify things.  But I'm only looking
at the diff, so maybe I'm missing a nuance.

>
>      stripcmd.append(file)
>      bb.debug(1, "runstrip: %s" % stripcmd)
> @@ -172,7 +175,7 @@ def strip_execs(pn, dstdir, strip_cmd, libdir, base_libdir, d, qa_already_stripp
>      sfiles = []
>      for file in elffiles:
>          elf_file = int(elffiles[file])
> -        sfiles.append((file, elf_file, strip_cmd))
> +        sfiles.append((file, elf_file, strip_cmd, ''))

Rather than needing to add the '' to all of the appends, isn't there a
way that the oe util runstrip could just check the length of args and
assign a default if there isn't a 4th argument ? That routine is
already assigning specifically to variables to checking the length
wouldn't be adding any specific knowledge to a generic routine.

Bruce

>
>      oe.utils.multiprocess_launch(runstrip, sfiles, d)
>
> --
> 2.31.1
>

Patch

diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass
index 09cd376f4af..794996e6d6d 100644
--- a/meta/classes/package.bbclass
+++ b/meta/classes/package.bbclass
@@ -390,10 +390,6 @@  def splitdebuginfo(file, dvar, debugdir, debuglibdir, debugappend, debugsrcdir,
     dvar = d.getVar('PKGD')
     objcopy = d.getVar("OBJCOPY")
 
-    # We ignore kernel modules, we don't generate debug info files.
-    if file.find("/lib/modules/") != -1 and file.endswith(".ko"):
-        return (file, sources)
-
     newmode = None
     if not os.access(file, os.W_OK) or os.access(file, os.R_OK):
         origmode = os.stat(file)[stat.ST_MODE]
@@ -1122,7 +1118,6 @@  python split_and_strip_files () {
     #
     elffiles = {}
     symlinks = {}
-    kernmods = []
     staticlibs = []
     inodes = {}
     libdir = os.path.abspath(dvar + os.sep + d.getVar("libdir"))
@@ -1145,9 +1140,6 @@  python split_and_strip_files () {
                 if file in skipfiles:
                     continue
 
-                if file.endswith(".ko") and file.find("/lib/modules/") != -1:
-                    kernmods.append(file)
-                    continue
                 if oe.package.is_static_lib(file):
                     staticlibs.append(file)
                     continue
@@ -1164,8 +1156,11 @@  python split_and_strip_files () {
                 if not s:
                     continue
                 # Check its an executable
-                if (s[stat.ST_MODE] & stat.S_IXUSR) or (s[stat.ST_MODE] & stat.S_IXGRP) or (s[stat.ST_MODE] & stat.S_IXOTH) \
-                        or ((file.startswith(libdir) or file.startswith(baselibdir)) and (".so" in f or ".node" in f)):
+                if (s[stat.ST_MODE] & stat.S_IXUSR) or (s[stat.ST_MODE] & stat.S_IXGRP) \
+                        or (s[stat.ST_MODE] & stat.S_IXOTH) \
+                        or ((file.startswith(libdir) or file.startswith(baselibdir)) \
+                        and (".so" in f or ".node" in f)) \
+                        or (f.startswith('vmlinux') or ".ko" in f):
 
                     if cpath.islink(file):
                         checkelflinks[file] = ltarget
@@ -1311,12 +1306,10 @@  python split_and_strip_files () {
         for file in elffiles:
             elf_file = int(elffiles[file])
             #bb.note("Strip %s" % file)
-            sfiles.append((file, elf_file, strip))
-        for f in kernmods:
-            sfiles.append((f, 16, strip))
+            sfiles.append((file, elf_file, strip, ''))
         if (d.getVar('PACKAGE_STRIP_STATIC') == '1' or d.getVar('PACKAGE_DEBUG_STATIC_SPLIT') == '1'):
             for f in staticlibs:
-                sfiles.append((f, 16, strip))
+                sfiles.append((f, 16, strip, ''))
 
         oe.utils.multiprocess_launch(oe.package.runstrip, sfiles, d)
 
diff --git a/meta/lib/oe/package.py b/meta/lib/oe/package.py
index dd700cbb0c9..7842a614e9f 100644
--- a/meta/lib/oe/package.py
+++ b/meta/lib/oe/package.py
@@ -16,7 +16,7 @@  def runstrip(arg):
     # 8 - shared library
     # 16 - kernel module
 
-    (file, elftype, strip) = arg
+    (file, elftype, strip, extra_strip_sections) = arg
 
     newmode = None
     if not os.access(file, os.W_OK) or os.access(file, os.R_OK):
@@ -40,6 +40,9 @@  def runstrip(arg):
     # shared or executable:
     elif elftype & 8 or elftype & 4:
         stripcmd.extend(["--remove-section=.comment", "--remove-section=.note"])
+        if file.find("boot/vmlinux") != -1 and extra_strip_sections != '':
+            for section in extra_strip_sections.split():
+                stripcmd.extend(["--remove-section=" + section])
 
     stripcmd.append(file)
     bb.debug(1, "runstrip: %s" % stripcmd)
@@ -172,7 +175,7 @@  def strip_execs(pn, dstdir, strip_cmd, libdir, base_libdir, d, qa_already_stripp
     sfiles = []
     for file in elffiles:
         elf_file = int(elffiles[file])
-        sfiles.append((file, elf_file, strip_cmd))
+        sfiles.append((file, elf_file, strip_cmd, ''))
 
     oe.utils.multiprocess_launch(runstrip, sfiles, d)