summaryrefslogtreecommitdiff
path: root/meta
diff options
context:
space:
mode:
authorPhil Blundell <philb@gnu.org>2012-10-01 18:29:23 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2012-10-18 12:03:29 +0100
commitbf19eeb9f65e91bf2b5d89e7c0b099c55d7c15ff (patch)
tree97d0b0ae29fa4da0d306dc72c7771c541cc6016b /meta
parentd05e63c6c936a9ff209efd1341401ef7cd2ec0c1 (diff)
downloadopenembedded-core-bf19eeb9f65e91bf2b5d89e7c0b099c55d7c15ff.tar.gz
openembedded-core-bf19eeb9f65e91bf2b5d89e7c0b099c55d7c15ff.tar.bz2
openembedded-core-bf19eeb9f65e91bf2b5d89e7c0b099c55d7c15ff.zip
insane: Rationalise phdrs-based QA checks
Various different QA checks are based on essentially the same data from the ELF program headers. Calling objdump to extract it repeatedly is inefficient, particularly if the shell is involved. Instead, let's cache the output from objdump inside the qa.elf object and allow it to be reused by multiple tests. Also, using objdump instead of scanelf to check for bad RPATHs (in the same way that the useless-rpaths check was doing already) allows the dependency on pax-utils-native to be dropped. Signed-off-by: Phil Blundell <philb@gnu.org> Signed-off-by: Saul Wold <sgw@linux.intel.com>
Diffstat (limited to 'meta')
-rw-r--r--meta/classes/insane.bbclass41
-rw-r--r--meta/lib/oe/qa.py17
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 @@
# files under exec_prefix
-#
-# We need to have the scanelf utility as soon as
-# possible and this is contained within the pax-utils-native.
-# The package.bbclass can help us here.
-#
inherit package
-PACKAGE_DEPENDS += "pax-utils-native ${QADEPENDS}"
+PACKAGE_DEPENDS += "${QADEPENDS}"
PACKAGEFUNCS += " do_package_qa "
# unsafe-references-in-binaries requires prelink-rtld from
@@ -162,21 +157,23 @@ def package_qa_check_rpath(file,name, d, elf, messages):
if not elf:
return
- scanelf = os.path.join(d.getVar('STAGING_BINDIR_NATIVE',True),'scanelf')
bad_dirs = [d.getVar('TMPDIR', True) + "/work", d.getVar('STAGING_DIR_TARGET', True)]
bad_dir_test = d.getVar('TMPDIR', True)
- if not os.path.exists(scanelf):
- bb.fatal("Can not check RPATH, scanelf (part of pax-utils-native) not found")
if not bad_dirs[0] in d.getVar('WORKDIR', True):
bb.fatal("This class assumed that WORKDIR is ${TMPDIR}/work... Not doing any check")
- output = os.popen("%s -B -F%%r#F '%s'" % (scanelf,file))
- txt = output.readline().split()
- for line in txt:
- for dir in bad_dirs:
- if dir in line:
- messages.append("package %s contains bad RPATH %s in file %s" % (name, line, file))
+ phdrs = elf.run_objdump("-p", d)
+
+ import re
+ rpath_re = re.compile("\s+RPATH\s+(.*)")
+ for line in phdrs.split("\n"):
+ m = rpath_re.match(line)
+ if m:
+ rpath = m.group(1)
+ for dir in bad_dirs:
+ if dir in rpath:
+ messages.append("package %s contains bad RPATH %s in file %s" % (name, rpath, file))
QAPATHTEST[useless-rpaths] = "package_qa_check_useless_rpaths"
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):
if not elf:
return
- objdump = d.getVar('OBJDUMP', True)
- env_path = d.getVar('PATH', True)
-
libdir = d.getVar("libdir", True)
base_libdir = d.getVar("base_libdir", True)
+ phdrs = elf.run_objdump("-p", d)
+
import re
rpath_re = re.compile("\s+RPATH\s+(.*)")
- for line in os.popen("LC_ALL=C PATH=%s %s -p '%s' 2> /dev/null" % (env_path, objdump, file), "r"):
+ for line in phdrs.split("\n"):
m = rpath_re.match(line)
if m:
rpath = m.group(1)
@@ -458,14 +454,13 @@ def package_qa_hash_style(path, name, d, elf, messages):
if not gnu_hash:
return
- objdump = d.getVar('OBJDUMP', True)
- env_path = d.getVar('PATH', True)
-
sane = False
has_syms = False
+ phdrs = elf.run_objdump("-p", d)
+
# If this binary has symbols, we expect it to have GNU_HASH too.
- for line in os.popen("LC_ALL=C PATH=%s %s -p '%s' 2> /dev/null" % (env_path, objdump, path), "r"):
+ for line in phdrs.split("\n"):
if "SYMTAB" in line:
has_syms = True
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:
def __init__(self, name, bits = 0):
self.name = name
self.bits = bits
+ self.objdump_output = {}
def open(self):
self.file = file(self.name, "r")
@@ -87,3 +88,19 @@ class ELFFile:
import struct
(a,) = struct.unpack(self.sex+"H", self.data[18:20])
return a
+
+ def run_objdump(self, cmd, d):
+ import bb.process
+ import sys
+
+ if self.objdump_output.has_key(cmd):
+ return self.objdump_output[cmd]
+
+ objdump = d.getVar('OBJDUMP', True)
+ staging_dir = d.getVar('STAGING_BINDIR_TOOLCHAIN', True)
+
+ env = os.environ
+ env["LC_ALL"] = "C"
+
+ self.objdump_output[cmd] = bb.process.run([ os.path.join(staging_dir, objdump), cmd, self.name ], env=env, shell=False)[0]
+ return self.objdump_output[cmd]