Skip to content

Commit 79cd2a1

Browse files
petrpavlubp3tk0v
authored andcommitted
x86/retpoline,kprobes: Fix position of thunk sections with CONFIG_LTO_CLANG
The linker script arch/x86/kernel/vmlinux.lds.S matches the thunk sections ".text.__x86.*" from arch/x86/lib/retpoline.S as follows: .text { [...] TEXT_TEXT [...] __indirect_thunk_start = .; *(.text.__x86.*) __indirect_thunk_end = .; [...] } Macro TEXT_TEXT references TEXT_MAIN which normally expands to only ".text". However, with CONFIG_LTO_CLANG, TEXT_MAIN becomes ".text .text.[0-9a-zA-Z_]*" which wrongly matches also the thunk sections. The output layout is then different than expected. For instance, the currently defined range [__indirect_thunk_start, __indirect_thunk_end] becomes empty. Prevent the problem by using ".." as the first separator, for example, ".text..__x86.indirect_thunk". This pattern is utilized by other explicit section names which start with one of the standard prefixes, such as ".text" or ".data", and that need to be individually selected in the linker script. [ nathan: Fix conflicts with SRSO and fold in fix issue brought up by Andrew Cooper in post-review: https://lore.kernel.org/[email protected] ] Fixes: dc5723b ("kbuild: add support for Clang LTO") Signed-off-by: Petr Pavlu <[email protected]> Signed-off-by: Peter Zijlstra (Intel) <[email protected]> Signed-off-by: Nathan Chancellor <[email protected]> Signed-off-by: Borislav Petkov (AMD) <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent e9fbc47 commit 79cd2a1

File tree

3 files changed

+9
-9
lines changed

3 files changed

+9
-9
lines changed

arch/x86/kernel/vmlinux.lds.S

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,15 +134,15 @@ SECTIONS
134134
SOFTIRQENTRY_TEXT
135135
#ifdef CONFIG_RETPOLINE
136136
__indirect_thunk_start = .;
137-
*(.text.__x86.indirect_thunk)
138-
*(.text.__x86.return_thunk)
137+
*(.text..__x86.indirect_thunk)
138+
*(.text..__x86.return_thunk)
139139
__indirect_thunk_end = .;
140140
#endif
141141
STATIC_CALL_TEXT
142142

143143
ALIGN_ENTRY_TEXT_BEGIN
144144
#ifdef CONFIG_CPU_SRSO
145-
*(.text.__x86.rethunk_untrain)
145+
*(.text..__x86.rethunk_untrain)
146146
#endif
147147

148148
ENTRY_TEXT
@@ -153,7 +153,7 @@ SECTIONS
153153
* definition.
154154
*/
155155
. = srso_untrain_ret_alias | (1 << 2) | (1 << 8) | (1 << 14) | (1 << 20);
156-
*(.text.__x86.rethunk_safe)
156+
*(.text..__x86.rethunk_safe)
157157
#endif
158158
ALIGN_ENTRY_TEXT_END
159159
*(.gnu.warning)

arch/x86/lib/retpoline.S

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
#include <asm/frame.h>
1414
#include <asm/nops.h>
1515

16-
.section .text.__x86.indirect_thunk
16+
.section .text..__x86.indirect_thunk
1717

1818

1919
.macro POLINE reg
@@ -148,7 +148,7 @@ SYM_CODE_END(__x86_indirect_jump_thunk_array)
148148
* As a result, srso_safe_ret_alias() becomes a safe return.
149149
*/
150150
#ifdef CONFIG_CPU_SRSO
151-
.section .text.__x86.rethunk_untrain
151+
.section .text..__x86.rethunk_untrain
152152

153153
SYM_START(srso_untrain_ret_alias, SYM_L_GLOBAL, SYM_A_NONE)
154154
ANNOTATE_NOENDBR
@@ -158,7 +158,7 @@ SYM_START(srso_untrain_ret_alias, SYM_L_GLOBAL, SYM_A_NONE)
158158
SYM_FUNC_END(srso_untrain_ret_alias)
159159
__EXPORT_THUNK(srso_untrain_ret_alias)
160160

161-
.section .text.__x86.rethunk_safe
161+
.section .text..__x86.rethunk_safe
162162
#endif
163163

164164
/* Needs a definition for the __x86_return_thunk alternative below. */
@@ -172,7 +172,7 @@ SYM_START(srso_safe_ret_alias, SYM_L_GLOBAL, SYM_A_NONE)
172172
int3
173173
SYM_FUNC_END(srso_safe_ret_alias)
174174

175-
.section .text.__x86.return_thunk
175+
.section .text..__x86.return_thunk
176176

177177
/*
178178
* Safety details here pertain to the AMD Zen{1,2} microarchitecture:

tools/objtool/check.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ static int decode_instructions(struct objtool_file *file)
389389
if (!strcmp(sec->name, ".noinstr.text") ||
390390
!strcmp(sec->name, ".entry.text") ||
391391
!strcmp(sec->name, ".cpuidle.text") ||
392-
!strncmp(sec->name, ".text.__x86.", 12))
392+
!strncmp(sec->name, ".text..__x86.", 13))
393393
sec->noinstr = true;
394394

395395
/*

0 commit comments

Comments
 (0)