| #! /bin/sh |
|
|
| |
|
|
| set -e |
|
|
| |
| 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 |
| |
| 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`" = "FreeBSD" ]; then |
| |
| nm="llvm-nm -B -D" |
| elif [ "`uname -s`" = "SunOS" ]; then |
| |
| |
| |
| nm=emulated_nm |
| emulated_nm() |
| { |
| |
| VERSUB=`elfdump -v "$1" | \ |
| $grep -E '^\s*\[[0-9]+\]' | \ |
| $sed -E -e 's/\s+/,/g' | \ |
| tr -d '\[\]' | \ |
| cut -d',' -f 2,3 | \ |
| $sed -E -e 's/([0-9]+),(.*)/s\/@@\1\/@@\2\/;/'` |
|
|
| |
| elfdump -T SHT_DYNSYM "$1" | \ |
| $grep -E '^\s*\[[0-9]+\]' | \ |
| $sed -E -e 's/\s+/ /g' | \ |
| cut -d' ' -f 3,8,9,10 | \ |
| $sed -E -e 's/^0x//;s/([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*)/\1 \3 \4@@\2/;' | \ |
| $sed -E -e 's/^([^ ]*) .text /\1 T /' | \ |
| $sed -E -e 's/^([^ ]*) ([UA])(NDEF|BS) /\1 \2 /' | \ |
| $sed -E -e "$VERSUB" |
| } |
| elif [ "`uname -s`" = "Darwin" ]; then |
| nm="nm -B -g" |
| fi |
|
|
| supports_versions=1 |
| if [ "`uname -s`" = "Darwin" ]; then |
| 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 ' (__bss_start|_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 |
|
|