diff options
-rw-r--r-- | meta/classes/insane.bbclass | 41 | ||||
-rw-r--r-- | meta/lib/oe/qa.py | 17 |
2 files changed, 35 insertions, 23 deletions
diff --git a/meta/classes/insane.bbclass b/meta/classes/insane.bbclass index 5757ed398b..2b4841933c 100644 --- a/meta/classes/insane.bbclass +++ b/meta/classes/insane.bbclass | |||
@@ -17,13 +17,8 @@ | |||
17 | # files under exec_prefix | 17 | # files under exec_prefix |
18 | 18 | ||
19 | 19 | ||
20 | # | ||
21 | # We need to have the scanelf utility as soon as | ||
22 | # possible and this is contained within the pax-utils-native. | ||
23 | # The package.bbclass can help us here. | ||
24 | # | ||
25 | inherit package | 20 | inherit package |
26 | PACKAGE_DEPENDS += "pax-utils-native ${QADEPENDS}" | 21 | PACKAGE_DEPENDS += "${QADEPENDS}" |
27 | PACKAGEFUNCS += " do_package_qa " | 22 | PACKAGEFUNCS += " do_package_qa " |
28 | 23 | ||
29 | # unsafe-references-in-binaries requires prelink-rtld from | 24 | # unsafe-references-in-binaries requires prelink-rtld from |
@@ -162,21 +157,23 @@ def package_qa_check_rpath(file,name, d, elf, messages): | |||
162 | if not elf: | 157 | if not elf: |
163 | return | 158 | return |
164 | 159 | ||
165 | scanelf = os.path.join(d.getVar('STAGING_BINDIR_NATIVE',True),'scanelf') | ||
166 | bad_dirs = [d.getVar('TMPDIR', True) + "/work", d.getVar('STAGING_DIR_TARGET', True)] | 160 | bad_dirs = [d.getVar('TMPDIR', True) + "/work", d.getVar('STAGING_DIR_TARGET', True)] |
167 | bad_dir_test = d.getVar('TMPDIR', True) | 161 | bad_dir_test = d.getVar('TMPDIR', True) |
168 | if not os.path.exists(scanelf): | ||
169 | bb.fatal("Can not check RPATH, scanelf (part of pax-utils-native) not found") | ||
170 | 162 | ||
171 | if not bad_dirs[0] in d.getVar('WORKDIR', True): | 163 | if not bad_dirs[0] in d.getVar('WORKDIR', True): |
172 | bb.fatal("This class assumed that WORKDIR is ${TMPDIR}/work... Not doing any check") | 164 | bb.fatal("This class assumed that WORKDIR is ${TMPDIR}/work... Not doing any check") |
173 | 165 | ||
174 | output = os.popen("%s -B -F%%r#F '%s'" % (scanelf,file)) | 166 | phdrs = elf.run_objdump("-p", d) |
175 | txt = output.readline().split() | 167 | |
176 | for line in txt: | 168 | import re |
177 | for dir in bad_dirs: | 169 | rpath_re = re.compile("\s+RPATH\s+(.*)") |
178 | if dir in line: | 170 | for line in phdrs.split("\n"): |
179 | messages.append("package %s contains bad RPATH %s in file %s" % (name, line, file)) | 171 | m = rpath_re.match(line) |
172 | if m: | ||
173 | rpath = m.group(1) | ||
174 | for dir in bad_dirs: | ||
175 | if dir in rpath: | ||
176 | messages.append("package %s contains bad RPATH %s in file %s" % (name, rpath, file)) | ||
180 | 177 | ||
181 | QAPATHTEST[useless-rpaths] = "package_qa_check_useless_rpaths" | 178 | QAPATHTEST[useless-rpaths] = "package_qa_check_useless_rpaths" |
182 | def package_qa_check_useless_rpaths(file, name, d, elf, messages): | 179 | def package_qa_check_useless_rpaths(file, name, d, elf, messages): |
@@ -189,15 +186,14 @@ def package_qa_check_useless_rpaths(file, name, d, elf, messages): | |||
189 | if not elf: | 186 | if not elf: |
190 | return | 187 | return |
191 | 188 | ||
192 | objdump = d.getVar('OBJDUMP', True) | ||
193 | env_path = d.getVar('PATH', True) | ||
194 | |||
195 | libdir = d.getVar("libdir", True) | 189 | libdir = d.getVar("libdir", True) |
196 | base_libdir = d.getVar("base_libdir", True) | 190 | base_libdir = d.getVar("base_libdir", True) |
197 | 191 | ||
192 | phdrs = elf.run_objdump("-p", d) | ||
193 | |||
198 | import re | 194 | import re |
199 | rpath_re = re.compile("\s+RPATH\s+(.*)") | 195 | rpath_re = re.compile("\s+RPATH\s+(.*)") |
200 | for line in os.popen("LC_ALL=C PATH=%s %s -p '%s' 2> /dev/null" % (env_path, objdump, file), "r"): | 196 | for line in phdrs.split("\n"): |
201 | m = rpath_re.match(line) | 197 | m = rpath_re.match(line) |
202 | if m: | 198 | if m: |
203 | rpath = m.group(1) | 199 | rpath = m.group(1) |
@@ -458,14 +454,13 @@ def package_qa_hash_style(path, name, d, elf, messages): | |||
458 | if not gnu_hash: | 454 | if not gnu_hash: |
459 | return | 455 | return |
460 | 456 | ||
461 | objdump = d.getVar('OBJDUMP', True) | ||
462 | env_path = d.getVar('PATH', True) | ||
463 | |||
464 | sane = False | 457 | sane = False |
465 | has_syms = False | 458 | has_syms = False |
466 | 459 | ||
460 | phdrs = elf.run_objdump("-p", d) | ||
461 | |||
467 | # If this binary has symbols, we expect it to have GNU_HASH too. | 462 | # If this binary has symbols, we expect it to have GNU_HASH too. |
468 | for line in os.popen("LC_ALL=C PATH=%s %s -p '%s' 2> /dev/null" % (env_path, objdump, path), "r"): | 463 | for line in phdrs.split("\n"): |
469 | if "SYMTAB" in line: | 464 | if "SYMTAB" in line: |
470 | has_syms = True | 465 | has_syms = True |
471 | if "GNU_HASH" in line: | 466 | if "GNU_HASH" in line: |
diff --git a/meta/lib/oe/qa.py b/meta/lib/oe/qa.py index d3800128ed..9e5ab587b7 100644 --- a/meta/lib/oe/qa.py +++ b/meta/lib/oe/qa.py | |||
@@ -28,6 +28,7 @@ class ELFFile: | |||
28 | def __init__(self, name, bits = 0): | 28 | def __init__(self, name, bits = 0): |
29 | self.name = name | 29 | self.name = name |
30 | self.bits = bits | 30 | self.bits = bits |
31 | self.objdump_output = {} | ||
31 | 32 | ||
32 | def open(self): | 33 | def open(self): |
33 | self.file = file(self.name, "r") | 34 | self.file = file(self.name, "r") |
@@ -87,3 +88,19 @@ class ELFFile: | |||
87 | import struct | 88 | import struct |
88 | (a,) = struct.unpack(self.sex+"H", self.data[18:20]) | 89 | (a,) = struct.unpack(self.sex+"H", self.data[18:20]) |
89 | return a | 90 | return a |
91 | |||
92 | def run_objdump(self, cmd, d): | ||
93 | import bb.process | ||
94 | import sys | ||
95 | |||
96 | if self.objdump_output.has_key(cmd): | ||
97 | return self.objdump_output[cmd] | ||
98 | |||
99 | objdump = d.getVar('OBJDUMP', True) | ||
100 | staging_dir = d.getVar('STAGING_BINDIR_TOOLCHAIN', True) | ||
101 | |||
102 | env = os.environ | ||
103 | env["LC_ALL"] = "C" | ||
104 | |||
105 | self.objdump_output[cmd] = bb.process.run([ os.path.join(staging_dir, objdump), cmd, self.name ], env=env, shell=False)[0] | ||
106 | return self.objdump_output[cmd] | ||