Re: [PATCH 05/14] objtool/klp: Add .klp.symid for sympos disambiguation

Puranjay Mohan <[email protected]>
Newsgroups org.kernel.vger.live-patching,org.kernel.vger.linux-modules
Message-ID <[email protected]>
Josh Poimboeuf <[email protected]> writes:

> On Mon, Aug 03, 2026 at 03:41:15AM +0000, [email protected] wrote:
>> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
>> - [Low] Relocations in .klp.symid pointing to discarded sections (.exitcall.exit, .exit.text, etc.) will cause a link-time error when building vmlinux.
>> --
>> 
>> --- Patch [5]: [PATCH 05/14] objtool/klp: Add .klp.symid for sympos disambiguation ---
>> commit 09454266fcd41f3c022cac215ab86d1269c37d52
>> Author: Josh Poimboeuf <[email protected]>
>> 
>> objtool/klp: Add .klp.symid for sympos disambiguation
>> 
>> This commit introduces a new .klp.symid section to vmlinux.o to help
>> livepatch reliably determine the sympos of duplicate-named symbols. It
>> emits an array of identifiers and relocations that survives the final link,
>> allowing klp-diff to correlate symbols between vmlinux.o and vmlinux.
>> 
>> > diff --git a/tools/objtool/klp-symid.c b/tools/objtool/klp-symid.c
>> > new file mode 100644
>> > index 0000000000000..cf188cdfa6079
>> > --- /dev/null
>> > +++ b/tools/objtool/klp-symid.c
>> [ ... ]
>> > +static const char * const discarded_secs[] = {
>> > +	".discard",
>> > +	".modinfo",
>> > +	"__tracepoint_check",
>> > +};
>> > +
>> > +static bool discarded_sec(struct section *sec)
>> > +{
>> > +	if (!(sec->sh.sh_flags & SHF_ALLOC))
>> > +		return true;
>> > +
>> > +	for (int i = 0; i < ARRAY_SIZE(discarded_secs); i++)
>> > +		if (strstarts(sec->name, discarded_secs[i]))
>> > +			return true;
>> > +
>> > +	return false;
>> > +}
>> 
>> [Severity: Low]
>> Should the discarded_secs array also include .exitcall.exit and .exit.
>> sections?
>> 
>> Because these exit sections have the SHF_ALLOC flag set, the first check in
>> discarded_sec() will not catch them. If they are also omitted from the
>> discarded_secs array, klp_create_symid_sections() will mistakenly generate
>> relocations pointing to them.
>> 
>> Since the linker script unconditionally discards .exitcall.exit via the
>> DISCARDS macro, generating relocations against it causes a deterministic
>> link-time error ("relocation refers to a discarded section") when building
>> vmlinux.
>> 
>> Could this happen in practice? Common driver exit handlers (e.g.,
>> module_cleanup used by drivers like cx18 and ivtv) often result in
>> duplicate static symbols like __exitcall_module_cleanup in the
>> .exitcall.exit section when the modules are built-in.
>
> I'm not convinced this can happen in practice.  Why would somebody be
> trying to patch or reference a module exit symbol anyway?


I see this on my arm64 host with your arm64 support patches applied:

make KLP_SYMIDS=1 -j$(nproc) vmlinux
  DESCEND objtool
  DESCEND bpf/resolve_btfids
  INSTALL libsubcmd_headers
  UPD     include/generated/utsversion.h
  CC      init/version-timestamp.o
  KSYMS   .tmp_vmlinux0.kallsyms.S
  AS      .tmp_vmlinux0.kallsyms.o
  LD      .tmp_vmlinux1
