#!/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 [...]" 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 )