scripts: bundle-libraries: prevent loading host locales (FS#1803)
Binary patch the bundled glibc library to inhibit loading of host locale archives in order to avoid triggering internal libc assertions when invoking shipped, bundled executables. The problem has been solved with upstream Glibc commit 0062ace229 ("Gracefully handle incompatible locale data") but we still need to deal with older Glibc binaries for some time to come. Fixes FS#1803 Signed-off-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
parent
6caa8e09aa
commit
9030a78a71
1 changed files with 21 additions and 5 deletions
|
@ -113,6 +113,18 @@ _patch_ldso() {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_patch_glibc() {
|
||||||
|
_cp "$1" "$1.patched"
|
||||||
|
sed -i -e 's,/usr/\(\(lib\|share\)/locale\),/###/\1,g' "$1.patched"
|
||||||
|
|
||||||
|
if "$1.patched" 2>&1 | grep -q -- GNU; then
|
||||||
|
_mv "$1.patched" "$1"
|
||||||
|
else
|
||||||
|
echo "binary patched ${1##*/} not executable, using original" >&2
|
||||||
|
rm -f "$1.patched"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
for LDD in ${PATH//://ldd }/ldd; do
|
for LDD in ${PATH//://ldd }/ldd; do
|
||||||
"$LDD" --version >/dev/null 2>/dev/null && break
|
"$LDD" --version >/dev/null 2>/dev/null && break
|
||||||
LDD=""
|
LDD=""
|
||||||
|
@ -141,17 +153,21 @@ for BIN in "$@"; do
|
||||||
[ -n "$LDD" ] && [ -x "$BIN" ] && file "$BIN" | grep -sqE "ELF.*(executable|interpreter)" && {
|
[ -n "$LDD" ] && [ -x "$BIN" ] && file "$BIN" | grep -sqE "ELF.*(executable|interpreter)" && {
|
||||||
for token in $("$LDD" "$BIN" 2>/dev/null); do
|
for token in $("$LDD" "$BIN" 2>/dev/null); do
|
||||||
case "$token" in */*.so*)
|
case "$token" in */*.so*)
|
||||||
case "$token" in
|
|
||||||
*ld-*.so*) LDSO="${token##*/}" ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
dest="$DIR/lib/${token##*/}"
|
dest="$DIR/lib/${token##*/}"
|
||||||
ddir="${dest%/*}"
|
ddir="${dest%/*}"
|
||||||
|
|
||||||
[ -f "$token" -a ! -f "$dest" ] && {
|
[ -f "$token" -a ! -f "$dest" ] && {
|
||||||
_md "$ddir"
|
_md "$ddir"
|
||||||
_cp "$token" "$dest"
|
_cp "$token" "$dest"
|
||||||
[ -n "$LDSO" ] && _patch_ldso "$dest"
|
case "$token" in
|
||||||
|
*ld-*.so*)
|
||||||
|
LDSO="${token##*/}"
|
||||||
|
_patch_ldso "$dest"
|
||||||
|
;;
|
||||||
|
libc.so.6|*/libc.so.6)
|
||||||
|
_patch_glibc "$dest"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
}
|
}
|
||||||
;; esac
|
;; esac
|
||||||
done
|
done
|
||||||
|
|
Loading…
Reference in a new issue