forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
With CONFIG_MODVERSIONS, version information is linked into each compilation unit that exports symbols. With LTO, we cannot use this method as all C code is compiled into LLVM bitcode instead. This change collects symbol versions into .symversions files and merges them in link-vmlinux.sh where they are all linked into vmlinux.o at the same time. Signed-off-by: Sami Tolvanen <[email protected]> Reviewed-by: Kees Cook <[email protected]> Signed-off-by: Kees Cook <[email protected]> Link: https://lore.kernel.org/r/[email protected]
- Loading branch information
1 parent
dc5723b
commit 38e8918
Showing
6 changed files
with
61 additions
and
6 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
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -41,6 +41,7 @@ | |
*.so.dbg | ||
*.su | ||
*.symtypes | ||
*.symversions | ||
*.tab.[ch] | ||
*.tar | ||
*.xz | ||
|
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 |
---|---|---|
|
@@ -166,6 +166,15 @@ ifdef CONFIG_MODVERSIONS | |
# the actual value of the checksum generated by genksyms | ||
# o remove .tmp_<file>.o to <file>.o | ||
|
||
ifdef CONFIG_LTO_CLANG | ||
# Generate .o.symversions files for each .o with exported symbols, and link these | ||
# to the kernel and/or modules at the end. | ||
cmd_modversions_c = \ | ||
if $(NM) $@ 2>/dev/null | grep -q __ksymtab; then \ | ||
$(call cmd_gensymtypes_c,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \ | ||
> [email protected]; \ | ||
fi; | ||
else | ||
cmd_modversions_c = \ | ||
if $(OBJDUMP) -h $@ | grep -q __ksymtab; then \ | ||
$(call cmd_gensymtypes_c,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \ | ||
|
@@ -177,6 +186,7 @@ cmd_modversions_c = \ | |
rm -f $(@D)/.tmp_$(@F:.o=.ver); \ | ||
fi | ||
endif | ||
endif | ||
|
||
ifdef CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT | ||
# compiler will not generate __mcount_loc use recordmcount or recordmcount.pl | ||
|
@@ -386,15 +396,30 @@ $(obj)/%.asn1.c $(obj)/%.asn1.h: $(src)/%.asn1 $(objtree)/scripts/asn1_compiler | |
$(subdir-builtin): $(obj)/%/built-in.a: $(obj)/% ; | ||
$(subdir-modorder): $(obj)/%/modules.order: $(obj)/% ; | ||
|
||
# combine symversions for later processing | ||
quiet_cmd_update_lto_symversions = SYMVER $@ | ||
ifeq ($(CONFIG_LTO_CLANG) $(CONFIG_MODVERSIONS),y y) | ||
cmd_update_lto_symversions = \ | ||
rm -f [email protected] \ | ||
$(foreach n, $(filter-out FORCE,$^), \ | ||
$(if $(wildcard $(n).symversions), \ | ||
; cat $(n).symversions >> [email protected])) | ||
else | ||
cmd_update_lto_symversions = echo >/dev/null | ||
endif | ||
|
||
# | ||
# Rule to compile a set of .o files into one .a file (without symbol table) | ||
# | ||
|
||
quiet_cmd_ar_builtin = AR $@ | ||
cmd_ar_builtin = rm -f $@; $(AR) cDPrST $@ $(real-prereqs) | ||
|
||
quiet_cmd_ar_and_symver = AR $@ | ||
cmd_ar_and_symver = $(cmd_update_lto_symversions); $(cmd_ar_builtin) | ||
|
||
$(obj)/built-in.a: $(real-obj-y) FORCE | ||
$(call if_changed,ar_builtin) | ||
$(call if_changed,ar_and_symver) | ||
|
||
# | ||
# Rule to create modules.order file | ||
|
@@ -414,8 +439,11 @@ $(obj)/modules.order: $(obj-m) FORCE | |
# | ||
# Rule to compile a set of .o files into one .a file (with symbol table) | ||
# | ||
quiet_cmd_ar_lib = AR $@ | ||
cmd_ar_lib = $(cmd_update_lto_symversions); $(cmd_ar) | ||
|
||
$(obj)/lib.a: $(lib-y) FORCE | ||
$(call if_changed,ar) | ||
$(call if_changed,ar_lib) | ||
|
||
# NOTE: | ||
# Do not replace $(filter %.o,^) with $(real-prereqs). When a single object | ||
|
@@ -424,6 +452,7 @@ $(obj)/lib.a: $(lib-y) FORCE | |
ifdef CONFIG_LTO_CLANG | ||
quiet_cmd_link_multi-m = AR [M] $@ | ||
cmd_link_multi-m = \ | ||
$(cmd_update_lto_symversions); \ | ||
rm -f $@; \ | ||
$(AR) cDPrsT $@ $(filter %.o,$^) | ||
else | ||
|
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