Strip ELF binaries to reduce size of initrd 58/242258/3 accepted/tizen/unified/20201028.123943 submit/tizen/20201027.004448
authorSlava Barinov <v.barinov@samsung.com>
Tue, 6 Oct 2020 04:34:47 +0000 (13:34 +0900)
committerSeung-Woo Kim <sw0312.kim@samsung.com>
Tue, 6 Oct 2020 04:35:09 +0000 (13:35 +0900)
If depending to libpthread, eh_frame is used and for low-level
library like libgcc_s, eh_frame is required.
Strip eh_frame_hdr and eh_frame from ELF binaries to reduce size
of initrd except above cases.

Change-Id: I61f6dad841bbacb594ac953ecb154f1354c26963
Signed-off-by: Slava Barinov <v.barinov@samsung.com>
packaging/initrd-recovery.spec
src/initrd-recovery/mkinitrd-recovery.sh.in

index 3ddc7096cb10de648627cd54b9ca42ed6bae9f81..ec8f1b0b91ac95ee5b377a73dd3ceb2ec4ac3f04 100644 (file)
@@ -57,6 +57,14 @@ mkdir -p %{buildroot}%{_unitdir}/local-fs.target.wants
 install -m 644 units/mnt-inform.mount %{buildroot}%{_unitdir}
 ln -s ../mnt-inform.mount %{buildroot}%{_unitdir}/local-fs.target.wants
 
+# Pack libbfd for strip
+LIBBFD=$(ldd /usr/bin/strip | sed -ne '/libbfd/s/^[[:space:]]\(libbfd[^[:space:]]\+\).*$/\1/p')
+install -m 0755 -D %{_libdir}/${LIBBFD} %{buildroot}%{initrd_recovery_libexec_dir}/${LIBBFD}
+# Pack strip, od and readelf
+install -m 0755 -D %{_bindir}/strip %{buildroot}%{initrd_recovery_libexec_dir}/strip
+install -m 0755 -D %{_bindir}/od %{buildroot}%{initrd_recovery_libexec_dir}/od
+install -m 0755 -D %{_bindir}/readelf %{buildroot}%{initrd_recovery_libexec_dir}/readelf
+
 %posttrans
 %{initrd_recovery_libexec_dir}/mkinitrd-recovery.sh
 rm -rf %{initrd_recovery_libexec_dir}
@@ -74,6 +82,10 @@ rm -rf %{_libdir}/initrd-recovery
 %attr(0775,root,root)%{initrd_recovery_libexec_dir}/init
 %attr(0775,root,root)%{initrd_recovery_libexec_dir}/mkinitrd-recovery.sh
 %attr(0775,root,root)%{initrd_recovery_libexec_dir}/minireboot
+%attr(0775,root,root)%{initrd_recovery_libexec_dir}/strip
+%attr(0775,root,root)%{initrd_recovery_libexec_dir}/od
+%attr(0775,root,root)%{initrd_recovery_libexec_dir}/readelf
+%attr(0775,root,root)%{initrd_recovery_libexec_dir}/libbfd*
 
 %files -n reboot-param-helper
 %{_unitdir}/mnt-inform.mount
index dc2675c6569dc6f3cdda9665f87524914ede6726..1e52d0d658a101301377f08132cfa2299f5c6a68 100755 (executable)
@@ -14,6 +14,9 @@ RM="/bin/rm"
 TR="/bin/tr"
 GREP="/bin/grep"
 CUT="/bin/cut"
+STRIP="@INITRD_RECOVERY_LIBEXEC_DIR@/strip"
+OD="@INITRD_RECOVERY_LIBEXEC_DIR@/od"
+READELF="@INITRD_RECOVERY_LIBEXEC_DIR@/readelf"
 
 UNAME="/bin/uname"
 ARCH=`$UNAME -m`
@@ -131,6 +134,24 @@ do_copy() {
     mkdir_p_parent $dst
 
     "$CP" -f "$src" "$dst"
+
+    # Check first 4 bytes of file for x7fELF magic
+    type=$(echo -e `"$OD" -tx4 -N4 -An $dst`)
+    if [ x"$type" == x"464c457f" ]; then
+        # Check if libpthread is used
+        ("$READELF" -dW "$dst" | grep -e '(NEEDED).*\[libpthread.so' > /dev/null)
+        no_pthread=$?
+        # Exclude low-level libraries: libgcc, libc, librt, ld-linux, libpthread
+        basename "$dst" | grep -Eo '^(libgcc|libc\.so|librt|ld-linux|libpthread)' > /dev/null
+        not_system=$?
+
+        # Strip exception handling section if possible
+        if [ x"$no_pthread" == x"1" ] && [ x"$not_system" == x"1" ]; then
+            # Strip out the exception handling section to reduce binary
+            LD_LIBRARY_PATH="@INITRD_RECOVERY_LIBEXEC_DIR@" \
+            "$STRIP" --strip-unneeded -R .eh_frame -R .eh_frame_hdr "$dst"
+        fi
+    fi
 }
 
 #-----------------------------------------------------------------------------