Skip to content

Commit 70e2373

Browse files
xur-llvmopsiff
authored andcommitted
vmlinux.lds.h: Adjust symbol ordering in text output section
[ Upstream commit 0043ece ] When the -ffunction-sections compiler option is enabled, each function is placed in a separate section named .text.function_name rather than putting all functions in a single .text section. However, using -function-sections can cause problems with the linker script. The comments included in include/asm-generic/vmlinux.lds.h note these issues.: “TEXT_MAIN here will match .text.fixup and .text.unlikely if dead code elimination is enabled, so these sections should be converted to use ".." first.” It is unclear whether there is a straightforward method for converting a suffix to "..". This patch modifies the order of subsections within the text output section. Specifically, it changes current order: .text.hot, .text, .text_unlikely, .text.unknown, .text.asan to the new order: .text.asan, .text.unknown, .text_unlikely, .text.hot, .text Here is the rationale behind the new layout: The majority of the code resides in three sections: .text.hot, .text, and .text.unlikely, with .text.unknown containing a negligible amount. .text.asan is only generated in ASAN builds. The primary goal is to group code segments based on their execution frequency (hotness). First, we want to place .text.hot adjacent to .text. Since we cannot put .text.hot after .text (Due to constraints with -ffunction-sections, placing .text.hot after .text is problematic), we need to put .text.hot before .text. Then it comes to .text.unlikely, we cannot put it after .text (same -ffunction-sections issue) . Therefore, we position .text.unlikely before .text.hot. .text.unknown and .tex.asan follow the same logic. This revised ordering effectively reverses the original arrangement (for .text.unlikely, .text.unknown, and .tex.asan), maintaining a similar level of affinity between sections. It also places .text.hot section at the beginning of a page to better utilize the TLB entry. Note that the limitation arises because the linker script employs glob patterns instead of regular expressions for string matching. While there is a method to maintain the current order using complex patterns, this significantly complicates the pattern and increases the likelihood of errors. This patch also changes vmlinux.lds.S for the sparc64 architecture to accommodate specific symbol placement requirements. Co-developed-by: Han Shen <[email protected]> Signed-off-by: Han Shen <[email protected]> Signed-off-by: Rong Xu <[email protected]> Suggested-by: Sriraman Tallam <[email protected]> Suggested-by: Krzysztof Pszeniczny <[email protected]> Tested-by: Yonghong Song <[email protected]> Tested-by: Yabin Cui <[email protected]> Tested-by: Nathan Chancellor <[email protected]> Reviewed-by: Kees Cook <[email protected]> Signed-off-by: Masahiro Yamada <[email protected]> [ Backport from v6.13 ] Signed-off-by: WangYuli <[email protected]>
1 parent 9ed75c4 commit 70e2373

File tree

2 files changed

+17
-7
lines changed

2 files changed

+17
-7
lines changed

arch/sparc/kernel/vmlinux.lds.S

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ SECTIONS
4848
{
4949
_text = .;
5050
HEAD_TEXT
51+
ALIGN_FUNCTION();
52+
#ifdef CONFIG_SPARC64
53+
/* Match text section symbols in head_64.S first */
54+
*head_64.o(.text)
55+
#endif
5156
TEXT_TEXT
5257
SCHED_TEXT
5358
LOCK_TEXT

include/asm-generic/vmlinux.lds.h

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -548,19 +548,24 @@
548548
* .text section. Map to function alignment to avoid address changes
549549
* during second ld run in second ld pass when generating System.map
550550
*
551-
* TEXT_MAIN here will match .text.fixup and .text.unlikely if dead
552-
* code elimination is enabled, so these sections should be converted
553-
* to use ".." first.
551+
* TEXT_MAIN here will match symbols with a fixed pattern (for example,
552+
* .text.hot or .text.unlikely) if dead code elimination or
553+
* function-section is enabled. Match these symbols first before
554+
* TEXT_MAIN to ensure they are grouped together.
555+
*
556+
* Also placing .text.hot section at the beginning of a page, this
557+
* would help the TLB performance.
554558
*/
555559
#define TEXT_TEXT \
556560
ALIGN_FUNCTION(); \
561+
*(.text.asan.* .text.tsan.*) \
562+
*(.text.unknown .text.unknown.*) \
563+
*(.text.unlikely .text.unlikely.*) \
564+
. = ALIGN(PAGE_SIZE); \
557565
*(.text.hot .text.hot.*) \
558566
*(TEXT_MAIN .text.fixup) \
559-
*(.text.unlikely .text.unlikely.*) \
560-
*(.text.unknown .text.unknown.*) \
561567
NOINSTR_TEXT \
562-
*(.ref.text) \
563-
*(.text.asan.* .text.tsan.*)
568+
*(.ref.text)
564569

565570

566571
/* sched.text is aling to function alignment to secure we have same

0 commit comments

Comments
 (0)