diff --git a/Makefile b/Makefile index 4a5db34c2386..92441eced14b 100644 --- a/Makefile +++ b/Makefile @@ -821,6 +821,8 @@ lto-clang-flags := -flto endif lto-clang-flags += -fvisibility=default $(call cc-option, -fsplit-lto-unit) +KBUILD_LDS_MODULE += $(srctree)/scripts/module-lto.lds + # allow disabling only clang LTO where needed DISABLE_LTO_CLANG := -fno-lto export DISABLE_LTO_CLANG diff --git a/scripts/module-lto.lds b/scripts/module-lto.lds new file mode 100644 index 000000000000..f5ee544a877d --- /dev/null +++ b/scripts/module-lto.lds @@ -0,0 +1,22 @@ +/* + * With CONFIG_LTO_CLANG, LLD always enables -fdata-sections and + * -ffunction-sections, which increases the size of the final module. + * Merge the split sections in the final binary. + */ +SECTIONS { + /* + * LLVM may emit .eh_frame with CONFIG_CFI_CLANG despite + * -fno-asynchronous-unwind-tables. Discard the section. + */ + /DISCARD/ : { + *(.eh_frame) + } + + .bss : { *(.bss .bss[.0-9a-zA-Z_]*) } + .data : { *(.data .data[.0-9a-zA-Z_]*) } + .rela.data : { *(.rela.data .rela.data[.0-9a-zA-Z_]*) } + .rela.rodata : { *(.rela.rodata .rela.rodata[.0-9a-zA-Z_]*) } + .rela.text : { *(.rela.text .rela.text[.0-9a-zA-Z_]*) } + .rodata : { *(.rodata .rodata[.0-9a-zA-Z_]*) } + .text : { *(.text .text[.0-9a-zA-Z_]*) } +}