Skip to content
This repository was archived by the owner on Oct 31, 2024. It is now read-only.

Commit aadb82b

Browse files
petrpavlugregkh
authored andcommitted
x86/retpoline,kprobes: Fix position of thunk sections with CONFIG_LTO_CLANG
commit 79cd2a1 upstream. 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/20230803230323.1478869-1-andrew.cooper3@citrix.com ] Fixes: dc5723b ("kbuild: add support for Clang LTO") Signed-off-by: Petr Pavlu <petr.pavlu@suse.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Nathan Chancellor <nathan@kernel.org> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Link: https://lore.kernel.org/r/20230711091952.27944-2-petr.pavlu@suse.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 51fc0a8 commit aadb82b

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_alias_untrain_ret | (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_alias_safe_ret() 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_alias_untrain_ret, SYM_L_GLOBAL, SYM_A_NONE)
154154
UNWIND_HINT_FUNC
@@ -159,7 +159,7 @@ SYM_START(srso_alias_untrain_ret, SYM_L_GLOBAL, SYM_A_NONE)
159159
SYM_FUNC_END(srso_alias_untrain_ret)
160160
__EXPORT_THUNK(srso_alias_untrain_ret)
161161

162-
.section .text.__x86.rethunk_safe
162+
.section .text..__x86.rethunk_safe
163163
#else
164164
/* dummy definition for alternatives */
165165
SYM_START(srso_alias_untrain_ret, SYM_L_GLOBAL, SYM_A_NONE)
@@ -177,7 +177,7 @@ SYM_START(srso_alias_safe_ret, SYM_L_GLOBAL, SYM_A_NONE)
177177
int3
178178
SYM_FUNC_END(srso_alias_safe_ret)
179179

180-
.section .text.__x86.return_thunk
180+
.section .text..__x86.return_thunk
181181

182182
SYM_CODE_START(srso_alias_return_thunk)
183183
UNWIND_HINT_FUNC

tools/objtool/check.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ static int decode_instructions(struct objtool_file *file)
429429
if (!strcmp(sec->name, ".noinstr.text") ||
430430
!strcmp(sec->name, ".entry.text") ||
431431
!strcmp(sec->name, ".cpuidle.text") ||
432-
!strncmp(sec->name, ".text.__x86.", 12))
432+
!strncmp(sec->name, ".text..__x86.", 13))
433433
sec->noinstr = true;
434434

435435
/*

0 commit comments

Comments
 (0)