summaryrefslogtreecommitdiff
path: root/tests/tst-nm-runner.sh
blob: 573edbd2ad5d0f72ab63a699add06742dcff5453 (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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#!/bin/sh
set -eu

: "${PACKAGE_VERSION:?}"

TMP=${TMPDIR:-/tmp}/libmcpu-nm-$$
trap 'rm -rf "$TMP"' EXIT HUP INT TERM
mkdir -p "$TMP"

cat > "$TMP/symbols.s" <<'EOS'
.global zeta
.global data_global
.global bss_global
.extern missing
.weak weak_defined
.weak weak_missing

.text
local_text:
  RET
zeta:
  RET
weak_defined:
  RET

.data
data_global:
  .integer 64, 7

.bss
bss_global:
  .zero 16
EOS

cat > "$TMP/main.s" <<'EOS'
.global _start
.global _life
.extern zeta
.text
_start_life:
  CALL zeta
  LDI r32@0x7ffc, 0
  RET
EOS

cat > "$TMP/dyn.s" <<'EOS'
.global dyn_alpha
.global dyn_data
.weak dyn_weak
.text
dyn_alpha:
  RET
dyn_weak:
  RET
.data
dyn_data:
  .integer 64, 1
EOS

cat > "$TMP/a.s" <<'EOS'
.global archive_foo
.text
archive_foo:
  RET
EOS

cat > "$TMP/b.s" <<'EOS'
.global archive_bar
.text
archive_bar:
  RET
EOS

"$CPU_AS" -o "$TMP/symbols.o" "$TMP/symbols.s"
"$CPU_AS" -o "$TMP/main.o" "$TMP/main.s"
"$CPU_AS" -o "$TMP/dyn.o" "$TMP/dyn.s"
"$CPU_AS" -o "$TMP/a.o" "$TMP/a.s"
"$CPU_AS" -o "$TMP/b.o" "$TMP/b.s"

"$CPU_LD" --stack-size=4096 --no-heap -o "$TMP/program" "$TMP/main.o" "$TMP/symbols.o"
"$CPU_LD" --shared --soname=libnm.so.1 -o "$TMP/libnm.so.1.0.0" "$TMP/dyn.o"
"$CPU_AR" rcs "$TMP/libnm.a" "$TMP/a.o" "$TMP/b.o"

"$CPU_NM" "$TMP/symbols.o" > "$TMP/default.txt"
grep -Eq ' T zeta$' "$TMP/default.txt"
grep -Eq ' t local_text$' "$TMP/default.txt"
grep -Eq ' D data_global$' "$TMP/default.txt"
grep -Eq ' B bss_global$' "$TMP/default.txt"
grep -Eq ' U missing$' "$TMP/default.txt"
grep -Eq ' W weak_defined$' "$TMP/default.txt"
grep -Eq ' w weak_missing$' "$TMP/default.txt"

# Default order is lexical by symbol name.
awk '{print $NF}' "$TMP/default.txt" > "$TMP/names.txt"
LC_ALL=C sort "$TMP/names.txt" > "$TMP/names.sorted"
cmp "$TMP/names.txt" "$TMP/names.sorted"

"$CPU_NM" -g "$TMP/symbols.o" > "$TMP/extern.txt"
if grep -q 'local_text$' "$TMP/extern.txt"; then
  echo "mcpu-nm -g unexpectedly displayed a local symbol" >&2
  exit 1
fi
grep -q 'zeta$' "$TMP/extern.txt"

"$CPU_NM" -u "$TMP/symbols.o" > "$TMP/undef.txt"
grep -Eq ' U missing$' "$TMP/undef.txt"
grep -Eq ' w weak_missing$' "$TMP/undef.txt"
if grep -q 'zeta$' "$TMP/undef.txt"; then
  echo "mcpu-nm -u unexpectedly displayed a defined symbol" >&2
  exit 1
fi

"$CPU_NM" -n "$TMP/symbols.o" > "$TMP/numeric.txt"
# The first two defined text symbols are ordered by value, not alphabetically.
line_local=`grep -n ' local_text$' "$TMP/numeric.txt" | cut -d: -f1`
line_zeta=`grep -n ' zeta$' "$TMP/numeric.txt" | cut -d: -f1`
test "$line_local" -lt "$line_zeta"

"$CPU_NM" -r "$TMP/symbols.o" > "$TMP/reverse.txt"
first_name=`awk 'NF { print $NF; exit }' "$TMP/reverse.txt"`
test "$first_name" = zeta

"$CPU_NM" -p "$TMP/symbols.o" > "$TMP/nosort.txt"
test -s "$TMP/nosort.txt"
"$CPU_NM" -a "$TMP/symbols.o" > "$TMP/all.txt"
test -s "$TMP/all.txt"

"$CPU_NM" "$TMP/program" > "$TMP/program.txt"
# ABI-v1 ET_EXEC has no retained .symtab; successful inspection is the contract.
test ! -s "$TMP/program.txt"

"$CPU_NM" -D "$TMP/libnm.so.1.0.0" > "$TMP/dynamic.txt"
grep -q ' dyn_alpha$' "$TMP/dynamic.txt"
grep -q ' dyn_data$' "$TMP/dynamic.txt"
grep -Eq ' W dyn_weak$' "$TMP/dynamic.txt"

"$CPU_NM" "$TMP/libnm.a" > "$TMP/archive.txt"
grep -F "$TMP/libnm.a:a.o:" "$TMP/archive.txt" >/dev/null
grep -F "$TMP/libnm.a:b.o:" "$TMP/archive.txt" >/dev/null
grep -q ' archive_foo$' "$TMP/archive.txt"
grep -q ' archive_bar$' "$TMP/archive.txt"

"$CPU_NM" -A "$TMP/libnm.a" > "$TMP/archive-prefix.txt"
grep -F "$TMP/libnm.a:a.o: " "$TMP/archive-prefix.txt" | grep -q ' archive_foo$'
grep -F "$TMP/libnm.a:b.o: " "$TMP/archive-prefix.txt" | grep -q ' archive_bar$'
if grep -Fx "$TMP/libnm.a:a.o:" "$TMP/archive-prefix.txt" >/dev/null; then
  echo "mcpu-nm -A unexpectedly emitted archive member headings" >&2
  exit 1
fi

"$CPU_NM" "$TMP/a.o" "$TMP/b.o" > "$TMP/multi.txt"
grep -Fx "$TMP/a.o:" "$TMP/multi.txt" >/dev/null
grep -Fx "$TMP/b.o:" "$TMP/multi.txt" >/dev/null

"$CPU_NM" -A "$TMP/a.o" > "$TMP/file-prefix.txt"
grep -F "$TMP/a.o: " "$TMP/file-prefix.txt" | grep -q ' archive_foo$'

dd if=/dev/zero of="$TMP/bad" bs=256 count=1 2>/dev/null
if "$CPU_NM" "$TMP/bad" > /dev/null 2> "$TMP/bad.err"; then
  echo "mcpu-nm unexpectedly accepted a non-MELF file" >&2
  exit 1
fi
grep -q 'not a MELF file' "$TMP/bad.err"

"$CPU_NM" --help | grep -q -- '--dynamic'
"$CPU_NM" --help | grep -q -- '--print-file-name'
"$CPU_NM" --version | grep -Fq "$PACKAGE_VERSION"