set-abi-version.sh 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #!/usr/bin/env bash
  2. #
  3. # Copyright (C) 2020 OpenWrt.org
  4. #
  5. # This is free software, licensed under the GNU General Public License v2.
  6. # See /LICENSE for more information.
  7. #
  8. SELF=${0##*/}
  9. [ -n "$PATCHELF" ] || {
  10. echo "$SELF: patchelf command not defined (PATCHELF variable not set)"
  11. exit 1
  12. }
  13. ABI_VER="$1"
  14. PATCH_DIR="$2"
  15. REF_LIST="$3"
  16. [ -n "$ABI_VER" -a -n "$PATCH_DIR" ] || {
  17. echo "$SELF: no ABI version or files/directories specified"
  18. echo "usage: $SELF <VERSION> [<PATH>...]"
  19. exit 1
  20. }
  21. cmd() {
  22. echo "$@" >&2
  23. "$@" || exit 1
  24. }
  25. gen_lib_list() {
  26. while read F; do
  27. F="${F##*/}"
  28. case "$F" in
  29. lib*.so*);;
  30. *) continue;;
  31. esac
  32. echo -n "$F:"
  33. done < "$REF_LIST"
  34. }
  35. find "$PATCH_DIR" -type f -a -name 'lib*.so*' | \
  36. (
  37. while read F; do
  38. NEW_F="${F%%.so*}.so.$ABI_VER"
  39. NEW_NAME="${NEW_F##*/}"
  40. [ "$NEW_F" != "$F" ] || continue
  41. cmd mv "$F" "$NEW_F"
  42. [ "$REF_LIST" ] || cmd ln -s "$NEW_NAME" "$F"
  43. cmd $PATCHELF --set-soname "$NEW_NAME" "$NEW_F"
  44. done
  45. )
  46. [ -n "$REF_LIST" ] || exit 0
  47. LIBS="$(gen_lib_list)"
  48. LIBS="${LIBS%%:}"
  49. find "$PATCH_DIR" -type f -a -exec file {} \; | \
  50. sed -n -e 's/^\(.*\):.*ELF.*\(executable\|relocatable\|shared object\).*,.*/\1:\2/p' | \
  51. (
  52. IFS=":"
  53. while read F S; do
  54. $PATCHELF --print-needed "$F" | while read L; do
  55. BASE_L="${L%%.so*}"
  56. for lib in $LIBS; do
  57. base_lib="${lib%%.so*}"
  58. [ "$BASE_L" = "$base_lib" ] || continue
  59. [ "$l" = "$lib" ] && continue
  60. cmd $PATCHELF --replace-needed "$L" "$lib" "$F"
  61. done
  62. done
  63. done
  64. true
  65. )