Re: [PATCH v6 13/29] arm64/build: Assert for unwanted sections
From: Ard Biesheuvel <ardb@kernel.org>
Date: 2020-10-27 18:28:39
Also in:
linux-arch, linux-arm-kernel, linux-efi, lkml
Subsystem:
module support, the rest · Maintainers:
Luis Chamberlain, Petr Pavlu, Daniel Gomez, Sami Tolvanen, Linus Torvalds
On Tue, 27 Oct 2020 at 12:29, Ard Biesheuvel [off-list ref] wrote:
On Tue, 27 Oct 2020 at 11:20, Geert Uytterhoeven [off-list ref] wrote:quoted
Hi Jean-Philippe, On Tue, Oct 27, 2020 at 11:09 AM Jean-Philippe Brucker [off-list ref] wrote:quoted
On Mon, Oct 26, 2020 at 06:38:46PM +0100, Ard Biesheuvel wrote:quoted
quoted
quoted
quoted
Note that even on plain be2881824ae9eb92, I get: aarch64-linux-gnu-ld: Unexpected GOT/PLT entries detected! aarch64-linux-gnu-ld: Unexpected run-time procedure linkages detected! The parent commit obviously doesn't show that (but probably still has the problem).Reverting both b3e5d80d0c48c0cc ("arm64/build: Warn on orphan section placement") be2881824ae9eb92 ("arm64/build: Assert for unwanted sections") seems to solve my problems, without any ill effects?I cannot reproduce the issue here with my distro GCC+binutils (Debian 8.3.0)I have the same problem with one of my debug configs and Linux v5.10-rc1, and can reproduce with the Debian 8.3.0 toolchain, by using the arm64 defconfig and disabling CONFIG_MODULES: ld -EL -maarch64elf --no-undefined -X -z norelro -shared -Bsymbolic -z notext --no-apply-dynamic-relocs --fix-cortex-a53-843419 --orphan-handling=warn --build-id=sha1 --strip-debug -o .tmp_vmlinux.kallsyms1 -T ./arch/arm64/kernel/vmlinux.lds --whole-archive arch/arm64/kernel/head.o init/built-in.a usr/built-in.a arch/arm64/built-in.a kernel/built-in.a certs/built-in.a mm/built-in.a fs/built-in.a ipc/built-in.a security/built-in.a crypto/built-in.a block/built-in.a arch/arm64/lib/built-in.a lib/built-in.a drivers/built-in.a sound/built-in.a net/built-in.a virt/built-in.a --no-whole-archive --start-group arch/arm64/lib/lib.a lib/lib.a ./drivers/firmware/efi/libstub/lib.a --end-group ld: Unexpected GOT/PLT entries detected! ld: Unexpected run-time procedure linkages detected! Adding -fno-pie to this command doesn't fix the problem. Note that when cross-building with a GCC 10.2 and binutils 2.35.1 I also get several "aarch64-linux-gnu-ld: warning: -z norelro ignored" in addition to the error, but I don't get that warning with the 8.3.0 toolchain.Thanks, my config (renesas_defconfig) also had CONFIG_MODULES disabled. Enabling that fixes the link error due to unexpected entries, but the .eh_frame orphan section warning is still there.Looks like this is caused by the VFIO driver doing nasty things with symbol_get(), resulting in weak symbol references being emitted. Since taking the address of a weak symbol can yield NULL, the only way for the linker to accommodate this is to use GOT indirection for the direct symbol reference, so that the GOT entry can be set to NULL if the reference is not satisfied at link time.
This seems to do the trick for me.
diff --git a/include/linux/module.h b/include/linux/module.h
index 7ccdf87f376f..6264617bab4d 100644
--- a/include/linux/module.h
+++ b/include/linux/module.h@@ -740,7 +740,7 @@ static inline bool within_module(unsigned longaddr, const struct module *mod)
}
/* Get/put a kernel symbol (calls should be symmetric) */
-#define symbol_get(x) ({ extern typeof(x) x __attribute__((weak)); &(x); })
+#define symbol_get(x) ({ extern typeof(x) x
__attribute__((weak,visibility("hidden"))); &(x); })
#define symbol_put(x) do { } while (0)
#define symbol_put_addr(x) do { } while (0)