xref: /linux/tools/objtool/tests/generic/test-symid-discarded.sh (revision 5b6dca02b3e2254d2fd5706d76d7ab4610a67296)
1*e018004aSPuranjay Mohan#!/bin/bash
2*e018004aSPuranjay Mohan# SPDX-License-Identifier: GPL-2.0
3*e018004aSPuranjay Mohan#
4*e018004aSPuranjay Mohan# .klp.symid must not reference symbols in sections the vmlinux link discards.
5*e018004aSPuranjay Mohan# Each such section has been its own bug, found only when someone built a
6*e018004aSPuranjay Mohan# config where a duplicate happened to land there, so cover the whole list
7*e018004aSPuranjay Mohan# rather than whichever one was reported last.
8*e018004aSPuranjay Mohan
9*e018004aSPuranjay Mohan. "$(dirname "$0")/../lib.sh"
10*e018004aSPuranjay Mohan
11*e018004aSPuranjay Mohansetup
12*e018004aSPuranjay Mohan
13*e018004aSPuranjay Mohan# Allocated sections which vmlinux.lds.h discards unconditionally.  A symid
14*e018004aSPuranjay Mohan# referencing one of these fails the vmlinux link outright:
15*e018004aSPuranjay Mohan#
16*e018004aSPuranjay Mohan#   `__exitcall_hid_exit' referenced in section `.klp.symid' of vmlinux.o:
17*e018004aSPuranjay Mohan#   defined in discarded section `.exitcall.exit' of vmlinux.o
18*e018004aSPuranjay Mohanfor sec in .exitcall.exit .no_trim_symbol; do
19*e018004aSPuranjay Mohan	build_one symid_discarded.c a.o \
20*e018004aSPuranjay Mohan		-DFUNC_NAME=use_a -DDISCARDED_SEC="\"$sec\""
21*e018004aSPuranjay Mohan	build_one symid_discarded.c b.o \
22*e018004aSPuranjay Mohan		-DFUNC_NAME=use_b -DDISCARDED_SEC="\"$sec\""
23*e018004aSPuranjay Mohan
24*e018004aSPuranjay Mohan	# --klp-symids only runs on a file named vmlinux.o
25*e018004aSPuranjay Mohan	rm -f "$workdir/vmlinux.o"
26*e018004aSPuranjay Mohan	partial_link "$workdir/vmlinux.o" "$workdir/a.o" "$workdir/b.o" ||
27*e018004aSPuranjay Mohan		probe_skip "partial link unavailable"
28*e018004aSPuranjay Mohan
29*e018004aSPuranjay Mohan	"$OBJTOOL" --klp-symids --link "$workdir/vmlinux.o" ||
30*e018004aSPuranjay Mohan		fail "objtool --klp-symids failed"
31*e018004aSPuranjay Mohan
32*e018004aSPuranjay Mohan	symids="$(in_relocs vmlinux.o |
33*e018004aSPuranjay Mohan		  awk '/rela.klp.symid/,/^$/')"
34*e018004aSPuranjay Mohan
35*e018004aSPuranjay Mohan	# Without this the test would also pass if symid generation stopped
36*e018004aSPuranjay Mohan	# entirely.
37*e018004aSPuranjay Mohan	echo "$symids" | grep -q 'dup_normal' ||
38*e018004aSPuranjay Mohan		fail "$sec: no symid for the duplicate in a live section"
39*e018004aSPuranjay Mohan
40*e018004aSPuranjay Mohan	echo "$symids" | grep -q 'dup_discarded' &&
41*e018004aSPuranjay Mohan		fail "symid emitted for a symbol in discarded section $sec"
42*e018004aSPuranjay Mohandone
43*e018004aSPuranjay Mohan
44*e018004aSPuranjay Mohanpass "no symids for symbols in discarded sections"
45