Skip to content

Instantly share code, notes, and snippets.

@ndrewh
Created March 16, 2024 20:24
Show Gist options
  • Save ndrewh/93e651689514c48c434410cf1db269ac to your computer and use it in GitHub Desktop.
Save ndrewh/93e651689514c48c434410cf1db269ac to your computer and use it in GitHub Desktop.
copy_deps.sh
#!/bin/bash
#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
# Copy Shared Library Dependencies Original by [Thomas Lange <code@nerdmind.de>] #
# Modified by [Andrew Haberlandt <andrew.haberlandt@gmail.com>] #
#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
# #
# This script copies all shared library dependencies from a binary source file #
# to a desired target directory. The directory structure of the libraries will #
# be mapped relative to the target directory. The binary file itself will also #
# be copied to the target directory. #
# #
# OPTION [-b]: Full path to the binary whose dependencies shall be copied. #
# OPTION [-t]: Full path to the target directory for the dependencies. #
# #
#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
#===============================================================================
# Parsing command-line arguments with the getopts shell builtin
#===============================================================================
while getopts :b:t: option
do
case $option in
b) ARGUMENT_BINARY="$OPTARG" ;;
t) ARGUMENT_TARGET="$OPTARG" ;;
esac
done
#===============================================================================
# Checking if all required command-line arguments are provided
#===============================================================================
[ -z "${ARGUMENT_BINARY}" ] && echo "$0: Missing argument: [-b binary]" >&2
[ -z "${ARGUMENT_TARGET}" ] && echo "$0: Missing argument: [-t target]" >&2
#===============================================================================
# Abort execution if required command-line argument is missing
#===============================================================================
[ -z "${ARGUMENT_BINARY}" ] || [ -z "${ARGUMENT_TARGET}" ] && exit 1
#===============================================================================
# Checking if binary or target path does not exists and abort
#===============================================================================
[ ! -f "${ARGUMENT_BINARY}" ] && echo "$0: Binary path does not exists." >&2 && exit 1
[ ! -d "${ARGUMENT_TARGET}" ] && echo "$0: Target path does not exists." >&2 && exit 1
#===============================================================================
# Copy binary file with its parent directories to the target directory
#===============================================================================
cp --verbose --parents "${ARGUMENT_BINARY}" "${ARGUMENT_TARGET}"
#===============================================================================
# Copy each library with its parent directories to the target directory
#===============================================================================
for library in $(ldd "${ARGUMENT_BINARY}" | cut -d '>' -f 2 | awk '{print $1}')
do
[ -f "${library}" ] && cp --verbose "${library}" "${ARGUMENT_TARGET}"
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment