blob: d076b0ce0d5aa14e2b18abfb1979b9dd8647a38f [file] [log] [blame]
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Sami Tolvanen <samitolvanen@google.com>
Date: Tue, 3 Dec 2019 15:56:24 -0800
Subject: ANDROID: kbuild: merge module sections with LTO
LLD always splits sections with LTO, which increases module sizes. This
change adds a linker script that merges the split sections in the final
module.
Bug: 145297228
Change-Id: I247e8bd029bd0f98a4fa1cd4db7f6398467b8e55
Suggested-by: Nick Desaulniers <ndesaulniers@google.com>
Signed-off-by: Sami Tolvanen <samitolvanen@google.com>
---
Makefile | 2 ++
scripts/module-lto.lds | 22 ++++++++++++++++++++++
2 files changed, 24 insertions(+)
create mode 100644 scripts/module-lto.lds
diff --git a/Makefile b/Makefile
index 28ff164ef6a5..bdcecbc27095 100644
--- a/Makefile
+++ b/Makefile
@@ -874,6 +874,8 @@ else
CC_FLAGS_LTO_CLANG := -flto
endif
CC_FLAGS_LTO_CLANG += -fvisibility=default
+
+KBUILD_LDS_MODULE += $(srctree)/scripts/module-lto.lds
endif
ifdef CONFIG_LTO
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_]*) }
+}