diff options
| author | kx <kx@radix-linux.su> | 2026-10-09 18:00:15 +0300 |
|---|---|---|
| committer | kx <kx@radix-linux.su> | 2026-10-09 18:00:15 +0300 |
| commit | 065da3509019b15dd0e678072e6be629e5330bef (patch) | |
| tree | 69c934c9e786ac048b4fbe8f4c4c5571661521f4 /tests/tst-env-preload-runner.sh | |
| parent | d130fe27fa753be02ed76fd9b277aa3c3d928eb9 (diff) | |
| download | libmcpu-0.4.0.tar.xz | |
Version 0.4.00.4.0
Diffstat (limited to 'tests/tst-env-preload-runner.sh')
| -rwxr-xr-x | tests/tst-env-preload-runner.sh | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/tests/tst-env-preload-runner.sh b/tests/tst-env-preload-runner.sh new file mode 100755 index 0000000..5f49e9b --- /dev/null +++ b/tests/tst-env-preload-runner.sh @@ -0,0 +1,124 @@ +#!/bin/sh +set -eu + +: "${CPU_AS:?}" "${CPU_LD:?}" "${CPU_RUN:?}" + +TMP=${TMPDIR:-/tmp}/libmcpu-env-preload-$$ +mkdir -p "$TMP/lib" +trap 'rm -rf "$TMP"' EXIT HUP INT TERM + +cat > "$TMP/main.s" <<'EOS' +.global _life +.global foo +.text +_start_life: + LDI r64@0x00000, 40 + CALL foo + MOV r64@0x00018, r64@0x00000 + LDI r32@0x00030, 0 + EXIT r32@0x00030 +foo: + LDI r64@0x00008, 1 + IADD r64@0x00000, r64@0x00000, r64@0x00008 + RET +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/b.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/b.o" "$TMP/b.s" +"$CPU_LD" --dynamic --stack-size=4096 --no-heap -o "$TMP/main" "$TMP/main.o" +"$CPU_LD" --shared --soname=liba.so.1 -o "$TMP/lib/liba.so.1" "$TMP/a.o" +"$CPU_LD" --shared --soname=libb.so.1 -o "$TMP/lib/libb.so.1" "$TMP/b.o" +ln -s liba.so.1 "$TMP/lib/liba.so" +ln -s libb.so.1 "$TMP/lib/libb.so" + +# Empty environment is the normal no-preload baseline. +[ "`MCPU_LD_PRELOAD= "$CPU_RUN" --library-path="$TMP/lib" \ + --int-reg=r64@0x00018 "$TMP/main"`" = 41 ] + +# Environment-only preload uses the same resolver and rightmost-wins ordering. +[ "`MCPU_LD_PRELOAD=liba.so "$CPU_RUN" --library-path="$TMP/lib" \ + --int-reg=r64@0x00018 "$TMP/main"`" = 42 ] +[ "`MCPU_LD_PRELOAD=liba.so:libb.so "$CPU_RUN" --library-path="$TMP/lib" \ + --int-reg=r64@0x00018 "$TMP/main"`" = 43 ] +[ "`MCPU_LD_PRELOAD=libb.so:liba.so "$CPU_RUN" --library-path="$TMP/lib" \ + --int-reg=r64@0x00018 "$TMP/main"`" = 42 ] + +# Command-line preload entries are appended after environment entries, so the +# established rightmost-higher-priority rule makes command line stronger. +[ "`MCPU_LD_PRELOAD=liba.so "$CPU_RUN" --library-path="$TMP/lib" \ + --ldpreload=libb.so --int-reg=r64@0x00018 "$TMP/main"`" = 43 ] +[ "`MCPU_LD_PRELOAD=libb.so "$CPU_RUN" --library-path="$TMP/lib" \ + --ldpreload=liba.so --int-reg=r64@0x00018 "$TMP/main"`" = 42 ] +[ "`MCPU_LD_PRELOAD=liba.so:libb.so "$CPU_RUN" --library-path="$TMP/lib" \ + --ldpreload=libb.so:liba.so --int-reg=r64@0x00018 "$TMP/main"`" = 42 ] + +# Environment preload is equivalent to --ldpreload for ABI compatibility: an +# ABI-v1 static executable must reject it just as it rejects the CLI option. +"$CPU_LD" --stack-size=4096 --no-heap -o "$TMP/static" "$TMP/main.o" +if MCPU_LD_PRELOAD="$TMP/lib/liba.so.1" "$CPU_RUN" "$TMP/static" \ + >/dev/null 2>"$TMP/static.err"; then + echo "ABI-v1 executable unexpectedly accepted MCPU_LD_PRELOAD" >&2 + exit 1 +fi +grep -q 'dynamic modules require' "$TMP/static.err" + +# The environment preload is independent of configuration suppression. An +# explicit pathname therefore still works under --no-config. +[ "`MCPU_LD_PRELOAD="$TMP/lib/liba.so.1" "$CPU_RUN" --no-config \ + --int-reg=r64@0x00018 "$TMP/main"`" = 42 ] + +# Environment preload remains an explicit override above a normal dependency. +cat > "$TMP/import.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 +"$CPU_AS" -o "$TMP/import.o" "$TMP/import.s" +"$CPU_LD" --dynamic --stack-size=4096 --no-heap -L"$TMP/lib" -la \ + -o "$TMP/import" "$TMP/import.o" +[ "`MCPU_LD_PRELOAD=libb.so "$CPU_RUN" --library-path="$TMP/lib" \ + --int-reg=r64@0x00018 "$TMP/import"`" = 43 ] + +# Invalid environment lists and missing names are hard errors. +if MCPU_LD_PRELOAD=liba.so::libb.so "$CPU_RUN" --library-path="$TMP/lib" \ + "$TMP/main" >/dev/null 2>"$TMP/bad-list.err"; then + echo "malformed MCPU_LD_PRELOAD unexpectedly accepted" >&2 + exit 1 +fi +grep -q 'MCPU_LD_PRELOAD' "$TMP/bad-list.err" + +if MCPU_LD_PRELOAD=does-not-exist.so "$CPU_RUN" --library-path="$TMP/lib" \ + "$TMP/main" >/dev/null 2>"$TMP/missing.err"; then + echo "missing MCPU_LD_PRELOAD library unexpectedly accepted" >&2 + exit 1 +fi +grep -q 'MCPU_LD_PRELOAD' "$TMP/missing.err" + +MCPU_LD_PRELOAD= "$CPU_RUN" --help 2>&1 | grep -q 'MCPU_LD_PRELOAD' + +exit 0 |
