#!/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