]> code.ossystems Code Review - openembedded-core.git/commitdiff
insane/prelink: Handle nonstandard library paths
authorRichard Purdie <richard.purdie@linuxfoundation.org>
Fri, 4 Mar 2016 16:27:11 +0000 (16:27 +0000)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Sun, 6 Mar 2016 23:52:58 +0000 (23:52 +0000)
Prelink contains some hardcoded assumptions about the path layout of
the target system. Unfortunately if the system doesn't match, prelink
doesn't work. This breaks:

a) prelink of those images
b) the unsafe-references-in-binaries QA test (which uses prelink-rtld)

One way to work around this is to construct an ld.so.conf file which
lists the library paths in question. We do this in sanity QA check and
in the rootfs prelink code, being careful not to trample any existing
target ld.so.conf.

There is an additional problem that $LIB references in RPATHs won't be
handled correctly, I've not see any system use these in reality though
so this change at least improves things.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
meta/classes/image-prelink.bbclass
meta/classes/insane.bbclass
meta/lib/oe/utils.py

index d4bb3aec39cebff41723a4c67e4cfcb699a95568..53c4b0b112d9ef09a15fe09c2390857cf037c743 100644 (file)
@@ -1,6 +1,10 @@
 do_rootfs[depends] += "prelink-native:do_populate_sysroot"
 
-IMAGE_PREPROCESS_COMMAND += "prelink_image; "
+IMAGE_PREPROCESS_COMMAND += "prelink_setup; prelink_image; "
+
+python prelink_setup () {
+    oe.utils.write_ld_so_conf(d)
+}
 
 prelink_image () {
 #      export PSEUDO_DEBUG=4
@@ -20,6 +24,13 @@ prelink_image () {
                dummy_prelink_conf=false;
        fi
 
+       # We need a ld.so.conf with pathnames in,prelink conf on the filesystem, add one if it's missing
+       ldsoconf=${IMAGE_ROOTFS}${sysconfdir}/ld.so.conf
+       if [ -e $ldsoconf ]; then
+               cp $ldsoconf $ldsoconf.prelink
+       fi
+       cat ${STAGING_DIR_TARGET}${sysconfdir}/ld.so.conf >> $ldsoconf
+
        # prelink!
        ${STAGING_DIR_NATIVE}${sbindir_native}/prelink --root ${IMAGE_ROOTFS} -amR -N -c ${sysconfdir}/prelink.conf
 
@@ -28,6 +39,12 @@ prelink_image () {
                rm -f ${IMAGE_ROOTFS}${sysconfdir}/prelink.conf
        fi
 
+       if [ -e $ldsoconf.prelink ]; then
+               mv $ldsoconf.prelink $ldsoconf
+       else
+               rm $ldsoconf
+       fi
+
        pre_prelink_size=`du -ks ${IMAGE_ROOTFS} | awk '{size = $1 ; print size }'`
        echo "Size after prelinking $pre_prelink_size."
 }
index ebf92ac621f579f3e6bd7a56d599b88ec82b52e8..7ac945d4cd0aff3dbc0db11bf605d3b39ebdf577 100644 (file)
@@ -1094,12 +1094,17 @@ python do_package_qa () {
                continue
             if w in testmatrix and testmatrix[w] in g:
                 warnchecks.append(g[testmatrix[w]])
+            if w == 'unsafe-references-in-binaries':
+                oe.utils.write_ld_so_conf(d)
+
         errorchecks = []
         for e in (d.getVar("ERROR_QA", True) or "").split():
             if e in skip:
                continue
             if e in testmatrix and testmatrix[e] in g:
                 errorchecks.append(g[testmatrix[e]])
+            if e == 'unsafe-references-in-binaries':
+                oe.utils.write_ld_so_conf(d)
 
         bb.note("Checking Package: %s" % package)
         # Check package name
index 9a86410b157362a01af26c5ea13c34f2fe2ab1f5..30d30629f1744d95e37894c2965a221aa00c8727 100644 (file)
@@ -293,3 +293,14 @@ class ThreadedPool:
         self.tasks.join()
         for worker in self.workers:
             worker.join()
+
+def write_ld_so_conf(d):
+    # Some utils like prelink may not have the correct target library paths
+    # so write an ld.so.conf to help them
+    ldsoconf = d.expand("${STAGING_DIR_TARGET}${sysconfdir}/ld.so.conf")
+    if os.path.exists(ldsoconf):
+        bb.utils.remove(ldsoconf)
+    bb.utils.mkdirhier(os.path.dirname(ldsoconf))
+    with open(ldsoconf, "w") as f:
+        f.write(d.getVar("base_libdir", True) + '\n')
+        f.write(d.getVar("libdir", True) + '\n')