2011-03-21 17:23:51 +00:00
|
|
|
#!/bin/sh
|
|
|
|
|
|
|
|
LC_ALL=C
|
|
|
|
export LC_ALL
|
|
|
|
|
|
|
|
stat=0
|
2014-12-03 15:14:48 +00:00
|
|
|
so="$1"
|
|
|
|
def="$2"
|
|
|
|
PATTERN="_ANCHOR_"
|
2011-03-21 17:23:51 +00:00
|
|
|
|
2014-12-03 15:14:48 +00:00
|
|
|
TMPFILE="$(mktemp .nm-check-exports.XXXXXX)"
|
2011-03-21 17:23:51 +00:00
|
|
|
|
|
|
|
|
2014-12-03 15:14:48 +00:00
|
|
|
get_syms() {
|
2015-09-24 13:10:46 +00:00
|
|
|
${NM:-nm} "$1" |
|
2014-12-19 13:49:00 +00:00
|
|
|
sed -n 's/^[[:xdigit:]]\+ [DT] //p' |
|
2014-12-03 15:14:48 +00:00
|
|
|
sort
|
|
|
|
}
|
2011-03-21 17:23:51 +00:00
|
|
|
|
2014-12-03 15:14:48 +00:00
|
|
|
get_syms_from_def() {
|
2015-01-21 15:01:26 +00:00
|
|
|
sed -n 's/^\t\(\([_a-zA-Z0-9]\+\)\|#\s*\([_a-zA-Z0-9]\+@@\?[_a-zA-Z0-9]\+\)\);$/\2\3/p' "$1" |
|
2014-12-03 15:14:48 +00:00
|
|
|
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"
|
2011-03-21 17:23:51 +00:00
|
|
|
exit $stat
|
|
|
|
|