arm64/module: set trampoline section flags regardless of CONFIG_DYNAMIC_FTRACE
PATCH 1/1 arm64/module: set trampoline section flags regardless of CONFIG_DYNAMIC_FTRACE
In the arm64 module linker script, the section .text.ftrace_trampoline is specified unconditionally regardless of whether CONFIG_DYNAMIC_FTRACE is enabled (this is simply due to the limitation that module linker scripts are not preprocessed like the vmlinux one).
Normally, for .plt and .text.ftrace_trampoline, the section flags present in the module binary wouldn't matter since module_frob_arch_sections() would assign them manually anyway. However, the arm64 module loader only sets the section flags for .text.ftrace_trampoline when CONFIG_DYNAMIC_FTRACE=y. That's only become problematic recently due to a recent change in binutils-2.35, where the .text.ftrace_trampoline section (along with the .plt section) is now marked writable and executable (WAX).
We no longer allow writable and executable sections to be loaded due to commit 5c3a7db0c7ec ("module: Harden STRICT_MODULE_RWX"), so this is causing all modules linked with binutils-2.35 to be rejected under arm64. Drop the IS_ENABLED(CONFIG_DYNAMIC_FTRACE) check in module_frob_arch_sections() so that the section flags for .text.ftrace_trampoline get properly set to SHF_EXECINSTR|SHF_ALLOC, without SHF_WRITE.
--- arch/arm64/kernel/module-plts.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
arch/arm64/kernel/module-plts.c +1 -2
@@ -305,8 +305,7 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs, mod->arch.core.plt_shndx = i; else if (!strcmp(secstrings + sechdrs[i].sh_name, ".init.plt")) mod->arch.init.plt_shndx = i; - else if (IS_ENABLED(CONFIG_DYNAMIC_FTRACE) && - !strcmp(secstrings + sechdrs[i].sh_name, + else if (!strcmp(secstrings + sechdrs[i].sh_name, ".text.ftrace_trampoline")) tramp = sechdrs + i; else if (sechdrs[i].sh_type == SHT_SYMTAB)
Signature · 1 line
2.16.4
Quoted 21 lines · Jessica Yu
In the arm64 module linker script, the section .text.ftrace_trampoline is specified unconditionally regardless of whether
CONFIG_DYNAMIC_FTRACEis enabled (this is simply due to the limitation that module linker scripts are not preprocessed like the vmlinux one).Normally, for .plt and .text.ftrace_trampoline, the section flags present in the module binary wouldn't matter since
module_frob_arch_sections()would assign them manually anyway. However, the arm64 module loader only sets the section flags for .text.ftrace_trampoline whenCONFIG_DYNAMIC_FTRACE=y. That's only become problematic recently due to a recent change in binutils-2.35, where the .text.ftrace_trampoline section (along with the .plt section) is now marked writable and executable (WAX).We no longer allow writable and executable sections to be loaded due to commit
5c3a7db0c7ec("module: HardenSTRICT_MODULE_RWX"), so this is causing all modules linked with binutils-2.35 to be rejected under arm64. Drop theIS_ENABLED(CONFIG_DYNAMIC_FTRACE)check inmodule_frob_arch_sections()so that the section flags for .text.ftrace_trampoline get properly set to SHF_EXECINSTR|SHF_ALLOC, withoutSHF_WRITE.
Quoted 3 lines
Quoted 21 lines
--- arch/arm64/kernel/module-plts.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)arch/arm64/kernel/module-plts.c +1
-3@@ -305,8 +305,7 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs, mod->arch.core.plt_shndx = i; else if (!strcmp(secstrings + sechdrs[i].sh_name, ".init.plt")) mod->arch.init.plt_shndx = i; - else if (IS_ENABLED(CONFIG_DYNAMIC_FTRACE) && - !strcmp(secstrings + sechdrs[i].sh_name, + else if (!strcmp(secstrings + sechdrs[i].sh_name, ".text.ftrace_trampoline")) tramp = sechdrs + i; else if (sechdrs[i].sh_type == SHT_SYMTAB) --2.16.4
Quoted 13 lines · Jessica Yu
In the arm64 module linker script, the section .text.ftrace_trampoline is specified unconditionally regardless of whether
CONFIG_DYNAMIC_FTRACEis enabled (this is simply due to the limitation that module linker scripts are not preprocessed like the vmlinux one).Normally, for .plt and .text.ftrace_trampoline, the section flags present in the module binary wouldn't matter since
module_frob_arch_sections()would assign them manually anyway. However, the arm64 module loader only sets the section flags for .text.ftrace_trampoline whenCONFIG_DYNAMIC_FTRACE=y. That's only become problematic recently due to a recent change in binutils-2.35, where the .text.ftrace_trampoline section (along with the .plt section) is now marked writable and executable (WAX).
Quoted 1 line
[...]
Applied to arm64 (for-next/fixes), thanks!
[1/1] arm64/module: set trampoline section flags regardless of CONFIG_DYNAMIC_FTRACE
https://git.kernel.org/arm64/c/e0328feda79d
Signature · 1 line
Catalin