forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 17
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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 <[email protected]> Tested-by: Nathan Chancellor <[email protected]> Tested-by: Nicolas Schier <[email protected]> Reviewed-by: Nicolas Schier <[email protected]> Tested-by: Sedat Dilek <[email protected]> # LLVM-14 (x86-64)
- Loading branch information
Showing
15 changed files
with
108 additions
and
96 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
/* SPDX-License-Identifier: GPL-2.0-only */ | ||
/* | ||
* Please do not include this explicitly. | ||
* This is used by C files generated by modpost. | ||
*/ | ||
|
||
#ifndef __LINUX_EXPORT_INTERNAL_H__ | ||
#define __LINUX_EXPORT_INTERNAL_H__ | ||
|
||
#include <linux/compiler.h> | ||
#include <linux/types.h> | ||
|
||
/* __used is needed to keep __crc_* for LTO */ | ||
#define SYMBOL_CRC(sym, crc, sec) \ | ||
u32 __section("___kcrctab" sec "+" #sym) __used __crc_##sym = crc | ||
|
||
#endif /* __LINUX_EXPORT_INTERNAL_H__ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -128,7 +128,6 @@ $(obj)/%.i: $(src)/%.c FORCE | |
|
||
genksyms = scripts/genksyms/genksyms \ | ||
$(if $(1), -T $(2)) \ | ||
$(if $(CONFIG_MODULE_REL_CRCS), -R) \ | ||
$(if $(KBUILD_PRESERVE), -p) \ | ||
-r $(or $(wildcard $(2:.symtypes=.symref)), /dev/null) | ||
|
||
|
@@ -162,19 +161,11 @@ ifdef CONFIG_MODVERSIONS | |
# o if <file>.o doesn't contain a __ksymtab version, i.e. does | ||
# not export symbols, it's done. | ||
# o otherwise, we calculate symbol versions using the good old | ||
# genksyms on the preprocessed source and postprocess them in a way | ||
# that they are usable as a linker script | ||
# o generate .tmp_<file>.o from <file>.o using the linker to | ||
# replace the unresolved symbols __crc_exported_symbol with | ||
# the actual value of the checksum generated by genksyms | ||
# o remove .tmp_<file>.o to <file>.o | ||
# genksyms on the preprocessed source and dump them into the .cmd file. | ||
# o modpost will extract versions from that file and create *.c files that will | ||
# be compiled and linked to the kernel and/or modules. | ||
|
||
# Generate .o.symversions files for each .o with exported symbols, and link these | ||
# to the kernel and/or modules at the end. | ||
|
||
genksyms_format_rel_crc := [^_]*__crc_\([^ ]*\) = \.; LONG(\([^)]*\)).* | ||
genksyms_format_normal := __crc_\(.*\) = \(.*\); | ||
genksyms_format := $(if $(CONFIG_MODULE_REL_CRCS),$(genksyms_format_rel_crc),$(genksyms_format_normal)) | ||
genksyms_format := __crc_\(.*\) = \(.*\); | ||
|
||
gen_symversions = \ | ||
if $(NM) $@ 2>/dev/null | grep -q __ksymtab; then \ | ||
|
@@ -188,12 +179,6 @@ gen_symversions = \ | |
|
||
cmd_gen_symversions_c = $(call gen_symversions,c) | ||
|
||
cmd_modversions = \ | ||
if [ -r [email protected] ]; then \ | ||
$(LD) $(KBUILD_LDFLAGS) -r -o $(@D)/.tmp_$(@F) $@ \ | ||
-T [email protected]; \ | ||
mv -f $(@D)/.tmp_$(@F) $@; \ | ||
fi | ||
endif | ||
|
||
ifdef CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT | ||
|
@@ -273,7 +258,6 @@ define rule_cc_o_c | |
$(call cmd,checkdoc) | ||
$(call cmd,gen_objtooldep) | ||
$(call cmd,gen_symversions_c) | ||
$(if $(CONFIG_LTO_CLANG),,$(call cmd,modversions)) | ||
$(call cmd,record_mcount) | ||
endef | ||
|
||
|
@@ -282,7 +266,6 @@ define rule_as_o_S | |
$(call cmd,gen_ksymdeps) | ||
$(call cmd,gen_objtooldep) | ||
$(call cmd,gen_symversions_S) | ||
$(call cmd,modversions) | ||
endef | ||
|
||
# Built-in and composite module parts | ||
|
@@ -296,8 +279,6 @@ ifneq ($(CONFIG_LTO_CLANG)$(CONFIG_X86_KERNEL_IBT),) | |
quiet_cmd_cc_prelink_modules = LD [M] $@ | ||
cmd_cc_prelink_modules = \ | ||
$(LD) $(ld_flags) -r -o $@ \ | ||
$(shell [ -s $(@:.prelink.o=.o.symversions) ] && \ | ||
echo -T $(@:.prelink.o=.o.symversions)) \ | ||
--whole-archive $(filter-out FORCE,$^) \ | ||
$(cmd_objtool) | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
# SPDX-License-Identifier: GPL-2.0-only | ||
|
||
include include/config/auto.conf | ||
include $(srctree)/scripts/Kbuild.include | ||
|
||
# for c_flags | ||
include $(srctree)/scripts/Makefile.lib | ||
|
||
quiet_cmd_cc_o_c = CC $@ | ||
cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $< | ||
|
||
%.o: %.c FORCE | ||
$(call if_changed_dep,cc_o_c) | ||
|
||
targets := $(MAKECMDGOALS) | ||
|
||
# Add FORCE to the prequisites of a target to force it to be always rebuilt. | ||
# --------------------------------------------------------------------------- | ||
|
||
PHONY += FORCE | ||
FORCE: | ||
|
||
# Read all saved command lines and dependencies for the $(targets) we | ||
# may be building above, using $(if_changed{,_dep}). As an | ||
# optimization, we don't need to read them if the target does not | ||
# exist, we will rebuild anyway in that case. | ||
|
||
existing-targets := $(wildcard $(sort $(targets))) | ||
|
||
-include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd) | ||
|
||
.PHONY: $(PHONY) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.