Strip LTO symbols from distributed .a/.o files

GCC's LTO implementation emits bytecodes into .o files it generates.
These bytecodes are _not_ considered stable from one release of GCC
to the next. There we need to strip the LTO bytecode out of any .o
(and .a) file that gets installed into the package.

Signed-off-by: Allan McRae <allan@archlinux.org>
This commit is contained in:
Allan McRae 2021-03-02 10:53:06 +10:00
parent 4a0891f49d
commit c118a61f62

View file

@ -103,6 +103,16 @@ strip_file() {
rm -f "$tempfile" rm -f "$tempfile"
} }
strip_lto() {
local binary=$1;
local tempfile=$(mktemp "$binary.XXXXXX")
if strip -R .gnu.lto_* -R .gnu.debuglto_* -N __gnu_lto_v1 "$binary" -o "$tempfile"; then
cat "$tempfile" > "$binary"
fi
rm -f "$tempfile"
}
tidy_strip() { tidy_strip() {
if check_option "strip" "y"; then if check_option "strip" "y"; then
@ -121,6 +131,7 @@ tidy_strip() {
local binary strip_flags local binary strip_flags
find . -type f -perm -u+w -print0 2>/dev/null | while IFS= read -rd '' binary ; do find . -type f -perm -u+w -print0 2>/dev/null | while IFS= read -rd '' binary ; do
local STRIPLTO=0
case "$(LC_ALL=C readelf -h "$binary" 2>/dev/null)" in case "$(LC_ALL=C readelf -h "$binary" 2>/dev/null)" in
*Type:*'DYN (Shared object file)'*) # Libraries (.so) or Relocatable binaries *Type:*'DYN (Shared object file)'*) # Libraries (.so) or Relocatable binaries
strip_flags="$STRIP_SHARED";; strip_flags="$STRIP_SHARED";;
@ -129,6 +140,7 @@ tidy_strip() {
*Type:*'REL (Relocatable file)'*) # Libraries (.a) or objects *Type:*'REL (Relocatable file)'*) # Libraries (.a) or objects
if ar t "$binary" &>/dev/null; then # Libraries (.a) if ar t "$binary" &>/dev/null; then # Libraries (.a)
strip_flags="$STRIP_STATIC" strip_flags="$STRIP_STATIC"
STRIPLTO=1
elif [[ $binary = *'.ko' ]]; then # Kernel module elif [[ $binary = *'.ko' ]]; then # Kernel module
strip_flags="$STRIP_SHARED" strip_flags="$STRIP_SHARED"
else else
@ -139,6 +151,7 @@ tidy_strip() {
continue ;; continue ;;
esac esac
strip_file "$binary" ${strip_flags} strip_file "$binary" ${strip_flags}
(( STRIPLTO )) && strip_lto "$binary"
done done
fi fi
} }