diff options
Diffstat (limited to '0005-kbuild-lto-fix-module-versioning.patch')
-rw-r--r-- | 0005-kbuild-lto-fix-module-versioning.patch | 219 |
1 files changed, 0 insertions, 219 deletions
diff --git a/0005-kbuild-lto-fix-module-versioning.patch b/0005-kbuild-lto-fix-module-versioning.patch deleted file mode 100644 index 1a20ec858c1f..000000000000 --- a/0005-kbuild-lto-fix-module-versioning.patch +++ /dev/null @@ -1,219 +0,0 @@ -From 50f22050930b49f29dfcc607766632c7d8096402 Mon Sep 17 00:00:00 2001 -From: Sami Tolvanen <samitolvanen@google.com> -Date: Fri, 6 Mar 2020 14:19:09 -0800 -Subject: [PATCH 05/24] kbuild: lto: fix module versioning - -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 <samitolvanen@google.com> ---- - .gitignore | 1 + - Makefile | 3 ++- - arch/Kconfig | 1 - - scripts/Makefile.build | 33 +++++++++++++++++++++++++++++++-- - scripts/Makefile.modpost | 2 ++ - scripts/link-vmlinux.sh | 25 ++++++++++++++++++++++++- - 6 files changed, 60 insertions(+), 5 deletions(-) - -diff --git a/.gitignore b/.gitignore -index 162bd2b67bdf..06e76dc39ffe 100644 ---- a/.gitignore -+++ b/.gitignore -@@ -41,6 +41,7 @@ - *.so.dbg - *.su - *.symtypes -+*.symversions - *.tab.[ch] - *.tar - *.xz -diff --git a/Makefile b/Makefile -index 44615ea079e5..b59ce19ef248 100644 ---- a/Makefile -+++ b/Makefile -@@ -1794,7 +1794,8 @@ clean: $(clean-dirs) - -o -name '.tmp_*.o.*' \ - -o -name '*.c.[012]*.*' \ - -o -name '*.ll' \ -- -o -name '*.gcno' \) -type f -print | xargs rm -f -+ -o -name '*.gcno' \ -+ -o -name '*.*.symversions' \) -type f -print | xargs rm -f - - # Generate tags for editors - # --------------------------------------------------------------------------- -diff --git a/arch/Kconfig b/arch/Kconfig -index df5a42854a51..d9c74e3b4cf8 100644 ---- a/arch/Kconfig -+++ b/arch/Kconfig -@@ -601,7 +601,6 @@ config LTO_CLANG - depends on ARCH_SUPPORTS_LTO_CLANG - depends on !FTRACE_MCOUNT_RECORD - depends on !KASAN -- depends on !MODVERSIONS - select LTO - help - This option enables Clang's Link Time Optimization (LTO), which -diff --git a/scripts/Makefile.build b/scripts/Makefile.build -index f307e708a1b7..5c0bbb6ddfcf 100644 ---- a/scripts/Makefile.build -+++ b/scripts/Makefile.build -@@ -163,6 +163,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)) \ -+ > $@.symversions; \ -+ fi; -+else - cmd_modversions_c = \ - if $(OBJDUMP) -h $@ | grep -q __ksymtab; then \ - $(call cmd_gensymtypes_c,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \ -@@ -174,6 +183,7 @@ cmd_modversions_c = \ - rm -f $(@D)/.tmp_$(@F:.o=.ver); \ - fi - endif -+endif - - ifdef CONFIG_FTRACE_MCOUNT_RECORD - ifndef CC_USING_RECORD_MCOUNT -@@ -389,6 +399,18 @@ $(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 $@.symversions \ -+ $(foreach n, $(filter-out FORCE,$^), \ -+ $(if $(wildcard $(n).symversions), \ -+ ; cat $(n).symversions >> $@.symversions)) -+else -+ cmd_update_lto_symversions = echo >/dev/null -+endif -+ - # - # Rule to compile a set of .o files into one .a file (without symbol table) - # -@@ -396,8 +418,11 @@ $(subdir-modorder): $(obj)/%/modules.order: $(obj)/% ; - 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 -@@ -417,8 +442,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 -@@ -427,6 +455,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) rcsTP$(KBUILD_ARFLAGS) $@ $(filter %.o,$^) - else -diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost -index a70f1f7da6aa..f9718bf4172d 100644 ---- a/scripts/Makefile.modpost -+++ b/scripts/Makefile.modpost -@@ -110,6 +110,8 @@ prelink-ext = .lto - quiet_cmd_cc_lto_link_modules = LTO [M] $@ - cmd_cc_lto_link_modules = \ - $(LD) $(ld_flags) -r -o $@ \ -+ $(shell [ -s $(@:.lto.o=.o.symversions) ] && \ -+ echo -T $(@:.lto.o=.o.symversions)) \ - --whole-archive $(filter-out FORCE,$^) - - %.lto.o: %.o FORCE -diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh -index 4b9ae7751b63..712769355a5b 100755 ---- a/scripts/link-vmlinux.sh -+++ b/scripts/link-vmlinux.sh -@@ -39,11 +39,28 @@ info() - fi - } - -+# If CONFIG_LTO_CLANG is selected, collect generated symbol versions into -+# .tmp_symversions.lds -+gen_symversions() -+{ -+ info GEN .tmp_symversions.lds -+ rm -f .tmp_symversions.lds -+ -+ for a in ${KBUILD_VMLINUX_OBJS} ${KBUILD_VMLINUX_LIBS}; do -+ for o in $(${AR} t $a 2>/dev/null); do -+ if [ -f ${o}.symversions ]; then -+ cat ${o}.symversions >> .tmp_symversions.lds -+ fi -+ done -+ done -+} -+ - # Link of vmlinux.o used for section mismatch analysis - # ${1} output file - modpost_link() - { - local objects -+ local lds="" - - objects="--whole-archive \ - ${KBUILD_VMLINUX_OBJS} \ -@@ -53,6 +70,11 @@ modpost_link() - --end-group" - - if [ -n "${CONFIG_LTO_CLANG}" ]; then -+ if [ -n "${CONFIG_MODVERSIONS}" ]; then -+ gen_symversions -+ lds="${lds} -T .tmp_symversions.lds" -+ fi -+ - # This might take a while, so indicate that we're doing - # an LTO link - info LTO ${1} -@@ -60,7 +82,7 @@ modpost_link() - info LD ${1} - fi - -- ${LD} ${KBUILD_LDFLAGS} -r -o ${1} ${objects} -+ ${LD} ${KBUILD_LDFLAGS} -r -o ${1} ${lds} ${objects} - } - - objtool_link() -@@ -238,6 +260,7 @@ cleanup() - { - rm -f .btf.* - rm -f .tmp_System.map -+ rm -f .tmp_symversions.lds - rm -f .tmp_vmlinux* - rm -f System.map - rm -f vmlinux --- -2.28.0 - |