diff options
author | Allan McRae <allan@archlinux.org> | 2021-03-02 01:53:06 +0100 |
---|---|---|
committer | Allan McRae <allan@archlinux.org> | 2021-03-03 05:35:52 +0100 |
commit | c118a61f62a4b100b01504dfc5611cd08fb9e537 (patch) | |
tree | d1592fa23f633e0d9f077460d8a9204ca1548d67 | |
parent | 4a0891f49d29458e1b93d95f8121f8096bb02727 (diff) | |
download | pacman-c118a61f62a4b100b01504dfc5611cd08fb9e537.tar.gz pacman-c118a61f62a4b100b01504dfc5611cd08fb9e537.tar.xz |
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>
-rw-r--r-- | scripts/libmakepkg/tidy/strip.sh.in | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/scripts/libmakepkg/tidy/strip.sh.in b/scripts/libmakepkg/tidy/strip.sh.in index 720b8eb3..ceb2a108 100644 --- a/scripts/libmakepkg/tidy/strip.sh.in +++ b/scripts/libmakepkg/tidy/strip.sh.in @@ -103,6 +103,16 @@ strip_file() { 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() { if check_option "strip" "y"; then @@ -121,6 +131,7 @@ tidy_strip() { local binary strip_flags 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 *Type:*'DYN (Shared object file)'*) # Libraries (.so) or Relocatable binaries strip_flags="$STRIP_SHARED";; @@ -129,6 +140,7 @@ tidy_strip() { *Type:*'REL (Relocatable file)'*) # Libraries (.a) or objects if ar t "$binary" &>/dev/null; then # Libraries (.a) strip_flags="$STRIP_STATIC" + STRIPLTO=1 elif [[ $binary = *'.ko' ]]; then # Kernel module strip_flags="$STRIP_SHARED" else @@ -139,6 +151,7 @@ tidy_strip() { continue ;; esac strip_file "$binary" ${strip_flags} + (( STRIPLTO )) && strip_lto "$binary" done fi } |