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 <[email protected]>
---

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

Reply via email to