summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2016-03-04 16:27:11 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2016-03-07 00:11:39 +0000
commit0b84897ea813a4f7a8b198efcc7ac335debf19d9 (patch)
treeba827f0c0486936de4616efc8eeb24876e90474f
parent6b564ae35d35693476513141ab9ae49aa734c7eb (diff)
downloadpoky-0b84897ea813a4f7a8b198efcc7ac335debf19d9.tar.gz
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 <richard.purdie@linuxfoundation.org>
-rw-r--r--meta/classes/image-prelink.bbclass19
-rw-r--r--meta/classes/insane.bbclass5
-rw-r--r--meta/lib/oe/utils.py11
3 files changed, 34 insertions, 1 deletions
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 @@
1do_rootfs[depends] += "prelink-native:do_populate_sysroot" 1do_rootfs[depends] += "prelink-native:do_populate_sysroot"
2 2
3IMAGE_PREPROCESS_COMMAND += "prelink_image; " 3IMAGE_PREPROCESS_COMMAND += "prelink_setup; prelink_image; "
4
5python prelink_setup () {
6 oe.utils.write_ld_so_conf(d)
7}
4 8
5prelink_image () { 9prelink_image () {
6# export PSEUDO_DEBUG=4 10# export PSEUDO_DEBUG=4
@@ -20,6 +24,13 @@ prelink_image () {
20 dummy_prelink_conf=false; 24 dummy_prelink_conf=false;
21 fi 25 fi
22 26
27 # We need a ld.so.conf with pathnames in,prelink conf on the filesystem, add one if it's missing
28 ldsoconf=${IMAGE_ROOTFS}${sysconfdir}/ld.so.conf
29 if [ -e $ldsoconf ]; then
30 cp $ldsoconf $ldsoconf.prelink
31 fi
32 cat ${STAGING_DIR_TARGET}${sysconfdir}/ld.so.conf >> $ldsoconf
33
23 # prelink! 34 # prelink!
24 ${STAGING_DIR_NATIVE}${sbindir_native}/prelink --root ${IMAGE_ROOTFS} -amR -N -c ${sysconfdir}/prelink.conf 35 ${STAGING_DIR_NATIVE}${sbindir_native}/prelink --root ${IMAGE_ROOTFS} -amR -N -c ${sysconfdir}/prelink.conf
25 36
@@ -28,6 +39,12 @@ prelink_image () {
28 rm -f ${IMAGE_ROOTFS}${sysconfdir}/prelink.conf 39 rm -f ${IMAGE_ROOTFS}${sysconfdir}/prelink.conf
29 fi 40 fi
30 41
42 if [ -e $ldsoconf.prelink ]; then
43 mv $ldsoconf.prelink $ldsoconf
44 else
45 rm $ldsoconf
46 fi
47
31 pre_prelink_size=`du -ks ${IMAGE_ROOTFS} | awk '{size = $1 ; print size }'` 48 pre_prelink_size=`du -ks ${IMAGE_ROOTFS} | awk '{size = $1 ; print size }'`
32 echo "Size after prelinking $pre_prelink_size." 49 echo "Size after prelinking $pre_prelink_size."
33} 50}
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 () {
1094 continue 1094 continue
1095 if w in testmatrix and testmatrix[w] in g: 1095 if w in testmatrix and testmatrix[w] in g:
1096 warnchecks.append(g[testmatrix[w]]) 1096 warnchecks.append(g[testmatrix[w]])
1097 if w == 'unsafe-references-in-binaries':
1098 oe.utils.write_ld_so_conf(d)
1099
1097 errorchecks = [] 1100 errorchecks = []
1098 for e in (d.getVar("ERROR_QA", True) or "").split(): 1101 for e in (d.getVar("ERROR_QA", True) or "").split():
1099 if e in skip: 1102 if e in skip:
1100 continue 1103 continue
1101 if e in testmatrix and testmatrix[e] in g: 1104 if e in testmatrix and testmatrix[e] in g:
1102 errorchecks.append(g[testmatrix[e]]) 1105 errorchecks.append(g[testmatrix[e]])
1106 if e == 'unsafe-references-in-binaries':
1107 oe.utils.write_ld_so_conf(d)
1103 1108
1104 bb.note("Checking Package: %s" % package) 1109 bb.note("Checking Package: %s" % package)
1105 # Check package name 1110 # 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:
293 self.tasks.join() 293 self.tasks.join()
294 for worker in self.workers: 294 for worker in self.workers:
295 worker.join() 295 worker.join()
296
297def write_ld_so_conf(d):
298 # Some utils like prelink may not have the correct target library paths
299 # so write an ld.so.conf to help them
300 ldsoconf = d.expand("${STAGING_DIR_TARGET}${sysconfdir}/ld.so.conf")
301 if os.path.exists(ldsoconf):
302 bb.utils.remove(ldsoconf)
303 bb.utils.mkdirhier(os.path.dirname(ldsoconf))
304 with open(ldsoconf, "w") as f:
305 f.write(d.getVar("base_libdir", True) + '\n')
306 f.write(d.getVar("libdir", True) + '\n')