From: Michel Thebeau <michel.theb...@windriver.com>

Allow recipes to specify sections to be stripped from the kernel output
using KERNEL_IMAGE_STRIP_EXTRA_SECTIONS.  For example:

KERNEL_IMAGE_STRIP_EXTRA_SECTIONS = ".comment .unwanted"

The file to be stripped is a copy of ${KERNEL_OUTPUT} and will be given
the same name with an additional ".stripped" suffix.  The suffix can be
overridden using KERNEL_STRIP_SUFFIX.

Since the toolchain does not give indication when the specified sections
are absent, we read the sections first and make this report by issuing a
warning to the developer.

The toolchain by default strips the image with the -s option (even
when -s is not specified):
-s --strip-all       Remove all symbol and relocation information

For example, these sections are always removed:
.debug_aranges
.debug_info
.debug_abbrev
.debug_line
.debug_frame
.debug_str
.debug_loc
.debug_ranges
.symtab
.strtab

In addition to these, the sections listed in
KERNEL_IMAGE_STRIP_EXTRA_SECTIONS will also be removed.

Only stripping of vmlinux (elf) is supported at this time.  A warning
will be given if the image type is not vmlinux.

Stripping the image could also be done in the kernel, but that would
only work for linux-yocto based kernels, so it's not the route we
decided to go.

[YOCTO 3515]

Signed-off-by: Bruce Ashfield <bruce.ashfi...@windriver.com>
Signed-off-by: Michel Thebeau <michel.theb...@windriver.com>
---
 meta/classes/kernel.bbclass |   65 +++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 63 insertions(+), 2 deletions(-)

diff --git a/meta/classes/kernel.bbclass b/meta/classes/kernel.bbclass
index af58887..60da4e2 100644
--- a/meta/classes/kernel.bbclass
+++ b/meta/classes/kernel.bbclass
@@ -41,6 +41,10 @@ KERNEL_RELEASE ?= "${KERNEL_VERSION}"
 KERNEL_OUTPUT ?= "arch/${ARCH}/boot/${KERNEL_IMAGETYPE}"
 KERNEL_IMAGEDEST = "boot"
 
+# When we strip the output, it is here
+KERNEL_STRIPPED_SUFFIX ?= ".stripped"
+KERNEL_OUTPUT_STRIPPED ?= "${KERNEL_OUTPUT}${KERNEL_STRIPPED_SUFFIX}"
+
 #
 # configuration
 #
