@@ -355,4 +355,80 @@
#endif /* __ASSEMBLY__ */
+/*
+ * Allow ASM symbols to have their own unique sections if they are being
+ * generated by the compiler for C functions (DCE, FG-KASLR, LTO).
+ */
+#if (defined(CONFIG_LD_DEAD_CODE_DATA_ELIMINATION) && !defined(MODULE)) || \
+ (defined(CONFIG_FG_KASLR) && !defined(MODULE)) || \
+ (defined(CONFIG_MODULE_FG_KASLR) && defined(MODULE)) || \
+ (defined(CONFIG_LTO_CLANG))
+
+#define ASM_PUSH_SECTION(name) \
+ ".pushsection .text." #name
+
+#define SYM_TEXT_SECTION(name) \
+ .pushsection .text.##name
+
+#else /* just .text */
+
+#define ASM_PUSH_SECTION(name) \
+ ".pushsection .text"
+
+#define SYM_TEXT_SECTION(name) \
+ .pushsection .text
+
+#endif /* just .text */
+
+#ifdef __ASSEMBLY__
+
+#define SYM_TEXT_END_SECTION \
+ .popsection
+
+#define SYM_FUNC_START_LOCAL_ALIAS_SECTION(name) \
+ SYM_TEXT_SECTION(name) ASM_NL \
+ SYM_FUNC_START_LOCAL_ALIAS(name)
+
+#define SYM_FUNC_START_LOCAL_SECTION(name) \
+ SYM_TEXT_SECTION(name) ASM_NL \
+ SYM_FUNC_START_LOCAL(name)
+
+#define SYM_FUNC_START_NOALIGN_SECTION(name) \
+ SYM_TEXT_SECTION(name) ASM_NL \
+ SYM_FUNC_START_NOALIGN(name)
+
+#define SYM_FUNC_START_WEAK_SECTION(name) \
+ SYM_TEXT_SECTION(name) ASM_NL \
+ SYM_FUNC_START_WEAK(name)
+
+#define SYM_FUNC_START_SECTION(name) \
+ SYM_TEXT_SECTION(name) ASM_NL \
+ SYM_FUNC_START(name)
+
+#define SYM_CODE_START_LOCAL_NOALIGN_SECTION(name) \
+ SYM_TEXT_SECTION(name) ASM_NL \
+ SYM_CODE_START_LOCAL_NOALIGN(name)
+
+#define SYM_CODE_START_NOALIGN_SECTION(name) \
+ SYM_TEXT_SECTION(name) ASM_NL \
+ SYM_CODE_START_NOALIGN(name)
+
+#define SYM_CODE_START_SECTION(name) \
+ SYM_TEXT_SECTION(name) ASM_NL \
+ SYM_CODE_START(name)
+
+#define SYM_FUNC_END_ALIAS_SECTION(name) \
+ SYM_FUNC_END_ALIAS(name) ASM_NL \
+ SYM_TEXT_END_SECTION
+
+#define SYM_FUNC_END_SECTION(name) \
+ SYM_FUNC_END(name) ASM_NL \
+ SYM_TEXT_END_SECTION
+
+#define SYM_CODE_END_SECTION(name) \
+ SYM_CODE_END(name) ASM_NL \
+ SYM_TEXT_END_SECTION
+
+#endif /* __ASSEMBLY__ */
+
#endif /* _LINUX_LINKAGE_H */
With ClangLTO or -ffunction-sections (DCE, FG-KASLR), compiler places C functions into separate sections by default. However, this doesn't happen with ASM functions which are still being placed into .text. Introduce a pack of macros which generate a new unique section for the describing function named in the same fashion (.text.<func_name>). This will be needed to make input .text section empty to harden the kernel even more. Signed-off-by: Alexander Lobakin <alexandr.lobakin@intel.com> --- include/linux/linkage.h | 76 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+)