summaryrefslogtreecommitdiff
path: root/tests/tst-abi3-final-runner.sh
diff options
context:
space:
mode:
Diffstat (limited to 'tests/tst-abi3-final-runner.sh')
-rwxr-xr-xtests/tst-abi3-final-runner.sh78
1 files changed, 78 insertions, 0 deletions
diff --git a/tests/tst-abi3-final-runner.sh b/tests/tst-abi3-final-runner.sh
new file mode 100755
index 0000000..7744775
--- /dev/null
+++ b/tests/tst-abi3-final-runner.sh
@@ -0,0 +1,78 @@
+#!/bin/sh
+set -eu
+
+: "${CPU_AS:?}" "${CPU_LD:?}" "${CPU_RUN:?}" "${CPU_READELF:?}"
+
+TMP=${TMPDIR:-/tmp}/libmcpu-abi3-final-$$
+mkdir -p "$TMP/lib"
+trap 'rm -rf "$TMP"' EXIT HUP INT TERM
+
+cat > "$TMP/main.s" <<'EOS'
+.global _life
+.extern foo
+.text
+_start_life:
+ LDI r64@0x00000, 40
+ CALL foo
+ MOV r64@0x00018, r64@0x00000
+ LDI r32@0x00030, 0
+ EXIT r32@0x00030
+EOS
+
+cat > "$TMP/a.s" <<'EOS'
+.global foo
+.text
+foo:
+ LDI r64@0x00008, 2
+ IADD r64@0x00000, r64@0x00000, r64@0x00008
+ RET
+EOS
+
+cat > "$TMP/override.s" <<'EOS'
+.global foo
+.text
+foo:
+ LDI r64@0x00008, 3
+ IADD r64@0x00000, r64@0x00000, r64@0x00008
+ RET
+EOS
+
+"$CPU_AS" -o "$TMP/main.o" "$TMP/main.s"
+"$CPU_AS" -o "$TMP/a.o" "$TMP/a.s"
+"$CPU_AS" -o "$TMP/override.o" "$TMP/override.s"
+
+# Conventional development link -> SONAME -> physical file layout.
+"$CPU_LD" --shared --soname=liba.so.1 -o "$TMP/lib/liba.so.1.2.3" "$TMP/a.o"
+ln -s liba.so.1.2.3 "$TMP/lib/liba.so.1"
+ln -s liba.so.1 "$TMP/lib/liba.so"
+"$CPU_LD" --shared --soname=liboverride.so.1 -o "$TMP/lib/liboverride.so.1" "$TMP/override.o"
+ln -s liboverride.so.1 "$TMP/lib/liboverride.so"
+
+"$CPU_LD" --dynamic --stack-size=4096 --no-heap -L"$TMP/lib" -la \
+ -o "$TMP/main" "$TMP/main.o"
+
+"$CPU_READELF" -h -d "$TMP/lib/liba.so.1.2.3" > "$TMP/lib.txt"
+grep -q 'ABI Version: 3' "$TMP/lib.txt"
+grep -q 'DYN (Shared object file)' "$TMP/lib.txt"
+grep -q 'SONAME' "$TMP/lib.txt"
+grep -q 'Library soname: \[liba.so.1\]' "$TMP/lib.txt"
+
+"$CPU_READELF" -h -d "$TMP/main" > "$TMP/main.txt"
+grep -q 'ABI Version: 3' "$TMP/main.txt"
+grep -q 'EXEC (Executable file)' "$TMP/main.txt"
+grep -q 'NEEDED' "$TMP/main.txt"
+grep -q 'Shared library: \[liba.so.1\]' "$TMP/main.txt"
+if grep -q 'liba.so.1.2.3' "$TMP/main.txt"; then
+ echo "physical shared-library filename leaked into DT_NEEDED" >&2
+ exit 1
+fi
+
+# Frozen normal dependency path: automatic SONAME lookup and execution.
+[ "`MCPU_LD_PRELOAD= "$CPU_RUN" --library-path="$TMP/lib" \
+ --int-reg=r64@0x00018 "$TMP/main"`" = 42 ]
+
+# Frozen explicit-preload interposition: explicit preload outranks normal graph.
+[ "`MCPU_LD_PRELOAD=liboverride.so "$CPU_RUN" --library-path="$TMP/lib" \
+ --int-reg=r64@0x00018 "$TMP/main"`" = 43 ]
+
+exit 0