forked from rpms/glibc
fc720e6194
GCC for x86_64 includes 32-bit multilib support, requiring a 32-bit glibc to be present when GCC is built. That 32-bit glibc cannot come from an i686 RPM because of limitations in Koji, so there is a hack including a glibc32 "source" package that actually contains binaries from an i686 build (and thus needs additional manual update steps). Set up glibc.spec to build a glibc32 binary package directly when building for x86_64, so avoiding the need for the separate glibc32 source package. This improvement is tracked in <https://fedoraproject.org/wiki/Changes/glibc32_Build_Adjustments> and <https://bugzilla.redhat.com/show_bug.cgi?id=1598524>. The list of files in the glibc32 package has been compared to that in the previous package (the gnu/lib-names-32.h header is added, as its previous omission appears to be a bug). And the lists of files in the other packages built from glibc.spec have also been compared before and after this change, to make sure there aren't inappropriate changes to those lists. (cherry picked from commit e025effd84d415d98dcebbc97cdf03e6e44465b8)
157 lines
4.6 KiB
Bash
157 lines
4.6 KiB
Bash
#!/bin/bash
|
|
# Wrapper script for find-debuginfo.sh
|
|
#
|
|
# Usage:
|
|
# wrap-find-debuginfo.sh SYSROOT-PATH SCRIPT-PATH SCRIPT-ARGS...
|
|
#
|
|
# The wrapper saves the original version of ld.so found in SYSROOT-PATH,
|
|
# invokes SCRIPT-PATH with SCRIPT-ARGS, and then restores the
|
|
# LDSO-PATH file, followed by note merging and DWZ compression.
|
|
# As a result, ld.so has (mostly) unchanged debuginfo even
|
|
# after debuginfo extraction.
|
|
#
|
|
# For libc.so.6, a set of strategic symbols is preserved in .symtab
|
|
# that are frequently used in valgrind suppressions and elsewhere.
|
|
|
|
set -ex
|
|
|
|
workdir="$(mktemp -d -t find_debuginfo.XXXXXX)"
|
|
|
|
ldso_tmp="$workdir/ld.so"
|
|
libc_tmp="$workdir/libc.so"
|
|
|
|
# Prefer a separately installed debugedit over the RPM-integrated one.
|
|
if command -v debugedit >/dev/null ; then
|
|
debugedit=debugedit
|
|
else
|
|
debugedit=/usr/lib/rpm/debugedit
|
|
fi
|
|
|
|
cleanup () {
|
|
rm -rf "$workdir"
|
|
}
|
|
trap cleanup 0
|
|
|
|
sysroot_path="$1"
|
|
shift
|
|
script_path="$1"
|
|
shift
|
|
|
|
# See ldso_path setting in glibc.spec.
|
|
ldso_path=
|
|
for ldso_candidate in `find "$sysroot_path" -maxdepth 2 \
|
|
-regextype posix-extended -regex '.*/ld(-.*|64|)\.so\.[0-9]+$' -type f` ; do
|
|
if test -z "$ldso_path" ; then
|
|
ldso_path="$ldso_candidate"
|
|
elif [ -f "$sysroot_path/lib64/ld-linux-x86-64.so.2" ] && [ -f "$sysroot_path/lib/ld-linux.so.2" ]; then
|
|
# x86_64 with 32-bit libc built for glibc32 as well. Finding
|
|
# multiple dynamic linkers is expected, not a bug; ensure the
|
|
# 64-bit one is used.
|
|
ldso_path="$sysroot_path/lib64/ld-linux-x86-64.so.2"
|
|
else
|
|
echo "error: multiple ld.so candidates: $ldso_path, $ldso_candidate"
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
# libc.so.6 always uses this name, so it is simpler to locate.
|
|
libc_path=
|
|
for libc_candidate in `find "$sysroot_path" -maxdepth 2 -name libc.so.6`; do
|
|
if test -z "$libc_path" ; then
|
|
libc_path="$libc_candidate"
|
|
elif [ -f "$sysroot_path/lib64/ld-linux-x86-64.so.2" ] && [ -f "$sysroot_path/lib/ld-linux.so.2" ]; then
|
|
# x86_64 with 32-bit libc built for glibc32 as well. The test
|
|
# here uses ld.so paths, not libc paths, to ensure it doesn't
|
|
# apply on any other architecture.
|
|
libc_path="$sysroot_path/lib64/libc.so.6"
|
|
else
|
|
echo "error: multiple libc.so.6 candidates: $libc_path, $libc_candidate"
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
|
|
# Preserve the original files.
|
|
cp "$ldso_path" "$ldso_tmp"
|
|
cp "$libc_path" "$libc_tmp"
|
|
|
|
# Run the debuginfo extraction.
|
|
"$script_path" "$@"
|
|
|
|
# libc.so.6: Extract the .gnu_debuglink section
|
|
objcopy -j.gnu_debuglink --set-section-flags .gnu_debuglink=alloc \
|
|
-O binary "$libc_path" "$libc_tmp.debuglink"
|
|
|
|
# Restore the original files.
|
|
cp "$ldso_tmp" "$ldso_path"
|
|
cp "$libc_tmp" "$libc_path"
|
|
|
|
# Reduce the size of notes. Primarily for annobin.
|
|
objcopy --merge-notes "$ldso_path"
|
|
objcopy --merge-notes "$libc_path"
|
|
|
|
# libc.so.6: Restore the .gnu_debuglink section
|
|
objcopy --add-section .gnu_debuglink="$libc_tmp.debuglink" "$libc_path"
|
|
|
|
# ld.so does not have separated debuginfo and so the debuginfo file
|
|
# generated by find-debuginfo is redundant. Therefore, remove it.
|
|
ldso_debug=
|
|
for ldso_debug_candidate in `find "$sysroot_path" -maxdepth 2 \
|
|
-regextype posix-extended \
|
|
-regex '.*/ld(-.*|64|)\.so\.[0-9]+.*debug$' -type f` ; do
|
|
if test -z "$ldso_debug" ; then
|
|
ldso_debug="$ldso_debug_candidate"
|
|
else
|
|
echo "error: multiple ld.so debug candidates: $ldso_debug, $ldso_debug_candidate"
|
|
exit 1
|
|
fi
|
|
done
|
|
rm -f "$ldso_debug"
|
|
|
|
# libc.so.6: Reduce to valuable symbols. Eliminate file symbols,
|
|
# annobin symbols, and symbols used by the glibc build to implement
|
|
# hidden aliases (__EI_*). We would also like to remove __GI_*
|
|
# symbols, but even listing them explicitly (as in -K __GI_strlen)
|
|
# still causes strip to remove them, so there is no filtering of
|
|
# __GI_* here. (Debuginfo is gone after this, so no need to optimize
|
|
# it.)
|
|
strip -w \
|
|
-K '*' \
|
|
-K '!*.c' \
|
|
-K '!*.os' \
|
|
-K '!.annobin_*' \
|
|
-K '!__EI_*' \
|
|
-K '!__PRETTY_FUNCTION__*' \
|
|
"$libc_path"
|
|
|
|
# ld.so: Rewrite the source file paths to match the extracted
|
|
# locations. First compute the arguments for invoking debugedit.
|
|
# See find-debuginfo.sh.
|
|
debug_dest_name="/usr/src/debug"
|
|
last_arg=
|
|
while true ; do
|
|
arg="$1"
|
|
shift || break
|
|
case "$arg" in
|
|
(--unique-debug-src-base)
|
|
debug_dest_name="/usr/src/debug/$1"
|
|
shift
|
|
;;
|
|
(-*)
|
|
;;
|
|
(*)
|
|
last_arg="$arg"
|
|
;;
|
|
esac
|
|
done
|
|
debug_base_name=${last_arg:-$RPM_BUILD_ROOT}
|
|
$debugedit -b "$debug_base_name" -d "$debug_dest_name" -n $ldso_path
|
|
# Remove the .annobin* symbols (and only them).
|
|
if nm --format=just-symbols "$ldso_path" \
|
|
| grep '^\.annobin' > "$ldso_tmp.annobin-symbols"; then
|
|
objcopy --strip-symbols="$ldso_tmp.annobin-symbols" "$ldso_path"
|
|
fi
|
|
|
|
# Apply single-file DWARF optimization.
|
|
dwz $ldso_path
|