`__exitcall_aes_mod_exit' referenced in section `.klp.symid' of vmlinux.o: defined in discarded section `.exitcall.exit' of vmlinux.o
`__exitcall_aes_mod_exit' referenced in section `.klp.symid' of vmlinux.o: defined in discarded section `.exitcall.exit' of vmlinux.o
`__exitcall_dax_exit' referenced in section `.klp.symid' of vmlinux.o: defined in discarded section `.exitcall.exit' of vmlinux.o
`__exitcall_dax_exit' referenced in section `.klp.symid' of vmlinux.o: defined in discarded section `.exitcall.exit' of vmlinux.o
`__exitcall_usb_serial_module_exit' referenced in section `.klp.symid' of vmlinux.o: defined in discarded section `.exitcall.exit' of vmlinux.o
`__exitcall_usb_serial_module_exit' referenced in section `.klp.symid' of vmlinux.o: defined in discarded section `.exitcall.exit' of vmlinux.o
`__exitcall_hid_exit' referenced in section `.klp.symid' of vmlinux.o: defined in discarded section `.exitcall.exit' of vmlinux.o
`__exitcall_hid_exit' referenced in section `.klp.symid' of vmlinux.o: defined in discarded section `.exitcall.exit' of vmlinux.o
make[2]: *** [scripts/Makefile.vmlinux:72: vmlinux.unstripped] Error 1
make[1]: *** [/data/users/pjy/linux_worktrees/meta_klp_build/Makefile:1341: vmlinux] Error 2
make: *** [Makefile:248: __sub-make] Error 2

Applying the patch below fixes it:

-- >8 --

From 93c99313870d7375ab07e494c2d0d971758578eb Mon Sep 17 00:00:00 2001
From: Puranjay Mohan <[email protected]>
Date: Fri, 7 Aug 2026 11:16:29 -0700
Subject: [PATCH] objtool/klp: Fix vmlinux .klp.symid link error for
 .exitcall.exit symbols

Building a kernel via klp-build fails to link:

  `__exitcall_aes_mod_exit' referenced in section `.klp.symid' of vmlinux.o: defined in discarded section `.exitcall.exit' of vmlinux.o
  `__exitcall_dax_exit' referenced in section `.klp.symid' of vmlinux.o: defined in discarded section `.exitcall.exit' of vmlinux.o
  `__exitcall_hid_exit' referenced in section `.klp.symid' of vmlinux.o: defined in discarded section `.exitcall.exit' of vmlinux.o
  `__exitcall_usb_serial_module_exit' referenced in section `.klp.symid' of vmlinux.o: defined in discarded section `.exitcall.exit' of vmlinux.o

module_exit() on a built-in emits a static __exitcall_$fn pointer into
.exitcall.exit, which vmlinux.lds.h discards unconditionally via
EXIT_CALL.  When two built-in translation units define a module_exit()
function of the same name, the resulting local symbols collide,
symid_needed() sees a duplicate and emits a .klp.symid entry for each,
referencing symbols the linker then throws away.

Same-named module_exit() functions are not rare:

  dax_exit                drivers/dax/device.c, drivers/dax/fsdev.c
  hid_exit                drivers/hid/hid-core.c, drivers/hid/usbhid/hid-core.c
  aes_mod_exit            arch/arm64/crypto/aes-ce-ccm-glue.c, lib/crypto/aes.c
  usb_serial_module_exit  module_usb_serial_driver() expands to this fixed
                          name in each of its ~49 users

The last one makes the collision structural rather than accidental: any
kernel with two built-in USB serial drivers has it.  This is not arch
specific either; it only requires the objects to be built in rather than
modular, which is why a monolithic config trips it while a typical
distro config does not.

Add .exitcall.exit to the discarded section list so its symbols don't get
symids.

This is the same failure mode as "objtool/klp: Fix vmlinux .klp.symid
link error for .no_trim_symbol symbols", for another unconditionally
discarded allocated section.

Fixes: 029223d30162 ("objtool/klp: Add .klp.symid for sympos disambiguation")
Signed-off-by: Puranjay Mohan <[email protected]>
---
 tools/objtool/klp-symid.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/tools/objtool/klp-symid.c b/tools/objtool/klp-symid.c
index 1934c2a1afc4d..1bdb8e4516e8f 100644
--- a/tools/objtool/klp-symid.c
+++ b/tools/objtool/klp-symid.c
@@ -30,6 +30,7 @@

 static const char * const discarded_secs[] = {
        ".discard",
+       ".exitcall.exit",
        ".modinfo",
        ".no_trim_symbol",
        "__tracepoint_check",
--
2.53.0-Meta

-- 8< -- 

Thanks,
Puranjay
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.