Skip to content

Commit cb87481

Browse files
npigginmasahir0y
authored andcommitted
kbuild: linker script do not match C names unless LD_DEAD_CODE_DATA_ELIMINATION is configured
The .data and .bss sections were modified in the generic linker script to pull in sections named .data.<C identifier>, which are generated by gcc with -ffunction-sections and -fdata-sections options. The problem with this pattern is it can also match section names that Linux defines explicitly, e.g., .data.unlikely. This can cause Linux sections to get moved into the wrong place. The way to avoid this is to use ".." separators for explicit section names (the dot character is valid in a section name but not a C identifier). However currently there are sections which don't follow this rule, so for now just disable the wild card by default. Example: http://marc.info/?l=linux-arm-kernel&m=150106824024221&w=2 Cc: <[email protected]> # 4.9 Fixes: b67067f ("kbuild: allow archs to select link dead code/data elimination") Signed-off-by: Nicholas Piggin <[email protected]> Signed-off-by: Masahiro Yamada <[email protected]>
1 parent aae4e7a commit cb87481

File tree

1 file changed

+26
-12
lines changed

1 file changed

+26
-12
lines changed

include/asm-generic/vmlinux.lds.h

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,22 @@
5959
/* Align . to a 8 byte boundary equals to maximum function alignment. */
6060
#define ALIGN_FUNCTION() . = ALIGN(8)
6161

62+
/*
63+
* LD_DEAD_CODE_DATA_ELIMINATION option enables -fdata-sections, which
64+
* generates .data.identifier sections, which need to be pulled in with
65+
* .data. We don't want to pull in .data..other sections, which Linux
66+
* has defined. Same for text and bss.
67+
*/
68+
#ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION
69+
#define TEXT_MAIN .text .text.[0-9a-zA-Z_]*
70+
#define DATA_MAIN .data .data.[0-9a-zA-Z_]*
71+
#define BSS_MAIN .bss .bss.[0-9a-zA-Z_]*
72+
#else
73+
#define TEXT_MAIN .text
74+
#define DATA_MAIN .data
75+
#define BSS_MAIN .bss
76+
#endif
77+
6278
/*
6379
* Align to a 32 byte boundary equal to the
6480
* alignment gcc 4.5 uses for a struct
@@ -198,12 +214,9 @@
198214

199215
/*
200216
* .data section
201-
* LD_DEAD_CODE_DATA_ELIMINATION option enables -fdata-sections generates
202-
* .data.identifier which needs to be pulled in with .data, but don't want to
203-
* pull in .data..stuff which has its own requirements. Same for bss.
204217
*/
205218
#define DATA_DATA \
206-
*(.data .data.[0-9a-zA-Z_]*) \
219+
*(DATA_MAIN) \
207220
*(.ref.data) \
208221
*(.data..shared_aligned) /* percpu related */ \
209222
MEM_KEEP(init.data) \
@@ -434,16 +447,17 @@
434447
VMLINUX_SYMBOL(__security_initcall_end) = .; \
435448
}
436449

437-
/* .text section. Map to function alignment to avoid address changes
450+
/*
451+
* .text section. Map to function alignment to avoid address changes
438452
* during second ld run in second ld pass when generating System.map
439-
* LD_DEAD_CODE_DATA_ELIMINATION option enables -ffunction-sections generates
440-
* .text.identifier which needs to be pulled in with .text , but some
441-
* architectures define .text.foo which is not intended to be pulled in here.
442-
* Those enabling LD_DEAD_CODE_DATA_ELIMINATION must ensure they don't have
443-
* conflicting section names, and must pull in .text.[0-9a-zA-Z_]* */
453+
*
454+
* TEXT_MAIN here will match .text.fixup and .text.unlikely if dead
455+
* code elimination is enabled, so these sections should be converted
456+
* to use ".." first.
457+
*/
444458
#define TEXT_TEXT \
445459
ALIGN_FUNCTION(); \
446-
*(.text.hot .text .text.fixup .text.unlikely) \
460+
*(.text.hot TEXT_MAIN .text.fixup .text.unlikely) \
447461
*(.ref.text) \
448462
MEM_KEEP(init.text) \
449463
MEM_KEEP(exit.text) \
@@ -613,7 +627,7 @@
613627
BSS_FIRST_SECTIONS \
614628
*(.bss..page_aligned) \
615629
*(.dynbss) \
616-
*(.bss .bss.[0-9a-zA-Z_]*) \
630+
*(BSS_MAIN) \
617631
*(COMMON) \
618632
}
619633

0 commit comments

Comments
 (0)