From dbcb9aa93028db869f46fe1ce3639840a4e8f07b Mon Sep 17 00:00:00 2001 From: Louie S Date: Wed, 8 May 2024 17:58:28 -0400 Subject: Script to help find dlls --- nsis/find_dlls.sh | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++ nsis/find_dlls_wip.sh | 50 ------------------------------- 2 files changed, 82 insertions(+), 50 deletions(-) create mode 100755 nsis/find_dlls.sh delete mode 100755 nsis/find_dlls_wip.sh diff --git a/nsis/find_dlls.sh b/nsis/find_dlls.sh new file mode 100755 index 0000000..6e02688 --- /dev/null +++ b/nsis/find_dlls.sh @@ -0,0 +1,82 @@ +#!/usr/bin/env sh + +############################################################################### +# Script to determine dll dependencies of a Windows executable file. # +# This should help automate the process of locating dlls to include as part # +# of an installer. # +# # +# This script is licensed under the GPLv3+ # +# Written by Louie Shprung # +############################################################################### + +help() { + echo "Usage: $0 [OPTION]... BINARY..." + echo "Determine dlls required by BINARY (an .exe or .dll file)" + echo + echo "Options:" + echo " -h display this help message and exit" + echo " -q hide warnings" + echo " -s PATH set a path to search for dlls on. Default is \$PATH" +} + +get_dll_path() { + ( + IFS=':' + for path in $SEARCHPATH; do + if [ -e "$path/$1" ]; then + echo "$path/$1" + return 0 + fi + done + echo "Warning: Could not locate '$1' on system" + return 1 + ) +} + +print_dlls() { + while [ -n "$1" ]; do + DLL_NAMES=$(objdump -x "$1" | grep "DLL Name: " | sed 's/^[^D]*DLL Name: //') + for file in $DLL_NAMES; do + if DLL_PATH="$(get_dll_path "$file")"; then + echo "$DLL_PATH" + print_dlls "$DLL_PATH" + elif [ "$WARNINGS" -eq 1 ]; then + echo "$DLL_PATH" + fi + done + shift + done +} + +SEARCHPATH="$PATH" +WARNINGS=1 + +# Check args +while getopts "hqs:" flag; do + case "$flag" in + h) + help + exit + ;; + q) + WARNINGS=0 + ;; + s) + SEARCHPATH="${OPTARG}" + ;; + *) + break + esac +done +shift $((OPTIND-1)) + +if [ -z "$1" ]; then + help + exit 1 +fi + +if [ ! -e "$1" ]; then + >&2 echo "Error: '$1' does not exist - skipping" +fi + +print_dlls "$@" diff --git a/nsis/find_dlls_wip.sh b/nsis/find_dlls_wip.sh deleted file mode 100755 index dd6e927..0000000 --- a/nsis/find_dlls_wip.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env sh - -# Proof-of-concept to have a script determine dlls that need to be shipped with the installer - -help() { - echo "Usage: [OPTION]... $0 BINARY..." - echo "Determine dlls required by BINARY (an .exe or .dll file)" - echo - echo "Options:" - echo " -h display this help message and exit" - echo " -s PATH set a path to search for dlls on. Default is \$PATH" -} - -print_dlls() { - while [ -e "$1" ]; do - objdump -x "$1" | grep "DLL Name: " | sed 's/^[^D]*DLL Name: //' - shift - done -} - -SEARCHPATH="$PATH" -echo "$SEARCHPATH" - -# Check args -while getopts "hs:" flag; do - case "$flag" in - h) - help - exit - ;; - s) - SEARCHPATH="${OPTARG}" - ;; - *) - break - esac -done - -if [ -z "$1" ]; then - help - exit 1 -fi - -if [ ! -e "$1" ]; then - >&2 echo "Error: '$1' does not exist" > STDERR - exit 1 -fi - -print_dlls "$@" - -- cgit