summaryrefslogtreecommitdiff
path: root/tests/tst-abi3-final-runner.sh
blob: 77447759c82ce59e2cf4c1aed5f98af5a201483d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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