blob: 1515a7f5876c6d1ae9129c527decc643b441c90a (
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
#!/bin/sh
set -eu
: "${CPU_AS:?}" "${CPU_LD:?}" "${CPU_RUN:?}" "${CPU_READELF:?}" "${CPU_AR:?}"
TMP=${TMPDIR:-/tmp}/libmcpu-static-option-$$
mkdir -p "$TMP/both" "$TMP/soonly" "$TMP/aonly"
trap 'rm -rf "$TMP"' EXIT HUP INT TERM
cat > "$TMP/main.s" <<'EOS'
.global _life
.extern pick
.text
_start_life:
LDI r64@0x00000, 40
CALL pick
MOV r64@0x00018, r64@0x00000
LDI r32@0x00030, 0
EXIT r32@0x00030
EOS
cat > "$TMP/wrapper.s" <<'EOS'
.global wrapper
.extern pick
.text
wrapper:
CALL pick
RET
EOS
cat > "$TMP/pick-static.s" <<'EOS'
.global pick
.text
pick:
LDI r64@0x00008, 2
IADD r64@0x00000, r64@0x00000, r64@0x00008
RET
EOS
cat > "$TMP/pick-shared.s" <<'EOS'
.global pick
.text
pick:
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/wrapper.o" "$TMP/wrapper.s"
"$CPU_AS" -o "$TMP/pick-static.o" "$TMP/pick-static.s"
"$CPU_AS" -o "$TMP/pick-shared.o" "$TMP/pick-shared.s"
"$CPU_AR" rcs "$TMP/both/libpick.a" "$TMP/pick-static.o"
cp "$TMP/both/libpick.a" "$TMP/aonly/libpick.a"
"$CPU_LD" --shared --soname=libpick.so.1 \
-o "$TMP/both/libpick.so.1.0.0" "$TMP/pick-shared.o"
ln -s libpick.so.1.0.0 "$TMP/both/libpick.so.1"
ln -s libpick.so.1 "$TMP/both/libpick.so"
cp "$TMP/both/libpick.so.1.0.0" "$TMP/soonly/libpick.so.1.0.0"
ln -s libpick.so.1.0.0 "$TMP/soonly/libpick.so.1"
ln -s libpick.so.1 "$TMP/soonly/libpick.so"
# Normal ABI-v3 lookup prefers .so in a directory containing both providers.
"$CPU_LD" --dynamic --stack-size=4096 --no-heap \
-L"$TMP/both" -lpick -o "$TMP/dynamic-shared" "$TMP/main.o"
"$CPU_READELF" -d "$TMP/dynamic-shared" > "$TMP/dynamic-shared.dynamic"
grep -q 'NEEDED.*\[libpick.so.1\]' "$TMP/dynamic-shared.dynamic"
[ "`"$CPU_RUN" --library-path="$TMP/both" \
--int-reg=r64@0x00018 "$TMP/dynamic-shared"`" = 43 ]
# --static changes only -l resolution. The output is still ABI-v3 ET_EXEC,
# but libpick.a is selected and no DT_NEEDED is emitted.
"$CPU_LD" --dynamic --static --stack-size=4096 --no-heap \
-L"$TMP/both" -lpick -o "$TMP/dynamic-static" "$TMP/main.o"
"$CPU_READELF" -h "$TMP/dynamic-static" > "$TMP/dynamic-static.header"
"$CPU_READELF" -d "$TMP/dynamic-static" > "$TMP/dynamic-static.dynamic"
grep -q 'ABI Version:.*3' "$TMP/dynamic-static.header"
[ "`grep -c 'NEEDED' "$TMP/dynamic-static.dynamic" || true`" -eq 0 ]
[ "`"$CPU_RUN" --int-reg=r64@0x00018 "$TMP/dynamic-static"`" = 42 ]
# --shared --static remains ABI-v3 ET_DYN with its own SONAME; the selected
# archive member is incorporated into the image and adds no NEEDED entry.
"$CPU_LD" --shared --static --soname=libwrapper.so.1 \
-L"$TMP/both" -lpick -o "$TMP/libwrapper.so" "$TMP/wrapper.o"
"$CPU_READELF" -d "$TMP/libwrapper.so" > "$TMP/libwrapper.dynamic"
grep -q 'SONAME.*\[libwrapper.so.1\]' "$TMP/libwrapper.dynamic"
[ "`grep -c 'NEEDED' "$TMP/libwrapper.dynamic" || true`" -eq 0 ]
# -r already accepts static archives only; --static is therefore a harmless
# explicit statement of the same library-selection policy.
"$CPU_LD" -r --static -L"$TMP/both" -lpick \
-o "$TMP/partial.o" "$TMP/wrapper.o"
"$CPU_READELF" -s "$TMP/partial.o" > "$TMP/partial.sym"
grep -q '[[:space:]]pick$' "$TMP/partial.sym"
# ABI-v1 is already fully static; accepting --static must preserve that path.
"$CPU_LD" --static --stack-size=4096 --no-heap \
-L"$TMP/both" -lpick -o "$TMP/abi1-static" "$TMP/main.o"
[ "`"$CPU_RUN" --int-reg=r64@0x00018 "$TMP/abi1-static"`" = 42 ]
# Forced-static lookup skips a .so-only earlier directory and continues until
# it finds libpick.a in a later directory.
"$CPU_LD" --dynamic --static --stack-size=4096 --no-heap \
-L"$TMP/soonly" -L"$TMP/aonly" -lpick \
-o "$TMP/later-archive" "$TMP/main.o"
[ "`"$CPU_RUN" --int-reg=r64@0x00018 "$TMP/later-archive"`" = 42 ]
"$CPU_READELF" -d "$TMP/later-archive" > "$TMP/later-archive.dynamic"
[ "`grep -c 'NEEDED' "$TMP/later-archive.dynamic" || true`" -eq 0 ]
# With only a shared provider available, --static must fail and must not fall
# back to libpick.so.
if "$CPU_LD" --dynamic --static --stack-size=4096 --no-heap \
-L"$TMP/soonly" -lpick -o "$TMP/missing-static" "$TMP/main.o" \
>/dev/null 2>"$TMP/missing-static.err"; then
echo "--static unexpectedly selected a shared library" >&2
exit 1
fi
grep -q 'libpick.a' "$TMP/missing-static.err"
"$CPU_LD" --help 2>&1 | grep -q -- '--static'
"$CPU_LD" --help 2>&1 | grep -q 'force every -l<name> lookup to use lib<name>.a'
exit 0
|