From 0b84897ea813a4f7a8b198efcc7ac335debf19d9 Mon Sep 17 00:00:00 2001 From: Richard Purdie Date: Fri, 4 Mar 2016 16:27:11 +0000 Subject: 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. (From OE-Core rev: 7fd1d7e639c2ed7e0699937a5cb245c187b7c811) Signed-off-by: Richard Purdie --- 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 d4bb3aec39..53c4b0b112 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 ebf92ac621..7ac945d4cd 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 9a86410b15..30d30629f1 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') -- cgit v1.2.3-54-g00ecf