blob: 6d0005d6d70bbf5131bdfc0e1490f068233380ea (
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
125
126
127
128
129
|
#!/bin/sh
set -eu
: "${PACKAGE_VERSION:?}"
: "${CPU_AS:?}" "${CPU_LD:?}" "${CPU_RUN:?}" "${CPU_READELF:?}"
: "${CPU_AR:?}" "${CPU_NM:?}" "${CPU_STRIP:?}" "${STRIP_FIXTURE:?}"
TMP=${TMPDIR:-/tmp}/libmcpu-strip-$$
mkdir -p "$TMP"
trap 'rm -rf "$TMP"' EXIT HUP INT TERM
cat > "$TMP/main.s" <<'EOS'
.global _life
.text
_start_life:
LDI r64@0x00000, 42
LDI r32@0x00030, 0
EXIT r32@0x00030
EOS
cat > "$TMP/dynamic-main.s" <<'EOS'
.global _life
.extern add_one
.text
_start_life:
LDI r64@0x00000, 41
CALL add_one
MOV r64@0x00018, r64@0x00000
LDI r32@0x00030, 0
EXIT r32@0x00030
EOS
cat > "$TMP/add-one.s" <<'EOS'
.global add_one
.text
add_one:
LDI r64@0x00008, 1
IADD r64@0x00000, r64@0x00000, r64@0x00008
RET
EOS
"$CPU_AS" -o "$TMP/main.o" "$TMP/main.s"
"$CPU_AS" -o "$TMP/add-one.o" "$TMP/add-one.s"
"$CPU_AS" -o "$TMP/dynamic-main.o" "$TMP/dynamic-main.s"
"$CPU_LD" --stack-size=4096 --no-heap -o "$TMP/main" "$TMP/main.o"
"$CPU_LD" --dynamic --stack-size=4096 --no-heap -o "$TMP/dynamic-main" "$TMP/dynamic-main.o"
"$CPU_LD" --shared --soname=libadd.so.1 -o "$TMP/libadd.so" "$TMP/add-one.o"
"$CPU_AR" rcs "$TMP/libadd.a" "$TMP/add-one.o"
# ET_REL .symtab/.strtab are link semantics and are preserved byte-for-byte.
"$CPU_STRIP" -o "$TMP/main.stripped.o" "$TMP/main.o"
cmp "$TMP/main.o" "$TMP/main.stripped.o"
"$CPU_READELF" -s "$TMP/main.stripped.o" | grep -q '_life'
# Current final writers already emit no ordinary .symtab, so these are no-ops.
"$CPU_STRIP" -o "$TMP/main.clean" "$TMP/main"
cmp "$TMP/main" "$TMP/main.clean"
"$CPU_STRIP" -o "$TMP/libadd.clean.so" "$TMP/libadd.so"
cmp "$TMP/libadd.so" "$TMP/libadd.clean.so"
"$CPU_READELF" -S "$TMP/libadd.clean.so" > "$TMP/libadd.sections"
grep -q '\.dynsym' "$TMP/libadd.sections"
grep -q '\.dynstr' "$TMP/libadd.sections"
grep -q '\.mcpu.target' "$TMP/libadd.sections"
# The same removal policy on ET_DYN must preserve dynamic symbols/relocations.
"$STRIP_FIXTURE" "$TMP/libadd.so" "$TMP/libadd.with-sym.so"
"$CPU_READELF" -S -s "$TMP/libadd.with-sym.so" > "$TMP/dyn-before.txt"
grep -q '\.symtab' "$TMP/dyn-before.txt"
"$CPU_STRIP" -o "$TMP/libadd.really-stripped.so" "$TMP/libadd.with-sym.so"
"$CPU_READELF" -S -s "$TMP/libadd.really-stripped.so" > "$TMP/dyn-after.txt"
if grep -q '\.symtab' "$TMP/dyn-after.txt"; then
echo "ordinary ET_DYN .symtab survived mcpu-strip" >&2
exit 1
fi
grep -q '\.dynsym' "$TMP/dyn-after.txt"
grep -q '\.dynstr' "$TMP/dyn-after.txt"
test "`MCPU_LD_PRELOAD= "$CPU_RUN" --ldpreload="$TMP/libadd.really-stripped.so" --int-reg=r64@0x00018 "$TMP/dynamic-main"`" = 42
# Deterministic ET_REL archives keep their members and symbol index intact.
"$CPU_STRIP" -o "$TMP/libadd.clean.a" "$TMP/libadd.a"
cmp "$TMP/libadd.a" "$TMP/libadd.clean.a"
"$CPU_NM" -A "$TMP/libadd.clean.a" | grep -q 'add_one'
# Add a conventional non-runtime .symtab/.strtab to a valid ET_EXEC fixture.
# mcpu-strip must remove them, shrink the file and leave execution untouched.
"$STRIP_FIXTURE" "$TMP/main" "$TMP/main.with-sym"
chmod 755 "$TMP/main.with-sym"
"$CPU_READELF" -S -s "$TMP/main.with-sym" > "$TMP/before.txt"
grep -q '\.symtab' "$TMP/before.txt"
grep -q 'fixture_symbol' "$TMP/before.txt"
before=`wc -c < "$TMP/main.with-sym"`
"$CPU_STRIP" -o "$TMP/main.really-stripped" "$TMP/main.with-sym"
"$CPU_READELF" -S -s "$TMP/main.really-stripped" > "$TMP/after.txt"
if grep -q '\.symtab' "$TMP/after.txt"; then
echo "ordinary .symtab survived mcpu-strip" >&2
exit 1
fi
if grep -q 'fixture_symbol' "$TMP/after.txt"; then
echo "ordinary symbol string survived mcpu-strip" >&2
exit 1
fi
after=`wc -c < "$TMP/main.really-stripped"`
test "$after" -lt "$before"
test "`stat -c %a "$TMP/main.really-stripped"`" = 755
test "`"$CPU_RUN" --int-reg=r64@0x00000 "$TMP/main.really-stripped"`" = 42
# In-place replacement is atomic from the caller's point of view and keeps mode.
cp "$TMP/main.with-sym" "$TMP/main.inplace"
chmod 751 "$TMP/main.inplace"
"$CPU_STRIP" "$TMP/main.inplace"
test "`stat -c %a "$TMP/main.inplace"`" = 751
test "`"$CPU_RUN" --int-reg=r64@0x00000 "$TMP/main.inplace"`" = 42
if "$CPU_READELF" -S "$TMP/main.inplace" | grep -q '\.symtab'; then
echo "in-place strip left .symtab" >&2
exit 1
fi
"$CPU_STRIP" --help | grep -q -- '--output=FILE'
"$CPU_STRIP" --version | grep -Fq "$PACKAGE_VERSION"
if "$CPU_STRIP" "$TMP/main" "$TMP/main.clean" >/dev/null 2>&1; then
echo "mcpu-strip unexpectedly accepted multiple input files" >&2
exit 1
fi
exit 0
|