build: adjust tools/check-exports.sh
authorThomas Haller <thaller@redhat.com>
Wed, 3 Dec 2014 15:14:48 +0000 (16:14 +0100)
committerThomas Haller <thaller@redhat.com>
Fri, 5 Dec 2014 10:56:37 +0000 (11:56 +0100)
Now that the version scripts might have different
sections, the previous check-exports.sh script no
longer works.

tools/check-exports.sh

index b5a9e95..2049d0b 100755 (executable)
@@ -4,22 +4,53 @@ LC_ALL=C
 export LC_ALL
 
 stat=0
-so=$1
-def=$2
+so="$1"
+def="$2"
+PATTERN="_ANCHOR_"
 
-# Have to prefix with a tab and suffix with a ';' to match .ver file format
-get_syms='nm "$so" | grep "^[[:xdigit:]]\+ T " | sed "s/^[[:xdigit:]]\+ T //" | sed "s/^/\t/" | sed "s/$/;/"'
+TMPFILE="$(mktemp .nm-check-exports.XXXXXX)"
 
-echo $so: checking exported symbols against $def
 
-{
-       echo "{"
-       echo "global:"
-       eval $get_syms | sort -u
-       echo "local:"
-       echo "  *;"
-       echo "};"
-} | diff -u "$def" - >&2 || stat=1
+get_syms() {
+    nm "$1" |
+    sed -n 's/^[[:xdigit:]]\+ T //p' |
+    sort
+}
 
+get_syms_from_def() {
+    # be strict and only parse entries that start with one \t and end with a ';'
+    sed -n 's/^\t\([_a-zA-Z0-9]\+\);$/\1/p' "$1" |
+    grep '^\*$' -v |
+    sort
+}
+
+anchor() {
+    sed "s/.*/$PATTERN\0$PATTERN/"
+}
+
+unanchor() {
+    sed "s/^$PATTERN\(.*\)$PATTERN\$/\1/"
+}
+
+
+get_syms "$so" | anchor > "$TMPFILE"
+WRONG="$(get_syms_from_def "$def" | anchor | grep -F -f - "$TMPFILE" -v)"
+RESULT=$?
+if [ $RESULT -eq 0 ]; then
+    stat=1
+    echo ">>library \"$so\" exports symbols that are not in linker script \"$def\":"
+    echo "$WRONG" | unanchor | nl
+fi
+
+get_syms_from_def "$def" | anchor > "$TMPFILE"
+WRONG="$(get_syms "$so" | anchor | grep -F -f - "$TMPFILE" -v)"
+RESULT=$?
+if [ $RESULT -eq 0 ]; then
+    stat=1
+    echo ">>linker script \"$def\" contains symbols that are not exported by library \"$so\":"
+    echo "$WRONG" | unanchor | nl
+fi
+
+rm -rf "$TMPFILE"
 exit $stat