diff options
Diffstat (limited to 'tests/tst-nm-runner.sh')
| -rwxr-xr-x | tests/tst-nm-runner.sh | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/tests/tst-nm-runner.sh b/tests/tst-nm-runner.sh new file mode 100755 index 0000000..573edbd --- /dev/null +++ b/tests/tst-nm-runner.sh @@ -0,0 +1,167 @@ +#!/bin/sh +set -eu + +: "${PACKAGE_VERSION:?}" + +TMP=${TMPDIR:-/tmp}/libmcpu-nm-$$ +trap 'rm -rf "$TMP"' EXIT HUP INT TERM +mkdir -p "$TMP" + +cat > "$TMP/symbols.s" <<'EOS' +.global zeta +.global data_global +.global bss_global +.extern missing +.weak weak_defined +.weak weak_missing + +.text +local_text: + RET +zeta: + RET +weak_defined: + RET + +.data +data_global: + .integer 64, 7 + +.bss +bss_global: + .zero 16 +EOS + +cat > "$TMP/main.s" <<'EOS' +.global _start +.global _life +.extern zeta +.text +_start_life: + CALL zeta + LDI r32@0x7ffc, 0 + RET +EOS + +cat > "$TMP/dyn.s" <<'EOS' +.global dyn_alpha +.global dyn_data +.weak dyn_weak +.text +dyn_alpha: + RET +dyn_weak: + RET +.data +dyn_data: + .integer 64, 1 +EOS + +cat > "$TMP/a.s" <<'EOS' +.global archive_foo +.text +archive_foo: + RET +EOS + +cat > "$TMP/b.s" <<'EOS' +.global archive_bar +.text +archive_bar: + RET +EOS + +"$CPU_AS" -o "$TMP/symbols.o" "$TMP/symbols.s" +"$CPU_AS" -o "$TMP/main.o" "$TMP/main.s" +"$CPU_AS" -o "$TMP/dyn.o" "$TMP/dyn.s" +"$CPU_AS" -o "$TMP/a.o" "$TMP/a.s" +"$CPU_AS" -o "$TMP/b.o" "$TMP/b.s" + +"$CPU_LD" --stack-size=4096 --no-heap -o "$TMP/program" "$TMP/main.o" "$TMP/symbols.o" +"$CPU_LD" --shared --soname=libnm.so.1 -o "$TMP/libnm.so.1.0.0" "$TMP/dyn.o" +"$CPU_AR" rcs "$TMP/libnm.a" "$TMP/a.o" "$TMP/b.o" + +"$CPU_NM" "$TMP/symbols.o" > "$TMP/default.txt" +grep -Eq ' T zeta$' "$TMP/default.txt" +grep -Eq ' t local_text$' "$TMP/default.txt" +grep -Eq ' D data_global$' "$TMP/default.txt" +grep -Eq ' B bss_global$' "$TMP/default.txt" +grep -Eq ' U missing$' "$TMP/default.txt" +grep -Eq ' W weak_defined$' "$TMP/default.txt" +grep -Eq ' w weak_missing$' "$TMP/default.txt" + +# Default order is lexical by symbol name. +awk '{print $NF}' "$TMP/default.txt" > "$TMP/names.txt" +LC_ALL=C sort "$TMP/names.txt" > "$TMP/names.sorted" +cmp "$TMP/names.txt" "$TMP/names.sorted" + +"$CPU_NM" -g "$TMP/symbols.o" > "$TMP/extern.txt" +if grep -q 'local_text$' "$TMP/extern.txt"; then + echo "mcpu-nm -g unexpectedly displayed a local symbol" >&2 + exit 1 +fi +grep -q 'zeta$' "$TMP/extern.txt" + +"$CPU_NM" -u "$TMP/symbols.o" > "$TMP/undef.txt" +grep -Eq ' U missing$' "$TMP/undef.txt" +grep -Eq ' w weak_missing$' "$TMP/undef.txt" +if grep -q 'zeta$' "$TMP/undef.txt"; then + echo "mcpu-nm -u unexpectedly displayed a defined symbol" >&2 + exit 1 +fi + +"$CPU_NM" -n "$TMP/symbols.o" > "$TMP/numeric.txt" +# The first two defined text symbols are ordered by value, not alphabetically. +line_local=`grep -n ' local_text$' "$TMP/numeric.txt" | cut -d: -f1` +line_zeta=`grep -n ' zeta$' "$TMP/numeric.txt" | cut -d: -f1` +test "$line_local" -lt "$line_zeta" + +"$CPU_NM" -r "$TMP/symbols.o" > "$TMP/reverse.txt" +first_name=`awk 'NF { print $NF; exit }' "$TMP/reverse.txt"` +test "$first_name" = zeta + +"$CPU_NM" -p "$TMP/symbols.o" > "$TMP/nosort.txt" +test -s "$TMP/nosort.txt" +"$CPU_NM" -a "$TMP/symbols.o" > "$TMP/all.txt" +test -s "$TMP/all.txt" + +"$CPU_NM" "$TMP/program" > "$TMP/program.txt" +# ABI-v1 ET_EXEC has no retained .symtab; successful inspection is the contract. +test ! -s "$TMP/program.txt" + +"$CPU_NM" -D "$TMP/libnm.so.1.0.0" > "$TMP/dynamic.txt" +grep -q ' dyn_alpha$' "$TMP/dynamic.txt" +grep -q ' dyn_data$' "$TMP/dynamic.txt" +grep -Eq ' W dyn_weak$' "$TMP/dynamic.txt" + +"$CPU_NM" "$TMP/libnm.a" > "$TMP/archive.txt" +grep -F "$TMP/libnm.a:a.o:" "$TMP/archive.txt" >/dev/null +grep -F "$TMP/libnm.a:b.o:" "$TMP/archive.txt" >/dev/null +grep -q ' archive_foo$' "$TMP/archive.txt" +grep -q ' archive_bar$' "$TMP/archive.txt" + +"$CPU_NM" -A "$TMP/libnm.a" > "$TMP/archive-prefix.txt" +grep -F "$TMP/libnm.a:a.o: " "$TMP/archive-prefix.txt" | grep -q ' archive_foo$' +grep -F "$TMP/libnm.a:b.o: " "$TMP/archive-prefix.txt" | grep -q ' archive_bar$' +if grep -Fx "$TMP/libnm.a:a.o:" "$TMP/archive-prefix.txt" >/dev/null; then + echo "mcpu-nm -A unexpectedly emitted archive member headings" >&2 + exit 1 +fi + +"$CPU_NM" "$TMP/a.o" "$TMP/b.o" > "$TMP/multi.txt" +grep -Fx "$TMP/a.o:" "$TMP/multi.txt" >/dev/null +grep -Fx "$TMP/b.o:" "$TMP/multi.txt" >/dev/null + +"$CPU_NM" -A "$TMP/a.o" > "$TMP/file-prefix.txt" +grep -F "$TMP/a.o: " "$TMP/file-prefix.txt" | grep -q ' archive_foo$' + +dd if=/dev/zero of="$TMP/bad" bs=256 count=1 2>/dev/null +if "$CPU_NM" "$TMP/bad" > /dev/null 2> "$TMP/bad.err"; then + echo "mcpu-nm unexpectedly accepted a non-MELF file" >&2 + exit 1 +fi +grep -q 'not a MELF file' "$TMP/bad.err" + +"$CPU_NM" --help | grep -q -- '--dynamic' +"$CPU_NM" --help | grep -q -- '--print-file-name' +"$CPU_NM" --version | grep -Fq "$PACKAGE_VERSION" |
