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> --- Note, this is an issue whether or not makepkg gets support for building using with LTO as buildsystems may already enable it. scripts/libmakepkg/tidy/strip.sh.in | 13 +++++++++++++ 1 file changed, 13 insertions(+) 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 } -- 2.30.0