74 lines
1.5 KiB
Bash
74 lines
1.5 KiB
Bash
|
#!/usr/bin/env bash
|
||
|
#
|
||
|
# Copyright (C) 2020 OpenWrt.org
|
||
|
#
|
||
|
# This is free software, licensed under the GNU General Public License v2.
|
||
|
# See /LICENSE for more information.
|
||
|
#
|
||
|
SELF=${0##*/}
|
||
|
|
||
|
[ -n "$PATCHELF" ] || {
|
||
|
echo "$SELF: patchelf command not defined (PATCHELF variable not set)"
|
||
|
exit 1
|
||
|
}
|
||
|
|
||
|
ABI_VER="$1"
|
||
|
PATCH_DIR="$2"
|
||
|
REF_LIST="$3"
|
||
|
|
||
|
[ -n "$ABI_VER" -a -n "$PATCH_DIR" ] || {
|
||
|
echo "$SELF: no ABI version or files/directories specified"
|
||
|
echo "usage: $SELF <VERSION> [<PATH>...]"
|
||
|
exit 1
|
||
|
}
|
||
|
|
||
|
cmd() {
|
||
|
echo "$@" >&2
|
||
|
"$@" || exit 1
|
||
|
}
|
||
|
|
||
|
gen_lib_list() {
|
||
|
while read F; do
|
||
|
F="${F##*/}"
|
||
|
case "$F" in
|
||
|
lib*.so*);;
|
||
|
*) continue;;
|
||
|
esac
|
||
|
echo -n "$F:"
|
||
|
done < "$REF_LIST"
|
||
|
}
|
||
|
|
||
|
find "$PATCH_DIR" -type f -a -name 'lib*.so*' | \
|
||
|
(
|
||
|
while read F; do
|
||
|
NEW_F="${F%%.so*}.so.$ABI_VER"
|
||
|
NEW_NAME="${NEW_F##*/}"
|
||
|
[ "$NEW_F" != "$F" ] || continue
|
||
|
cmd mv "$F" "$NEW_F"
|
||
|
[ "$REF_LIST" ] || cmd ln -s "$NEW_NAME" "$F"
|
||
|
cmd $PATCHELF --set-soname "$NEW_NAME" "$NEW_F"
|
||
|
done
|
||
|
)
|
||
|
|
||
|
[ -n "$REF_LIST" ] || exit 0
|
||
|
|
||
|
LIBS="$(gen_lib_list)"
|
||
|
LIBS="${LIBS%%:}"
|
||
|
find "$PATCH_DIR" -type f -a -exec file {} \; | \
|
||
|
sed -n -e 's/^\(.*\):.*ELF.*\(executable\|relocatable\|shared object\).*,.*/\1:\2/p' | \
|
||
|
(
|
||
|
IFS=":"
|
||
|
while read F S; do
|
||
|
$PATCHELF --print-needed "$F" | while read L; do
|
||
|
BASE_L="${L%%.so*}"
|
||
|
for lib in $LIBS; do
|
||
|
base_lib="${lib%%.so*}"
|
||
|
[ "$BASE_L" = "$base_lib" ] || continue
|
||
|
[ "$l" = "$lib" ] && continue
|
||
|
cmd $PATCHELF --replace-needed "$L" "$lib" "$F"
|
||
|
done
|
||
|
done
|
||
|
done
|
||
|
true
|
||
|
)
|