diff options
-rw-r--r-- | meta/classes/package.bbclass | 40 | ||||
-rw-r--r-- | meta/lib/oe/package.py | 73 |
2 files changed, 47 insertions, 66 deletions
diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass index 94e4639a11..f121acccab 100644 --- a/meta/classes/package.bbclass +++ b/meta/classes/package.bbclass | |||
@@ -936,38 +936,6 @@ python split_and_strip_files () { | |||
936 | sourcefile = d.expand("${WORKDIR}/debugsources.list") | 936 | sourcefile = d.expand("${WORKDIR}/debugsources.list") |
937 | bb.utils.remove(sourcefile) | 937 | bb.utils.remove(sourcefile) |
938 | 938 | ||
939 | # Return type (bits): | ||
940 | # 0 - not elf | ||
941 | # 1 - ELF | ||
942 | # 2 - stripped | ||
943 | # 4 - executable | ||
944 | # 8 - shared library | ||
945 | # 16 - kernel module | ||
946 | def isELF(path): | ||
947 | type = 0 | ||
948 | result = subprocess.check_output(["file", "-b", path], stderr=subprocess.STDOUT).decode("utf-8") | ||
949 | |||
950 | # Not stripped | ||
951 | if "ELF" in result: | ||
952 | type |= 1 | ||
953 | if "not stripped" not in result: | ||
954 | type |= 2 | ||
955 | if "executable" in result: | ||
956 | type |= 4 | ||
957 | if "shared" in result: | ||
958 | type |= 8 | ||
959 | return type | ||
960 | |||
961 | def isStaticLib(path): | ||
962 | if path.endswith('.a') and not os.path.islink(path): | ||
963 | with open(path, 'rb') as fh: | ||
964 | # The magic must include the first slash to avoid | ||
965 | # matching golang static libraries | ||
966 | magic = b'!<arch>\x0a/' | ||
967 | start = fh.read(len(magic)) | ||
968 | return start == magic | ||
969 | return False | ||
970 | |||
971 | # | 939 | # |
972 | # First lets figure out all of the files we may have to process ... do this only once! | 940 | # First lets figure out all of the files we may have to process ... do this only once! |
973 | # | 941 | # |
@@ -987,7 +955,7 @@ python split_and_strip_files () { | |||
987 | if file.endswith(".ko") and file.find("/lib/modules/") != -1: | 955 | if file.endswith(".ko") and file.find("/lib/modules/") != -1: |
988 | kernmods.append(file) | 956 | kernmods.append(file) |
989 | continue | 957 | continue |
990 | if isStaticLib(file): | 958 | if oe.package.is_static_lib(file): |
991 | staticlibs.append(file) | 959 | staticlibs.append(file) |
992 | continue | 960 | continue |
993 | 961 | ||
@@ -1017,14 +985,14 @@ python split_and_strip_files () { | |||
1017 | # If it's a symlink, and points to an ELF file, we capture the readlink target | 985 | # If it's a symlink, and points to an ELF file, we capture the readlink target |
1018 | if cpath.islink(file): | 986 | if cpath.islink(file): |
1019 | target = os.readlink(file) | 987 | target = os.readlink(file) |
1020 | if isELF(ltarget): | 988 | if oe.package.is_elf(ltarget): |
1021 | #bb.note("Sym: %s (%d)" % (ltarget, isELF(ltarget))) | 989 | #bb.note("Sym: %s (%d)" % (ltarget, oe.package.is_elf(ltarget))) |
1022 | symlinks[file] = target | 990 | symlinks[file] = target |
1023 | continue | 991 | continue |
1024 | 992 | ||
1025 | # It's a file (or hardlink), not a link | 993 | # It's a file (or hardlink), not a link |
1026 | # ...but is it ELF, and is it already stripped? | 994 | # ...but is it ELF, and is it already stripped? |
1027 | elf_file = isELF(file) | 995 | elf_file = oe.package.is_elf(file) |
1028 | if elf_file & 1: | 996 | if elf_file & 1: |
1029 | if elf_file & 2: | 997 | if elf_file & 2: |
1030 | if 'already-stripped' in (d.getVar('INSANE_SKIP_' + pn) or "").split(): | 998 | if 'already-stripped' in (d.getVar('INSANE_SKIP_' + pn) or "").split(): |
diff --git a/meta/lib/oe/package.py b/meta/lib/oe/package.py index 8a303106a9..a435d661a6 100644 --- a/meta/lib/oe/package.py +++ b/meta/lib/oe/package.py | |||
@@ -1,8 +1,11 @@ | |||
1 | import mmap | ||
2 | import subprocess | ||
3 | |||
1 | def runstrip(arg): | 4 | def runstrip(arg): |
2 | # Function to strip a single file, called from split_and_strip_files below | 5 | # Function to strip a single file, called from split_and_strip_files below |
3 | # A working 'file' (one which works on the target architecture) | 6 | # A working 'file' (one which works on the target architecture) |
4 | # | 7 | # |
5 | # The elftype is a bit pattern (explained in split_and_strip_files) to tell | 8 | # The elftype is a bit pattern (explained in is_elf below) to tell |
6 | # us what type of file we're processing... | 9 | # us what type of file we're processing... |
7 | # 4 - executable | 10 | # 4 - executable |
8 | # 8 - shared library | 11 | # 8 - shared library |
@@ -44,6 +47,44 @@ def runstrip(arg): | |||
44 | 47 | ||
45 | return | 48 | return |
46 | 49 | ||
50 | # Detect .ko module by searching for "vermagic=" string | ||
51 | def is_kernel_module(path): | ||
52 | with open(path) as f: | ||
53 | return mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ).find(b"vermagic=") >= 0 | ||
54 | |||
55 | # Return type (bits): | ||
56 | # 0 - not elf | ||
57 | # 1 - ELF | ||
58 | # 2 - stripped | ||
59 | # 4 - executable | ||
60 | # 8 - shared library | ||
61 | # 16 - kernel module | ||
62 | def is_elf(path): | ||
63 | exec_type = 0 | ||
64 | result = subprocess.check_output(["file", "-b", path], stderr=subprocess.STDOUT).decode("utf-8") | ||
65 | |||
66 | if "ELF" in result: | ||
67 | exec_type |= 1 | ||
68 | if "not stripped" not in result: | ||
69 | exec_type |= 2 | ||
70 | if "executable" in result: | ||
71 | exec_type |= 4 | ||
72 | if "shared" in result: | ||
73 | exec_type |= 8 | ||
74 | if "relocatable" in result: | ||
75 | if path.endswith(".ko") and path.find("/lib/modules/") != -1 and is_kernel_module(path): | ||
76 | exec_type |= 16 | ||
77 | return exec_type | ||
78 | |||
79 | def is_static_lib(path): | ||
80 | if path.endswith('.a') and not os.path.islink(path): | ||
81 | with open(path, 'rb') as fh: | ||
82 | # The magic must include the first slash to avoid | ||
83 | # matching golang static libraries | ||
84 | magic = b'!<arch>\x0a/' | ||
85 | start = fh.read(len(magic)) | ||
86 | return start == magic | ||
87 | return False | ||
47 | 88 | ||
48 | def strip_execs(pn, dstdir, strip_cmd, libdir, base_libdir, qa_already_stripped=False): | 89 | def strip_execs(pn, dstdir, strip_cmd, libdir, base_libdir, qa_already_stripped=False): |
49 | """ | 90 | """ |
@@ -56,35 +97,7 @@ 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} | 97 | :param qa_already_stripped: Set to True if already-stripped' in ${INSANE_SKIP} |
57 | This is for proper logging and messages only. | 98 | This is for proper logging and messages only. |
58 | """ | 99 | """ |
59 | import stat, errno, oe.path, oe.utils, mmap, subprocess | 100 | import stat, errno, oe.path, oe.utils |
60 | |||
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 | ||
65 | |||
66 | # Return type (bits): | ||
67 | # 0 - not elf | ||
68 | # 1 - ELF | ||
69 | # 2 - stripped | ||
70 | # 4 - executable | ||
71 | # 8 - shared library | ||
72 | # 16 - kernel module | ||
73 | def is_elf(path): | ||
74 | exec_type = 0 | ||
75 | result = subprocess.check_output(["file", "-b", path], stderr=subprocess.STDOUT).decode("utf-8") | ||
76 | |||
77 | if "ELF" in result: | ||
78 | exec_type |= 1 | ||
79 | if "not stripped" not in result: | ||
80 | exec_type |= 2 | ||
81 | if "executable" in result: | ||
82 | exec_type |= 4 | ||
83 | if "shared" in result: | ||
84 | exec_type |= 8 | ||
85 | if "relocatable" in result and is_kernel_module(path): | ||
86 | exec_type |= 16 | ||
87 | return exec_type | ||
88 | 101 | ||
89 | elffiles = {} | 102 | elffiles = {} |
90 | inodes = {} | 103 | inodes = {} |