mirror of
https://github.com/PCRE2Project/pcre2.git
synced 2025-10-15 12:07:02 +08:00
97 lines
2.1 KiB
Bash
Executable File
97 lines
2.1 KiB
Bash
Executable File
#! /bin/sh
|
|
|
|
# Script to test that all the symbols of a shared object are as expected.
|
|
|
|
set -e
|
|
|
|
# Ensure stable ordering of `sort` output
|
|
LANG=C
|
|
LC_ALL=C
|
|
export LANG LC_ALL
|
|
|
|
if [ "$1" = "" -o "$2" = "" ] ; then
|
|
echo "Usage: $0 <so_dir> <manifest_dir>" >&2
|
|
exit 1
|
|
fi
|
|
|
|
input_dir="$1"
|
|
manifest_dir="$2"
|
|
|
|
sed=sed
|
|
grep=grep
|
|
# Helpers for Solaris
|
|
if [ -f /usr/bin/gsed ] ; then
|
|
sed=/usr/bin/gsed
|
|
fi
|
|
if [ -f /usr/bin/ggrep ] ; then
|
|
grep=/usr/bin/ggrep
|
|
fi
|
|
|
|
nm="nm -B -D"
|
|
if [ "`uname -s`" = "Linux" ]; then
|
|
nm="$nm --with-symbol-versions"
|
|
elif [ "`uname -s`" = "SunOS" ]; then
|
|
nm="nm -p -h -D -g"
|
|
elif [ "`uname -s`" = "Darwin" ]; then
|
|
nm="nm -B -g"
|
|
fi
|
|
|
|
supports_versions=1
|
|
if [ "`uname -s`" = "Darwin" ]; then
|
|
supports_versions=0
|
|
elif [ "`uname -s`" = "FreeBSD" ]; then
|
|
# Highly annoyingly, FreeBSD's nm doesn't show symbol versions, so we just
|
|
# skip checking it.
|
|
supports_versions=0
|
|
elif [ "`uname -s`" = "SunOS" ]; then
|
|
# Similarly for Solaris.
|
|
supports_versions=0
|
|
fi
|
|
|
|
so_ext=so
|
|
so_mangling() { cat; }
|
|
if [ "`uname -s`" = "Darwin" ]; then
|
|
so_ext=dylib
|
|
so_mangling()
|
|
{
|
|
$sed -E -e 's/_([_0-9a-zA-Z]+)$/\1/g'
|
|
}
|
|
fi
|
|
|
|
for so_name in "libpcre2-8" "libpcre2-16" "libpcre2-32" "libpcre2-posix"; do
|
|
expected_file="$manifest_dir/manifest-$so_name.so"
|
|
so_file="$input_dir/$so_name.$so_ext"
|
|
base=`basename $expected_file`
|
|
|
|
$nm "$so_file" | \
|
|
$sed -E -e 's/^[0-9a-fA-F]* *//g' | \
|
|
$grep -E -v '^[Uw] ' | \
|
|
$grep -E -v '^A PCRE2_' | \
|
|
$grep -E -v ' (_init|_fini)$' | \
|
|
$grep -E -v ' (_end|_DYNAMIC|_GLOBAL_OFFSET_TABLE_|_PROCEDURE_LINKAGE_TABLE_|_edata|_etext)$' | \
|
|
so_mangling | \
|
|
sort \
|
|
> "$base.actual"
|
|
|
|
if [ $supports_versions -eq 0 ]; then
|
|
$sed -E -e 's/@.*$//' "$expected_file" \
|
|
> "$base.expected"
|
|
else
|
|
cp "$expected_file" "$base.expected"
|
|
fi
|
|
|
|
if ! diff -u "$base.expected" "$base.actual"; then
|
|
echo "Shared object contents for $so_file differ from expected"
|
|
|
|
echo "===Actual==="
|
|
cat "$base.actual"
|
|
echo "===End==="
|
|
|
|
exit 1
|
|
fi
|
|
|
|
echo "Shared object contents for $so_file match expected"
|
|
rm -f "$base.expected" "$base.actual"
|
|
|
|
done
|