summaryrefslogtreecommitdiff
path: root/tests/tst-nm-runner.sh
diff options
context:
space:
mode:
Diffstat (limited to 'tests/tst-nm-runner.sh')
-rwxr-xr-xtests/tst-nm-runner.sh167
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"