diff options
Diffstat (limited to 'tests/tst-abi3-final-runner.sh')
| -rwxr-xr-x | tests/tst-abi3-final-runner.sh | 78 |
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 |
