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>
This commit is contained in:
Richard Purdie 2016-03-04 16:27:11 +00:00
parent 6b564ae35d
commit 0b84897ea8
3 changed files with 34 additions and 1 deletions

View 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."
}

View 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

View 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')