[pacman-dev] [PATCH] Strip LTO symbols from distributed .a/.o files
Allan McRae
allan at archlinux.org
Tue Mar 2 00:56:38 UTC 2021
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 at 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
More information about the pacman-dev
mailing list