Reviewed-by: Fangrui Song maskray@google.com
On 2021-07-30, Nathan Chancellor wrote:
A recent change in LLVM causes module_{c,d}tor sections to appear when CONFIG_K{A,C}SAN are enabled, which results in orphan section warnings because these are not handled anywhere:
ld.lld: warning: arch/x86/pci/built-in.a(legacy.o):(.text.asan.module_ctor) is being placed in '.text.asan.module_ctor' ld.lld: warning: arch/x86/pci/built-in.a(legacy.o):(.text.asan.module_dtor) is being placed in '.text.asan.module_dtor' ld.lld: warning: arch/x86/pci/built-in.a(legacy.o):(.text.tsan.module_ctor) is being placed in '.text.tsan.module_ctor'
Fangrui explains: "the function asan.module_ctor has the SHF_GNU_RETAIN flag, so it is in a separate section even with -fno-function-sections (default)".
If my theory is true, we should see orphan section warning with CONFIG_LD_DEAD_CODE_DATA_ELIMINATION before my sanitizer change.
Place them in the TEXT_TEXT section so that these technologies continue to work with the newer compiler versions. All of the KASAN and KCSAN KUnit tests continue to pass after this change.
Cc: stable@vger.kernel.org Link: https://github.com/ClangBuiltLinux/linux/issues/1432 Link: https://github.com/llvm/llvm-project/commit/7b789562244ee941b7bf2cefeb3fc08a... Signed-off-by: Nathan Chancellor nathan@kernel.org
v1 -> v2:
Fix inclusion of .text.tsan.* (Nick)
Drop .text.asan as it does not exist plus it would be handled by a
different line (Fangrui)
- Add Fangrui's explanation about why the LLVM commit caused these
sections to appear.
include/asm-generic/vmlinux.lds.h | 1 + 1 file changed, 1 insertion(+)
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index 17325416e2de..62669b36a772 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -586,6 +586,7 @@ NOINSTR_TEXT \ *(.text..refcount) \ *(.ref.text) \
*(.text.asan.* .text.tsan.*) \
When kmsan is upstreamed, we may need to add .text.msan.* :)
( I wondered why we cannot just change the TEXT_MAIN pattern to .text.*
For large userspace applications, separating .text.unlikely .text.hot can help do things like hugepage and mlock, which can improve instruction cache localize and reduce instruction TLB miss rates,,, but not sure this helps much for the kernel.
Or perhaps some .text.FOOBAR has special usage which cannot be placed into the output .text )
TEXT_CFI_JT \
MEM_KEEP(init.text*) \ MEM_KEEP(exit.text*) \
base-commit: 4669e13cd67f8532be12815ed3d37e775a9bdc16
2.32.0.264.g75ae10bc75