6 while getopts "U" flag; do
8 U) CHECK_UNRESOLVED=0 ;;
13 mime=$(file -L --mime-type $1)
15 *application/x-executable);;
16 *application/x-sharedlib);;
17 *) echo "Not an elf file" >&2 ; exit 1;;
20 # Gather all symbols from the target
21 unresolved_symbols=$(nm -D -u --format=posix "$1" | awk '$2 == "U" {print $1}' | tr '\n' ' ')
22 ldd_libs=$(ldd $1 | awk '{print $1 ":" $3}')
25 libkey="lib_symbols_$1"
31 libkey="${libkey%%${patterns}*}${replacement}${libkey#*${patterns}}"
41 # Check for useful libs
44 for lib in $(readelf -d $1 | awk '$2 ~ /\(?NEEDED\)?/ { sub(/\[/,"",$NF); sub(/\]/,"",$NF); print $NF }'); do
45 echo -n "checking if $lib is needed: "
46 for libpair in ${ldd_libs}; do
48 ${lib}:*) libpath="${libpair#*:}" && break ;;
51 list_libs="$list_libs $lib"
53 lib_symbols="$(nm -D --defined-only --format=posix "${libpath}" | awk '$2 ~ /R|D|T|W|B|V/ {print $1}' | tr '\n' ' ')"
54 if [ ${CHECK_UNRESOLVED} -eq 1 ]; then
55 # Save the global symbols for this lib
57 setvar "${libkey}" "${lib_symbols}"
59 for fct in ${lib_symbols}; do
60 case " ${unresolved_symbols} " in
61 *\ ${fct}\ *) foundone="${fct}" && break ;;
64 if [ -n "${foundone}" ]; then
65 echo "yes... ${foundone}"
72 if [ ${CHECK_UNRESOLVED} -eq 1 ]; then
73 for sym in ${unresolved_symbols}; do
75 for lib in ${list_libs}; do
77 eval "lib_symbols=\"\${${libkey}}\""
78 # lib_symbols now contains symbols for the lib.
79 case " ${lib_symbols} " in
80 *\ ${sym}\ *) found=1 && break ;;
83 if [ $found -eq 0 ]; then
84 echo "Unresolved symbol $sym"