]> code.ossystems Code Review - openembedded-core.git/commitdiff
image-mklibs: handle position independent binaries
authorTyler Hall <tylerwhall@gmail.com>
Wed, 9 Mar 2016 02:07:40 +0000 (21:07 -0500)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Thu, 10 Mar 2016 23:06:16 +0000 (23:06 +0000)
Executables built with -fpie have the ELF type DYN rather than EXEC
which makes them difficult to distinguish from shared libraries.
Currently when building the list of executables we omit these binaries
so they might fail to run on the resultant rootfs due to missing
symbols. One of these is systemd which builds -fpie unconditionally, so
mklibs breaks images containing systemd.

Modify the search to catch all executable files that are ELF and have an
interpreter set. Omit libc and libpthread as special cases because they
have an interpreter and are directly executable but treating them as
such is antithetical to the pupose of mklibs.

Signed-off-by: Tyler Hall <tylerwhall@gmail.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
meta/classes/image-mklibs.bbclass

index 6c0e8dcf35d9568ad1eeb448b821c98ba6de69e5..5f6df1b17fd52f077859556ac58e63ea68329c18 100644 (file)
@@ -9,13 +9,15 @@ mklibs_optimize_image_doit() {
        mkdir -p ${WORKDIR}/mklibs/dest
        cd ${IMAGE_ROOTFS}
        du -bs > ${WORKDIR}/mklibs/du.before.mklibs.txt
-       for i in `find .`; do file $i; done \
-               | grep ELF \
-               | grep "LSB *executable" \
-               | grep "dynamically linked" \
-               | sed "s/:.*//" \
-               | sed "s+^\./++" \
-               > ${WORKDIR}/mklibs/executables.list
+
+       # Build a list of dynamically linked executable ELF files.
+       # Omit libc/libpthread as a special case because it has an interpreter
+       # but is primarily what we intend to strip down.
+       for i in `find . -type f -executable ! -name 'libc-*' ! -name 'libpthread-*'`; do
+               file $i | grep -q ELF || continue
+               ${HOST_PREFIX}readelf -l $i | grep -q INTERP || continue
+               echo $i
+       done > ${WORKDIR}/mklibs/executables.list
 
        dynamic_loader=$(linuxloader)