12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- #!/bin/bash
- set -e
- [ -z "$3" ] && echo "usage: \"$0\" <file> <source-prefix> <destination-dir>" && echo "This utility relocates binary <file> from <source-prefix> to <destonation-dir> together with all dependencies and adds rpath support." && exit 1
- PREFIX="$2"
- PREFIXLEN=${#PREFIX}
- DEST="$3"
- process_lib() {
- FILESRC=$1
- if [[ "${FILESRC}" == ${PREFIX}* ]]; then
- #FILEDEST_SHORT=`echo "${FILESRC}" | cut -c1-$PREFIXLEN`
- local FILEDEST_SHORT="${FILESRC:$PREFIXLEN}"
- local FILEDEST="${DEST}/${FILEDEST_SHORT}"
-
- if [ ! -f "${FILEDEST}" ]; then
-
-
- if [ ! -d `dirname "${FILEDEST}"` ]; then
- mkdir -p `dirname "${FILEDEST}"`
- fi
- cp "${FILESRC}" "${FILEDEST}"
- chmod a+rw "$FILEDEST"
- install_name_tool -add_rpath ./ "$FILEDEST" > /dev/null 2>&1 || true
-
-
- echo "Relinking ${FILEDEST_SHORT} ..."
- local FIRST=true
- local LINE=
- local LINE2=
- otool -L "${FILEDEST}" | while read -r LINE; do
- if $FIRST; then
- FIRST=false
- else
- LINE=`echo "$LINE" | sed -e 's/^[ \t]*//' | sed -e 's/ \(.*\)$//'`
-
- # make sure file isn't referencing itself
- #A=$(basename "$FILEDEST")
- #B=$(basename "$LINE")
- if [ ! "$LINE" == "$FILESRC" ] && [[ "$LINE" == $PREFIX* ]]; then
- #LINE2=`echo "${LINE}" | cut -c1-$PREFIXLEN`
- LINE2="${LINE:$PREFIXLEN}"
- install_name_tool -change "$LINE" "@rpath/$LINE2" "$FILEDEST"
- process_lib "$LINE"
- fi
-
- fi
- done
- #echo "... finished ${FILEDEST_SHORT}"
- fi
- fi
- }
- echo "Gathering deps for: $1"
- #scan "$BASE_FILE"
- #scan "$BASE_FILE" subscan
- process_lib "$1"
- echo "Success."
- echo ""
|