summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorbapt <bapt@FreeBSD.org>2014-11-06 22:45:03 +0000
committerbapt <bapt@FreeBSD.org>2014-11-06 22:45:03 +0000
commitceb4f4b3ee64083baa14ea4d1db32047d8021f24 (patch)
tree23199123027784a6694c1b42c1bba2fe3a262b6f /tools
parent192cfad02f1853ace880d5d21b40cdf00a1b2b74 (diff)
downloadFreeBSD-src-ceb4f4b3ee64083baa14ea4d1db32047d8021f24.zip
FreeBSD-src-ceb4f4b3ee64083baa14ea4d1db32047d8021f24.tar.gz
Add a quick and dirty script to check validity of links in elf files
Diffstat (limited to 'tools')
-rwxr-xr-xtools/build/check-links.sh37
1 files changed, 37 insertions, 0 deletions
diff --git a/tools/build/check-links.sh b/tools/build/check-links.sh
new file mode 100755
index 0000000..28e52b5
--- /dev/null
+++ b/tools/build/check-links.sh
@@ -0,0 +1,37 @@
+#!/bin/sh
+# $FreeBSD$
+
+mime=$(file --mime-type $1)
+case $mime in
+*application/x-executable);;
+*application/x-sharedlib);;
+*) echo "Not an elf file" >&2 ; exit 1;;
+esac
+
+# Check for useful libs
+list_libs=""
+for lib in $(readelf -d $1 | awk '$2 == "(NEEDED)" { sub(/\[/,"",$NF); sub(/\]/,"",$NF); print $NF }'); do
+ echo -n "checking if $lib is needed: "
+ libpath=$(ldd $1 | awk -v lib=$lib '$1 == lib { print $3 }')
+ list_libs="$list_libs $libpath"
+ foundone=0
+ for fct in $(nm -D $libpath | awk '$2 == "T" || $2 == "W" || $2 == "B" { print $3 }'); do
+ nm -D $1 | awk -v s=$fct '$1 == "U" && $2 == s { found=1 ; exit } END { if (found != 1) { exit 1 } }' && foundone=1 && break
+ done
+ if [ $foundone -eq 1 ]; then
+ echo "yes"
+ else
+ echo "no"
+ fi
+done
+
+for sym in $(nm -D $1 | awk '$1 == "U" { print $2 }'); do
+ found=0
+ for l in ${list_libs} ; do
+ nm -D $l | awk -v s=$sym '($2 == "T" || $2 == "W" || $2 == "B") && $3 == s { found=1 ; exit } END { if (found != 1) { exit 1 } }' && found=1 && break
+ done
+ if [ $found -eq 0 ]; then
+ echo "Unresolved symbol $sym"
+ fi
+done
+
OpenPOWER on IntegriCloud