114 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env bash
 | |
| 
 | |
| #WARNING: Any spaces within the path will cause trouble!
 | |
| 
 | |
| #ldd -d
 | |
| if [[ ! -f "$1" ]]; then
 | |
|     echo "Missing target file ($1)"
 | |
|     exit 1
 | |
| fi
 | |
| 
 | |
| # This is a multidimensional array
 | |
| # key /* library file */ => (library name; library file; dependencies ())
 | |
| declare -A collected_libraries
 | |
| 
 | |
| # This is a one dimensional array
 | |
| # key /* library file */ => use count
 | |
| declare -A collected_libraries_use_count
 | |
| 
 | |
| declare -A libraries_of_result
 | |
| function libraries_of {
 | |
|     local buffer
 | |
|     local index
 | |
|     local data
 | |
| 
 | |
|     buffer=$(ldd -d "$1")
 | |
|     index=0
 | |
| 
 | |
|     libraries_of_result=()
 | |
| 
 | |
|     IFS=$'\n'
 | |
|     for line in ${buffer}; do
 | |
|         index=$(($index + 1))
 | |
|         [[ ${index} == 1 ]] && continue
 | |
|         IFS=$' ' data=(${line})
 | |
| 
 | |
|         # We trim the leading and tailing white spaces
 | |
|         _key=$(echo "${data[0]}" | sed -e 's/^[[:space:]]*//')
 | |
|         _value=$(echo "${data[2]}" | sed -e 's/^[[:space:]]*//')
 | |
|         libraries_of_result["${_key}"]="${_value}"
 | |
|     done
 | |
| 
 | |
|     [[ $? -ne 0 ]] && return 1
 | |
|     return 0
 | |
| }
 | |
| 
 | |
| function print_lookup_stack {
 | |
|     index_max=${#@}
 | |
|     index_args="$@"
 | |
| 
 | |
|     #echo -n -e "\r\033[K"
 | |
|     echo ""
 | |
|     for (( index = 0; index < $index_max; ++index )); do
 | |
|         arg=$(eval echo \$$((${index} + 1)))
 | |
|         echo -n $(basename ${arg})
 | |
|         [[ $(($index + 1)) -lt ${index_max} ]] && echo -n " => "
 | |
|     done
 | |
|     #sleep 1
 | |
| }
 | |
| 
 | |
| declare -a libraries_of_deep_stack
 | |
| function libraries_of_deep {
 | |
|     local IFS
 | |
|     local valid_libraries
 | |
|     local inner_array
 | |
|     local result_array
 | |
| 
 | |
|     libraries_of $1
 | |
| 
 | |
|     valid_libraries=()
 | |
|     #echo "Gathered libraries for $1:"
 | |
|     for library_name in "${!libraries_of_result[@]}"; do
 | |
|         [[ -z "${libraries_of_result[$library_name]}" ]] && {
 | |
|             #echo "  The dependency $library_name for $1 could not be resolved"
 | |
|             continue
 | |
|         }
 | |
| 
 | |
|         #echo "  $library_name at ${libraries_of_result[$library_name]}";
 | |
|         valid_libraries+=("${libraries_of_result[$library_name]}")
 | |
|     done
 | |
| 
 | |
|     IFS=$';' inner_array="${valid_libraries[*]}"
 | |
|     IFS=$' ' result_array=("$(basename $1)" "$1" "$inner_array")
 | |
|     collected_libraries[$1]="${result_array[@]}"
 | |
| 
 | |
|     libraries_of_deep_stack+=($1)
 | |
|     print_lookup_stack ${libraries_of_deep_stack[@]}
 | |
| 
 | |
|     for library_path in "${valid_libraries[@]}"; do
 | |
|         # echo "Looking up library path $library_path"
 | |
|         [[ ! -z "${collected_libraries[$library_path]}" ]] && {
 | |
|             #echo "Library $library_path already resolved"
 | |
|             collected_libraries_use_count[$library_path]=$((${collected_libraries_use_count[$library_path]} + 1))
 | |
|             continue
 | |
|         }
 | |
|         #echo "Resolving libraries for path $library_path"
 | |
|         collected_libraries_use_count[$library_path]=1
 | |
|         libraries_of_deep ${library_path}
 | |
|         #library_name
 | |
|     done
 | |
|     unset 'libraries_of_deep_stack[${#libraries_of_deep_stack[@]}-1]';
 | |
| }
 | |
| 
 | |
| libraries_of_deep $1
 | |
| echo -e -n "\r\033[K" #Clear the stack
 | |
| 
 | |
| for key in "${!collected_libraries[@]}"; do
 | |
|     IFS=$' ' library_data=(${collected_libraries[$key]})
 | |
|     IFS=$';' libraries=(${library_data[2]})
 | |
| 
 | |
|     echo "Got library ${library_data[0]} (${library_data[1]}) directly used ${collected_libraries_use_count[$key]} times:"
 | |
|     for library in "${libraries[@]}"; do
 | |
|         echo "  $library"
 | |
|     done
 | |
| done |