kbuild: link symbol CRCs at final link, removing CONFIG_MODULE_REL_CRCS
authorMasahiro Yamada <masahiroy@kernel.org>
Fri, 13 May 2022 11:39:22 +0000 (20:39 +0900)
committerMasahiro Yamada <masahiroy@kernel.org>
Tue, 24 May 2022 07:33:20 +0000 (16:33 +0900)
commit7b4537199a4a8480b8c3ba37a2d44765ce76cd9b
tree0690afa62208ca15fd36069afcbdac85908d0676
parentf292d875d0dc700b3af0bef04c5abc1dc7b3b62c
kbuild: link symbol CRCs at final link, removing CONFIG_MODULE_REL_CRCS

include/{linux,asm-generic}/export.h defines a weak symbol, __crc_*
as a placeholder.

Genksyms writes the version CRCs into the linker script, which will be
used for filling the __crc_* symbols. The linker script format depends
on CONFIG_MODULE_REL_CRCS. If it is enabled, __crc_* holds the offset
to the reference of CRC.

It is time to get rid of this complexity.

Now that modpost parses text files (.*.cmd) to collect all the CRCs,
it can generate C code that will be linked to the vmlinux or modules.

Generate a new C file, .vmlinux.export.c, which contains the CRCs of
symbols exported by vmlinux. It is compiled and linked to vmlinux in
scripts/link-vmlinux.sh.

Put the CRCs of symbols exported by modules into the existing *.mod.c
files. No additional build step is needed for modules. As before,
*.mod.c are compiled and linked to *.ko in scripts/Makefile.modfinal.

No linker magic is used here. The new C implementation works in the
same way, whether CONFIG_RELOCATABLE is enabled or not.
CONFIG_MODULE_REL_CRCS is no longer needed.

Previously, Kbuild invoked additional $(LD) to update the CRCs in
objects, but this step is unneeded too.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Tested-by: Nathan Chancellor <nathan@kernel.org>
Tested-by: Nicolas Schier <nicolas@fjasle.eu>
Reviewed-by: Nicolas Schier <nicolas@fjasle.eu>
Tested-by: Sedat Dilek <sedat.dilek@gmail.com> # LLVM-14 (x86-64)
15 files changed:
arch/m68k/include/asm/Kbuild
arch/m68k/include/asm/export.h [deleted file]
arch/powerpc/Kconfig
arch/s390/Kconfig
arch/um/Kconfig
include/asm-generic/export.h
include/linux/export-internal.h [new file with mode: 0644]
include/linux/export.h
init/Kconfig
kernel/module.c
scripts/Makefile.build
scripts/Makefile.vmlinux [new file with mode: 0644]
scripts/genksyms/genksyms.c
scripts/link-vmlinux.sh
scripts/mod/modpost.c