@@ -109,6 +113,12 @@ kernel_do_install() {
        install -d ${D}/${KERNEL_IMAGEDEST}
        install -d ${D}/boot
        install -m 0644 ${KERNEL_OUTPUT} 
${D}/${KERNEL_IMAGEDEST}/${KERNEL_IMAGETYPE}-${KERNEL_VERSION}
+
+       if [ -n "${KERNEL_IMAGE_STRIP_EXTRA_SECTIONS}" ]; then
+               install -m 0644 ${KERNEL_OUTPUT_STRIPPED} \
+                       
${D}/${KERNEL_IMAGEDEST}/${KERNEL_IMAGETYPE}-${KERNEL_VERSION}${KERNEL_STRIPPED_SUFFIX}
+       fi;
+
        install -m 0644 System.map ${D}/boot/System.map-${KERNEL_VERSION}
        install -m 0644 .config ${D}/boot/config-${KERNEL_VERSION}
        install -m 0644 vmlinux ${D}/boot/vmlinux-${KERNEL_VERSION}
@@ -153,6 +163,12 @@ kernel_do_install() {
                cd "$pwd"
        fi
        install -m 0644 ${KERNEL_OUTPUT} $kerneldir/${KERNEL_IMAGETYPE}
+
+       if [ -n "${KERNEL_IMAGE_STRIP_EXTRA_SECTIONS}" ]; then
+               install -m 0644 ${KERNEL_OUTPUT_STRIPPED} \
+                       $kerneldir/${KERNEL_IMAGETYPE}${KERNEL_STRIPPED_SUFFIX}
+       fi
+
        install -m 0644 System.map $kerneldir/System.map-${KERNEL_VERSION}
 
        #
@@ -289,12 +305,46 @@ python split_kernel_packages () {
     do_split_packages(d, root='/lib/firmware', file_regex='^(.*)\.cis$', 
output_pattern='kernel-firmware-%s', description='Firmware for %s', 
recursive=True, extra_depends='')
 }
 
+do_strip() {
+       if [ -n "${KERNEL_IMAGE_STRIP_EXTRA_SECTIONS}" ]; then
+               if [[ "${KERNEL_IMAGETYPE}" != "vmlinux" ]]; then
+                       bbwarn "image type will not be stripped (not 
supported): ${KERNEL_IMAGETYPE}"
+                       return
+               fi
+
+               cd ${B}
+               cp ${KERNEL_OUTPUT} ${KERNEL_OUTPUT_STRIPPED}
+
+               headers=`"$CROSS_COMPILE"readelf -S ${KERNEL_OUTPUT_STRIPPED} | 
\
+                         grep "^ \{1,\}\[[0-9 ]\{1,\}\] [^ ]" | \
+                         sed "s/^ \{1,\}\[[0-9 ]\{1,\}\] //" | \
+                         gawk '{print $1}'`
+
+               for str in ${KERNEL_IMAGE_STRIP_EXTRA_SECTIONS}; do {
+                       if [[ "$headers" != *"$str"* ]]; then
+                               bbwarn "Section not found: $str";
+                       fi
+
+                       "$CROSS_COMPILE"strip -s -R $str 
${KERNEL_OUTPUT_STRIPPED}
+               }; done
+       fi;
+}
+do_strip[dirs] = "${B}"
+
+addtask do_strip before do_sizecheck after do_kernel_link_vmlinux
+
 # Support checking the kernel size since some kernels need to reside in 
partitions
 # with a fixed length or there is a limit in transferring the kernel to memory
 do_sizecheck() {
+       if [ -n "${KERNEL_IMAGE_STRIP_EXTRA_SECTIONS}" ]; then
+               koutf=${KERNEL_OUTPUT_STRIPPED}
+       else
+               koutf=${KERNEL_OUTPUT}
+       fi
+
        if [ ! -z "${KERNEL_IMAGE_MAXSIZE}" ]; then
                cd ${B}
-               size=`ls -lL ${KERNEL_OUTPUT} | awk '{ print $5}'`
+               size=`ls -lL $koutf | awk '{ print $5}'`
                if [ $size -ge ${KERNEL_IMAGE_MAXSIZE} ]; then
                        die "This kernel (size=$size > ${KERNEL_IMAGE_MAXSIZE}) 
is too big for your device. Please reduce the size of the kernel by making more 
of it modular."
                fi
@@ -302,7 +352,7 @@ do_sizecheck() {
 }
 do_sizecheck[dirs] = "${B}"
 
-addtask sizecheck before do_install after do_kernel_link_vmlinux
+addtask sizecheck before do_install after do_strip
 
 KERNEL_IMAGE_BASE_NAME ?= 
"${KERNEL_IMAGETYPE}-${PE}-${PV}-${PR}-${MACHINE}-${DATETIME}"
 # Don't include the DATETIME variable in the sstate package signatures
@@ -342,6 +392,10 @@ addtask uboot_mkimage before do_install after do_compile
 
 kernel_do_deploy() {
        install -m 0644 ${KERNEL_OUTPUT} 
${DEPLOYDIR}/${KERNEL_IMAGE_BASE_NAME}.bin
+       if [ -n "${KERNEL_IMAGE_STRIP_EXTRA_SECTIONS}" ]; then
+               install -m 0644 ${KERNEL_OUTPUT_STRIPPED} \
+                       
${DEPLOYDIR}/${KERNEL_IMAGE_BASE_NAME}${KERNEL_STRIPPED_SUFFIX}.bin
+       fi
        if [ ${MODULE_TARBALL_DEPLOY} = "1" ] && (grep -q -i -e 
'^CONFIG_MODULES=y$' .config); then
                tar -cvzf ${DEPLOYDIR}/${MODULE_TARBALL_BASE_NAME} -C ${D} lib
                ln -sf ${MODULE_TARBALL_BASE_NAME}.bin 
${MODULE_TARBALL_SYMLINK_NAME}
@@ -352,6 +406,13 @@ kernel_do_deploy() {
        ln -sf ${KERNEL_IMAGE_BASE_NAME}.bin ${KERNEL_IMAGE_SYMLINK_NAME}.bin
        ln -sf ${KERNEL_IMAGE_BASE_NAME}.bin ${KERNEL_IMAGETYPE}
 
+       if [ -n "${KERNEL_IMAGE_STRIP_EXTRA_SECTIONS}" ]; then
+               ln -sf ${KERNEL_IMAGE_BASE_NAME}${KERNEL_STRIPPED_SUFFIX}.bin \
+                       
${KERNEL_IMAGE_SYMLINK_NAME}${KERNEL_STRIPPED_SUFFIX}.bin
+               ln -sf ${KERNEL_IMAGE_BASE_NAME}${KERNEL_STRIPPED_SUFFIX}.bin \
+                       ${KERNEL_IMAGETYPE}${KERNEL_STRIPPED_SUFFIX}
+       fi
+
        cp ${COREBASE}/meta/files/deploydir_readme.txt 
${DEPLOYDIR}/README_-_DO_NOT_DELETE_FILES_IN_THIS_DIRECTORY.txt
        cd -
 }
-- 
1.7.9.7


_______________________________________________
Openembedded-core mailing list
Openembedded-core@lists.openembedded.org
http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-core

Reply via email to