[oe-commits] [openembedded-core] 16/17: insane/prelink: Handle nonstandard library paths

git at git.openembedded.org git at git.openembedded.org
Mon Mar 7 00:12:28 UTC 2016


rpurdie pushed a commit to branch master
in repository openembedded-core.

commit 7fd1d7e639c2ed7e0699937a5cb245c187b7c811
Author: Richard Purdie <richard.purdie at linuxfoundation.org>
AuthorDate: Fri Mar 4 16:27:11 2016 +0000

    insane/prelink: Handle nonstandard library paths
    
    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 at linuxfoundation.org>
---
 meta/classes/image-prelink.bbclass | 19 ++++++++++++++++++-
 meta/classes/insane.bbclass        |  5 +++++
 meta/lib/oe/utils.py               | 11 +++++++++++
 3 files changed, 34 insertions(+), 1 deletion(-)

diff --git a/meta/classes/image-prelink.bbclass b/meta/classes/image-prelink.bbclass
index d4bb3ae..53c4b0b 100644
--- a/meta/classes/image-prelink.bbclass
+++ b/meta/classes/image-prelink.bbclass
@@ -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."
 }
diff --git a/meta/classes/insane.bbclass b/meta/classes/insane.bbclass
index ebf92ac..7ac945d 100644
--- a/meta/classes/insane.bbclass
+++ b/meta/classes/insane.bbclass
@@ -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
diff --git a/meta/lib/oe/utils.py b/meta/lib/oe/utils.py
index 9a86410..30d3062 100644
--- a/meta/lib/oe/utils.py
+++ b/meta/lib/oe/utils.py
@@ -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')

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Openembedded-commits mailing list