8.77. Stripping

#### Linux From Scratch - Version 11.0-rc1

### Chapter 8. Installing Basic System Software

- Prev

  About Debugging Symbols

- Next

  Cleaning Up

- Up
- Home

# 8.77. Stripping

This section is optional. If the intended user is not a programmer and does not plan to do any debugging on the system software, the system size can be decreased by about 2 GB by removing the debugging symbols from binaries and libraries. This causes no inconvenience other than not being able to debug the software fully anymore.

Most people who use the commands mentioned below do not experience any difficulties. However, it is easy to make a typo and render the new system unusable, so before running the strip commands, it is a good idea to make a backup of the LFS system in its current state.

The debugging symbols for selected libraries are placed in separate files. This debugging information is needed if running regression tests that use valgrind or gdb later in BLFS.

Note that strip will overwrite the binary or library file it is processing. This can crash the processes using code or data from the file. If the process running strip itself is affected, the binary or library being stripped can be destroyed and can make the system completely unusable. To avoid it, we'll copy some libraries and binaries into `/tmp`, strip them there, and install them back with the install command. Read the related entry in Section 8.2.1, “Upgrade Issues” for the rationale to use the install command here.

### Note

The ELF loader's name is ld-linux-x86-64.so.2 on 64-bit systems and ld-linux.so.2 on 32-bit systems. The contruct below selects the correct name for the current architecture.

    save_usrlib="$(cd /usr/lib; ls ld-linux*)
                 libc.so.6
                 libthread_db.so.1
                 libquadmath.so.0.0.0
                 libstdc++.so.6.0.29
                 libitm.so.1.0.0
                 libatomic.so.1.2.0"

    cd /usr/lib

    for LIB in $save_usrlib; do
        objcopy --only-keep-debug $LIB $LIB.dbg
        cp $LIB /tmp/$LIB
        strip --strip-unneeded /tmp/$LIB
        objcopy --add-gnu-debuglink=$LIB.dbg /tmp/$LIB
        install -vm755 /tmp/$LIB /usr/lib
        rm /tmp/$LIB
    done

    online_usrbin="bash find strip"
    online_usrlib="libbfd-2.37.so
                   libhistory.so.8.1
                   libncursesw.so.6.2
                   libm.so.6
                   libreadline.so.8.1
                   libz.so.1.2.11
                   $(cd /usr/lib; find libnss*.so* -type f)"

    for BIN in $online_usrbin; do
        cp /usr/bin/$BIN /tmp/$BIN
        strip --strip-unneeded /tmp/$BIN
        install -vm755 /tmp/$BIN /usr/bin
        rm /tmp/$BIN
    done

    for LIB in $online_usrlib; do
        cp /usr/lib/$LIB /tmp/$LIB
        strip --strip-unneeded /tmp/$LIB
        install -vm755 /tmp/$LIB /usr/lib
        rm /tmp/$LIB
    done

    for i in $(find /usr/lib -type f -name \*.so* ! -name \*dbg) \
             $(find /usr/lib -type f -name \*.a)                 \
             $(find /usr/{bin,sbin,libexec} -type f); do
        case "$online_usrbin $online_usrlib $save_usrlib" in
            *$(basename $i)* )
                ;;
            * ) strip --strip-unneeded $i
                ;;
        esac
    done

    unset BIN LIB save_usrlib online_usrbin online_usrlib

A large number of files will be reported as having their file format not recognized. These warnings can be safely ignored. They indicate that those files are scripts instead of binaries.

- Prev

  About Debugging Symbols

- Next

  Cleaning Up

- Up
- Home