diff options
| author | Tobias Hagelborn <tobias.hagelborn@axis.com> | 2017-08-25 13:32:37 +0200 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2017-08-27 22:30:06 +0100 |
| commit | 90c1e0da59e7919a511405063d4125d9629fcc2a (patch) | |
| tree | f3d50f830740ab959ce165b4b798b5c07a7df681 | |
| parent | f46240c7ba1bb6dca421a9744bfb47c1bea44b74 (diff) | |
| download | poky-90c1e0da59e7919a511405063d4125d9629fcc2a.tar.gz | |
package.py: strip_execs: Support for .ko modules
* Support stripping of .ko modules verifying file extension and
check of content "vermagic="
(From OE-Core rev: 61a20502a8433729e2c25b8c718e6f93e3bb6614)
Signed-off-by: Tobias Hagelborn <tobiasha@axis.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
| -rw-r--r-- | meta/lib/oe/package.py | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/meta/lib/oe/package.py b/meta/lib/oe/package.py index 839e9a25a0..fcee389aa2 100644 --- a/meta/lib/oe/package.py +++ b/meta/lib/oe/package.py | |||
| @@ -56,9 +56,12 @@ def strip_execs(pn, dstdir, strip_cmd, libdir, base_libdir, qa_already_stripped= | |||
| 56 | :param qa_already_stripped: Set to True if already-stripped' in ${INSANE_SKIP} | 56 | :param qa_already_stripped: Set to True if already-stripped' in ${INSANE_SKIP} |
| 57 | This is for proper logging and messages only. | 57 | This is for proper logging and messages only. |
| 58 | """ | 58 | """ |
| 59 | import stat, errno, oe.path, oe.utils | 59 | import stat, errno, oe.path, oe.utils, mmap |
| 60 | 60 | ||
| 61 | os.chdir(dstdir) | 61 | # Detect .ko module by searching for "vermagic=" string |
| 62 | def is_kernel_module(path): | ||
| 63 | with open(path) as f: | ||
| 64 | return mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ).find(b"vermagic=") >= 0 | ||
| 62 | 65 | ||
| 63 | # Return type (bits): | 66 | # Return type (bits): |
| 64 | # 0 - not elf | 67 | # 0 - not elf |
| @@ -69,7 +72,8 @@ def strip_execs(pn, dstdir, strip_cmd, libdir, base_libdir, qa_already_stripped= | |||
| 69 | # 16 - kernel module | 72 | # 16 - kernel module |
| 70 | def is_elf(path): | 73 | def is_elf(path): |
| 71 | exec_type = 0 | 74 | exec_type = 0 |
| 72 | ret, result = oe.utils.getstatusoutput("file \"%s\"" % path.replace("\"", "\\\"")) | 75 | ret, result = oe.utils.getstatusoutput( |
| 76 | "file \"%s\"" % path.replace("\"", "\\\"")) | ||
| 73 | 77 | ||
| 74 | if ret: | 78 | if ret: |
| 75 | bb.error("split_and_strip_files: 'file %s' failed" % path) | 79 | bb.error("split_and_strip_files: 'file %s' failed" % path) |
| @@ -83,14 +87,15 @@ def strip_execs(pn, dstdir, strip_cmd, libdir, base_libdir, qa_already_stripped= | |||
| 83 | exec_type |= 4 | 87 | exec_type |= 4 |
| 84 | if "shared" in result: | 88 | if "shared" in result: |
| 85 | exec_type |= 8 | 89 | exec_type |= 8 |
| 90 | if "relocatable" in result and is_kernel_module(path): | ||
| 91 | exec_type |= 16 | ||
| 86 | return exec_type | 92 | return exec_type |
| 87 | 93 | ||
| 88 | |||
| 89 | elffiles = {} | 94 | elffiles = {} |
| 90 | inodes = {} | 95 | inodes = {} |
| 91 | libdir = os.path.abspath(dstdir + os.sep + libdir) | 96 | libdir = os.path.abspath(dstdir + os.sep + libdir) |
| 92 | base_libdir = os.path.abspath(dstdir + os.sep + base_libdir) | 97 | base_libdir = os.path.abspath(dstdir + os.sep + base_libdir) |
| 93 | 98 | exec_mask = stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH | |
| 94 | # | 99 | # |
| 95 | # First lets figure out all of the files we may have to process | 100 | # First lets figure out all of the files we may have to process |
| 96 | # | 101 | # |
| @@ -110,8 +115,9 @@ def strip_execs(pn, dstdir, strip_cmd, libdir, base_libdir, qa_already_stripped= | |||
| 110 | if not s: | 115 | if not s: |
| 111 | continue | 116 | continue |
| 112 | # Check its an excutable | 117 | # Check its an excutable |
| 113 | if (s[stat.ST_MODE] & stat.S_IXUSR) or (s[stat.ST_MODE] & stat.S_IXGRP) or (s[stat.ST_MODE] & stat.S_IXOTH) \ | 118 | if s[stat.ST_MODE] & exec_mask \ |
| 114 | or ((file.startswith(libdir) or file.startswith(base_libdir)) and ".so" in f): | 119 | or ((file.startswith(libdir) or file.startswith(base_libdir)) and ".so" in f) \ |
| 120 | or file.endswith('.ko'): | ||
| 115 | # If it's a symlink, and points to an ELF file, we capture the readlink target | 121 | # If it's a symlink, and points to an ELF file, we capture the readlink target |
| 116 | if os.path.islink(file): | 122 | if os.path.islink(file): |
| 117 | continue | 123 | continue |
| @@ -131,8 +137,8 @@ def strip_execs(pn, dstdir, strip_cmd, libdir, base_libdir, qa_already_stripped= | |||
| 131 | os.unlink(file) | 137 | os.unlink(file) |
| 132 | os.link(inodes[s.st_ino], file) | 138 | os.link(inodes[s.st_ino], file) |
| 133 | else: | 139 | else: |
| 140 | # break hardlinks so that we do not strip the original. | ||
| 134 | inodes[s.st_ino] = file | 141 | inodes[s.st_ino] = file |
| 135 | # break hardlink | ||
| 136 | bb.utils.copyfile(file, file) | 142 | bb.utils.copyfile(file, file) |
| 137 | elffiles[file] = elf_file | 143 | elffiles[file] = elf_file |
| 138 | 144 | ||
| @@ -142,7 +148,6 @@ def strip_execs(pn, dstdir, strip_cmd, libdir, base_libdir, qa_already_stripped= | |||
| 142 | sfiles = [] | 148 | sfiles = [] |
| 143 | for file in elffiles: | 149 | for file in elffiles: |
| 144 | elf_file = int(elffiles[file]) | 150 | elf_file = int(elffiles[file]) |
| 145 | #bb.note("Strip %s" % file) | ||
| 146 | sfiles.append((file, elf_file, strip_cmd)) | 151 | sfiles.append((file, elf_file, strip_cmd)) |
| 147 | 152 | ||
| 148 | oe.utils.multiprocess_exec(sfiles, runstrip) | 153 | oe.utils.multiprocess_exec(sfiles, runstrip) |
