| #!/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" |