blob: 388a24984ec0a31e7314758d0c8d8a3ce32e869b (
plain) (
blame)
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
|
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
#
# .klp.symid must not reference symbols in sections the vmlinux link discards.
# Each such section has been its own bug, found only when someone built a
# config where a duplicate happened to land there, so cover the whole list
# rather than whichever one was reported last.
. "$(dirname "$0")/../lib.sh"
setup
# Allocated sections which vmlinux.lds.h discards unconditionally. A symid
# referencing one of these fails the vmlinux link outright:
#
# `__exitcall_hid_exit' referenced in section `.klp.symid' of vmlinux.o:
# defined in discarded section `.exitcall.exit' of vmlinux.o
for sec in .exitcall.exit .no_trim_symbol; do
build_one symid_discarded.c a.o \
-DFUNC_NAME=use_a -DDISCARDED_SEC="\"$sec\""
build_one symid_discarded.c b.o \
-DFUNC_NAME=use_b -DDISCARDED_SEC="\"$sec\""
# --klp-symids only runs on a file named vmlinux.o
rm -f "$workdir/vmlinux.o"
partial_link "$workdir/vmlinux.o" "$workdir/a.o" "$workdir/b.o" ||
probe_skip "partial link unavailable"
"$OBJTOOL" --klp-symids --link "$workdir/vmlinux.o" ||
fail "objtool --klp-symids failed"
symids="$(in_relocs vmlinux.o |
awk '/rela.klp.symid/,/^$/')"
# Without this the test would also pass if symid generation stopped
# entirely.
echo "$symids" | grep -q 'dup_normal' ||
fail "$sec: no symid for the duplicate in a live section"
echo "$symids" | grep -q 'dup_discarded' &&
fail "symid emitted for a symbol in discarded section $sec"
done
pass "no symids for symbols in discarded sections"
|