This series hunts the problems discovered after manual enabling of ARCH_WANT_LD_ORPHAN_WARN. Notably: - adds the missing PAGE_ALIGNED_DATA() section affecting VDSO placement (marked for stable); - stops blind catching of orphan text sections with .text.* directive; - properly stops .eh_frame section generation.
Compile and runtime tested on MIPS32R2 CPS board with no issues using two different toolkits: - Binutils 2.35.1, GCC 10.2.1 (with Alpine patches); - LLVM stack: 11.0.0 and from latest Git snapshot.
Since v4 [3]: - new: drop redundant .text.cps-vec creation and blind inclusion of orphan text sections via .text.* directive in vmlinux.lds.S; - don't assert SIZEOF(.rel.dyn) as it's reported that it may be not empty on certain machines and compilers (Thomas); - align GOT table like it's done for ARM64; - new: catch UBSAN's "unnamed data" sections in generic definitions when building with LD_DEAD_CODE_DATA_ELIMINATION; - collect Reviewed-bys (Kees, Nathan).
Since v3 [2]: - fix the third patch as GNU stack emits .rel.dyn into VDSO for some reason if .cfi_sections is specified.
Since v2 [1]: - stop discarding .eh_frame and just prevent it from generating (Kees); - drop redundant sections assertions (Fangrui); - place GOT table in .text instead of asserting as it's not empty when building with LLVM (Nathan); - catch compound literals in generic definitions when building with LD_DEAD_CODE_DATA_ELIMINATION (Kees); - collect two Reviewed-bys (Kees).
Since v1 [0]: - catch .got entries too as LLD may produce it (Nathan); - check for unwanted sections to be zero-sized instead of discarding (Fangrui).
[0] https://lore.kernel.org/linux-mips/20210104121729.46981-1-alobakin@pm.me [1] https://lore.kernel.org/linux-mips/20210106200713.31840-1-alobakin@pm.me [2] https://lore.kernel.org/linux-mips/20210107115120.281008-1-alobakin@pm.me [3] https://lore.kernel.org/linux-mips/20210107123331.354075-1-alobakin@pm.me
Alexander Lobakin (9): MIPS: vmlinux.lds.S: add missing PAGE_ALIGNED_DATA() section MIPS: CPS: don't create redundant .text.cps-vec section MIPS: vmlinux.lds.S: add ".gnu.attributes" to DISCARDS MIPS: properly stop .eh_frame generation MIPS: vmlinux.lds.S: explicitly catch .rel.dyn symbols MIPS: vmlinux.lds.S: explicitly declare .got table vmlinux.lds.h: catch compound literals into data and BSS vmlinux.lds.h: catch UBSAN's "unnamed data" into data MIPS: select ARCH_WANT_LD_ORPHAN_WARN
arch/mips/Kconfig | 1 + arch/mips/include/asm/asm.h | 18 ++++++++++++++++++ arch/mips/kernel/cps-vec.S | 1 - arch/mips/kernel/vmlinux.lds.S | 11 +++++++++-- include/asm-generic/vmlinux.lds.h | 6 +++--- 5 files changed, 31 insertions(+), 6 deletions(-)
MIPS uses its own declaration of rwdata, and thus it should be kept in sync with the asm-generic one. Currently PAGE_ALIGNED_DATA() is missing from the linker script, which emits the following ld warnings:
mips-alpine-linux-musl-ld: warning: orphan section `.data..page_aligned' from `arch/mips/kernel/vdso.o' being placed in section `.data..page_aligned' mips-alpine-linux-musl-ld: warning: orphan section `.data..page_aligned' from `arch/mips/vdso/vdso-image.o' being placed in section `.data..page_aligned'
Add the necessary declaration, so the mentioned structures will be placed in vmlinux as intended:
ffffffff80630580 D __end_once ffffffff80630580 D __start___dyndbg ffffffff80630580 D __start_once ffffffff80630580 D __stop___dyndbg ffffffff80634000 d mips_vdso_data ffffffff80638000 d vdso_data ffffffff80638580 D _gp ffffffff8063c000 T __init_begin ffffffff8063c000 D _edata ffffffff8063c000 T _sinittext
->
ffffffff805a4000 D __end_init_task ffffffff805a4000 D __nosave_begin ffffffff805a4000 D __nosave_end ffffffff805a4000 d mips_vdso_data ffffffff805a8000 d vdso_data ffffffff805ac000 D mmlist_lock ffffffff805ac080 D tasklist_lock
Fixes: ebb5e78cc634 ("MIPS: Initial implementation of a VDSO") Cc: stable@vger.kernel.org # 4.4+ Signed-off-by: Alexander Lobakin alobakin@pm.me Reviewed-by: Kees Cook keescook@chromium.org Reviewed-by: Nathan Chancellor natechancellor@gmail.com --- arch/mips/kernel/vmlinux.lds.S | 1 + 1 file changed, 1 insertion(+)
diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S index 5e97e9d02f98..83e27a181206 100644 --- a/arch/mips/kernel/vmlinux.lds.S +++ b/arch/mips/kernel/vmlinux.lds.S @@ -90,6 +90,7 @@ SECTIONS
INIT_TASK_DATA(THREAD_SIZE) NOSAVE_DATA + PAGE_ALIGNED_DATA(PAGE_SIZE) CACHELINE_ALIGNED_DATA(1 << CONFIG_MIPS_L1_CACHE_SHIFT) READ_MOSTLY_DATA(1 << CONFIG_MIPS_L1_CACHE_SHIFT) DATA_DATA
A number of symbols from arch/mips/kernel/cps-vec.S is explicitly placed into '.text.cps-vec' section. There are no direct references to this section, so there's no need to form it. '.balign 0x1000' directive will work anyway.
Moreover, this section was being placed in vmlinux differently depending on CONFIG_LD_DEAD_CODE_DATA_ELIMINATION: - with this option enabled, '.text.cps-vec' was being caught by '.text.[0-9a-zA-Z_]*' from include/asm-generic/vmlinux.lds.h; - without this option, '.text.cps-vec' was being caught by discouraging '.text.*' from arch/mips/kernel/vmlinux.lds.S.
'.text.*' should not be used in vmlinux linker scripts at all as it silently catches any orphan text sections. So, remove both '.section .text.cps-vec' and '.text.*' from cps-vec.S and vmlinux.lds.S respectively. As said, this does not affect related functions alignment:
80116000 T mips_cps_core_entry 80116028 t not_nmi 80116200 T excep_tlbfill 80116280 T excep_xtlbfill 80116300 T excep_cache 80116380 T excep_genex 80116400 T excep_intex 80116480 T excep_ejtag 80116490 T mips_cps_core_init
Signed-off-by: Alexander Lobakin alobakin@pm.me --- arch/mips/kernel/cps-vec.S | 1 - arch/mips/kernel/vmlinux.lds.S | 1 - 2 files changed, 2 deletions(-)
diff --git a/arch/mips/kernel/cps-vec.S b/arch/mips/kernel/cps-vec.S index 4db7ff055c9f..975343240148 100644 --- a/arch/mips/kernel/cps-vec.S +++ b/arch/mips/kernel/cps-vec.S @@ -91,7 +91,6 @@ .set pop .endm
-.section .text.cps-vec .balign 0x1000
LEAF(mips_cps_core_entry) diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S index 83e27a181206..ae1d0b4bdd60 100644 --- a/arch/mips/kernel/vmlinux.lds.S +++ b/arch/mips/kernel/vmlinux.lds.S @@ -66,7 +66,6 @@ SECTIONS KPROBES_TEXT IRQENTRY_TEXT SOFTIRQENTRY_TEXT - *(.text.*) *(.fixup) *(.gnu.warning) } :text = 0
Discard GNU attributes (MIPS FP type, GNU Hash etc.) at link time as kernel doesn't use it at all. Solves a dozen of the following ld warnings (one per every file):
mips-alpine-linux-musl-ld: warning: orphan section `.gnu.attributes' from `arch/mips/kernel/head.o' being placed in section `.gnu.attributes' mips-alpine-linux-musl-ld: warning: orphan section `.gnu.attributes' from `init/main.o' being placed in section `.gnu.attributes'
Signed-off-by: Alexander Lobakin alobakin@pm.me Reviewed-by: Nathan Chancellor natechancellor@gmail.com --- arch/mips/kernel/vmlinux.lds.S | 1 + 1 file changed, 1 insertion(+)
diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S index ae1d0b4bdd60..09669a8fddec 100644 --- a/arch/mips/kernel/vmlinux.lds.S +++ b/arch/mips/kernel/vmlinux.lds.S @@ -220,6 +220,7 @@ SECTIONS /* ABI crap starts here */ *(.MIPS.abiflags) *(.MIPS.options) + *(.gnu.attributes) *(.options) *(.pdr) *(.reginfo)
Commit 866b6a89c6d1 ("MIPS: Add DWARF unwinding to assembly") added -fno-asynchronous-unwind-tables to KBUILD_CFLAGS to prevent compiler from emitting .eh_frame symbols. However, as MIPS heavily uses CFI, that's not enough. Use the approach taken for x86 (as it also uses CFI) and explicitly put CFI symbols into the .debug_frame section (except for VDSO). This allows us to drop .eh_frame from DISCARDS as it's no longer being generated.
Fixes: 866b6a89c6d1 ("MIPS: Add DWARF unwinding to assembly") Suggested-by: Kees Cook keescook@chromium.org Signed-off-by: Alexander Lobakin alobakin@pm.me Reviewed-by: Kees Cook keescook@chromium.org Reviewed-by: Nathan Chancellor natechancellor@gmail.com --- arch/mips/include/asm/asm.h | 18 ++++++++++++++++++ arch/mips/kernel/vmlinux.lds.S | 1 - 2 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/arch/mips/include/asm/asm.h b/arch/mips/include/asm/asm.h index 3682d1a0bb80..ea4b62ece336 100644 --- a/arch/mips/include/asm/asm.h +++ b/arch/mips/include/asm/asm.h @@ -20,10 +20,27 @@ #include <asm/sgidefs.h> #include <asm/asm-eva.h>
+#ifndef __VDSO__ +/* + * Emit CFI data in .debug_frame sections, not .eh_frame sections. + * We don't do DWARF unwinding at runtime, so only the offline DWARF + * information is useful to anyone. Note we should change this if we + * ever decide to enable DWARF unwinding at runtime. + */ +#define CFI_SECTIONS .cfi_sections .debug_frame +#else + /* + * For the vDSO, emit both runtime unwind information and debug + * symbols for the .dbg file. + */ +#define CFI_SECTIONS +#endif + /* * LEAF - declare leaf routine */ #define LEAF(symbol) \ + CFI_SECTIONS; \ .globl symbol; \ .align 2; \ .type symbol, @function; \ @@ -36,6 +53,7 @@ symbol: .frame sp, 0, ra; \ * NESTED - declare nested routine entry point */ #define NESTED(symbol, framesize, rpc) \ + CFI_SECTIONS; \ .globl symbol; \ .align 2; \ .type symbol, @function; \ diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S index 09669a8fddec..10d8f0dcb76b 100644 --- a/arch/mips/kernel/vmlinux.lds.S +++ b/arch/mips/kernel/vmlinux.lds.S @@ -224,6 +224,5 @@ SECTIONS *(.options) *(.pdr) *(.reginfo) - *(.eh_frame) } }
According to linker warnings, both GCC and LLVM generate '.rel.dyn' symbols:
mips-alpine-linux-musl-ld: warning: orphan section `.rel.dyn' from `init/main.o' being placed in section `.rel.dyn'
Link-time assertion shows that this section is sometimes empty, sometimes not, depending on machine bitness and the compiler [0]:
LD .tmp_vmlinux.kallsyms1 mips64-linux-gnu-ld: Unexpected run-time relocations (.rel) detected!
Just use the ARM64 approach and declare it in vmlinux.lds.S closer to __init_end.
[0] https://lore.kernel.org/linux-mips/20210109111259.GA4213@alpha.franken.de
Reported-by: Thomas Bogendoerfer tsbogend@alpha.franken.de Signed-off-by: Alexander Lobakin alobakin@pm.me --- arch/mips/kernel/vmlinux.lds.S | 5 +++++ 1 file changed, 5 insertions(+)
diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S index 10d8f0dcb76b..70bba1ff08da 100644 --- a/arch/mips/kernel/vmlinux.lds.S +++ b/arch/mips/kernel/vmlinux.lds.S @@ -137,6 +137,11 @@ SECTIONS PERCPU_SECTION(1 << CONFIG_MIPS_L1_CACHE_SHIFT) #endif
+ .rel.dyn : ALIGN(8) { + *(.rel) + *(.rel*) + } + #ifdef CONFIG_MIPS_ELF_APPENDED_DTB .appended_dtb : AT(ADDR(.appended_dtb) - LOAD_OFFSET) { *(.appended_dtb)
On Sun, Jan 10, 2021 at 11:56:34AM +0000, Alexander Lobakin wrote:
According to linker warnings, both GCC and LLVM generate '.rel.dyn' symbols:
mips-alpine-linux-musl-ld: warning: orphan section `.rel.dyn' from `init/main.o' being placed in section `.rel.dyn'
Link-time assertion shows that this section is sometimes empty, sometimes not, depending on machine bitness and the compiler [0]:
LD .tmp_vmlinux.kallsyms1 mips64-linux-gnu-ld: Unexpected run-time relocations (.rel) detected!
Just use the ARM64 approach and declare it in vmlinux.lds.S closer to __init_end.
[0] https://lore.kernel.org/linux-mips/20210109111259.GA4213@alpha.franken.de
Reported-by: Thomas Bogendoerfer tsbogend@alpha.franken.de Signed-off-by: Alexander Lobakin alobakin@pm.me
Reviewed-by: Nathan Chancellor natechancellor@gmail.com
arch/mips/kernel/vmlinux.lds.S | 5 +++++ 1 file changed, 5 insertions(+)
diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S index 10d8f0dcb76b..70bba1ff08da 100644 --- a/arch/mips/kernel/vmlinux.lds.S +++ b/arch/mips/kernel/vmlinux.lds.S @@ -137,6 +137,11 @@ SECTIONS PERCPU_SECTION(1 << CONFIG_MIPS_L1_CACHE_SHIFT) #endif
- .rel.dyn : ALIGN(8) {
*(.rel)
*(.rel*)
- }
#ifdef CONFIG_MIPS_ELF_APPENDED_DTB .appended_dtb : AT(ADDR(.appended_dtb) - LOAD_OFFSET) { *(.appended_dtb) -- 2.30.0
LLVM stack generates GOT table when building the kernel:
ld.lld: warning: <internal>:(.got) is being placed in '.got'
According to the debug assertions, it's not zero-sized and thus can't be handled the way it's done for x86. Also use the ARM64 path here and place it at the end of .text section.
Reported-by: Nathan Chancellor natechancellor@gmail.com Signed-off-by: Alexander Lobakin alobakin@pm.me Reviewed-by: Kees Cook keescook@chromium.org Reviewed-by: Nathan Chancellor natechancellor@gmail.com --- arch/mips/kernel/vmlinux.lds.S | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S index 70bba1ff08da..c1c345be04ff 100644 --- a/arch/mips/kernel/vmlinux.lds.S +++ b/arch/mips/kernel/vmlinux.lds.S @@ -68,6 +68,8 @@ SECTIONS SOFTIRQENTRY_TEXT *(.fixup) *(.gnu.warning) + . = ALIGN(16); + *(.got) /* Global offset table */ } :text = 0 _etext = .; /* End of text section */
When building kernel with LD_DEAD_CODE_DATA_ELIMINATION, LLVM stack generates separate sections for compound literals, just like in case with enabled LTO [0]:
ld.lld: warning: drivers/built-in.a(mtd/nand/spi/gigadevice.o): (.data..compoundliteral.14) is being placed in '.data..compoundliteral.14' ld.lld: warning: drivers/built-in.a(mtd/nand/spi/gigadevice.o): (.data..compoundliteral.15) is being placed in '.data..compoundliteral.15' ld.lld: warning: drivers/built-in.a(mtd/nand/spi/gigadevice.o): (.data..compoundliteral.16) is being placed in '.data..compoundliteral.16' ld.lld: warning: drivers/built-in.a(mtd/nand/spi/gigadevice.o): (.data..compoundliteral.17) is being placed in '.data..compoundliteral.17'
[...]
Handle this by adding the related sections to generic definitions as suggested by Sami [0].
[0] https://lore.kernel.org/lkml/20201211184633.3213045-3-samitolvanen@google.co...
Suggested-by: Sami Tolvanen samitolvanen@google.com Suggested-by: Kees Cook keescook@chromium.org Signed-off-by: Alexander Lobakin alobakin@pm.me Reviewed-by: Kees Cook keescook@chromium.org Reviewed-by: Nathan Chancellor natechancellor@gmail.com --- include/asm-generic/vmlinux.lds.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index b2b3d81b1535..5f2f5b1db84f 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -95,10 +95,10 @@ */ #ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION #define TEXT_MAIN .text .text.[0-9a-zA-Z_]* -#define DATA_MAIN .data .data.[0-9a-zA-Z_]* .data..LPBX* +#define DATA_MAIN .data .data.[0-9a-zA-Z_]* .data..L* .data..compoundliteral* #define SDATA_MAIN .sdata .sdata.[0-9a-zA-Z_]* -#define RODATA_MAIN .rodata .rodata.[0-9a-zA-Z_]* -#define BSS_MAIN .bss .bss.[0-9a-zA-Z_]* +#define RODATA_MAIN .rodata .rodata.[0-9a-zA-Z_]* .rodata..L* +#define BSS_MAIN .bss .bss.[0-9a-zA-Z_]* .bss..compoundliteral* #define SBSS_MAIN .sbss .sbss.[0-9a-zA-Z_]* #else #define TEXT_MAIN .text
When building kernel with both LD_DEAD_CODE_DATA_ELIMINATION and UBSAN, LLVM stack generates lots of "unnamed data" sections:
ld.lld: warning: net/built-in.a(netfilter/utils.o): (.data.$__unnamed_2) is being placed in '.data.$__unnamed_2' ld.lld: warning: net/built-in.a(netfilter/utils.o): (.data.$__unnamed_3) is being placed in '.data.$__unnamed_3' ld.lld: warning: net/built-in.a(netfilter/utils.o): (.data.$__unnamed_4) is being placed in '.data.$__unnamed_4' ld.lld: warning: net/built-in.a(netfilter/utils.o): (.data.$__unnamed_5) is being placed in '.data.$__unnamed_5'
[...]
Also handle this by adding the related sections to generic definitions.
Signed-off-by: Alexander Lobakin alobakin@pm.me --- include/asm-generic/vmlinux.lds.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index 5f2f5b1db84f..cc659e77fcb0 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -95,7 +95,7 @@ */ #ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION #define TEXT_MAIN .text .text.[0-9a-zA-Z_]* -#define DATA_MAIN .data .data.[0-9a-zA-Z_]* .data..L* .data..compoundliteral* +#define DATA_MAIN .data .data.[0-9a-zA-Z_]* .data..L* .data..compoundliteral* .data.$__unnamed_* #define SDATA_MAIN .sdata .sdata.[0-9a-zA-Z_]* #define RODATA_MAIN .rodata .rodata.[0-9a-zA-Z_]* .rodata..L* #define BSS_MAIN .bss .bss.[0-9a-zA-Z_]* .bss..compoundliteral*
On Sun, Jan 10, 2021 at 11:56:54AM +0000, Alexander Lobakin wrote:
When building kernel with both LD_DEAD_CODE_DATA_ELIMINATION and UBSAN, LLVM stack generates lots of "unnamed data" sections:
ld.lld: warning: net/built-in.a(netfilter/utils.o): (.data.$__unnamed_2) is being placed in '.data.$__unnamed_2' ld.lld: warning: net/built-in.a(netfilter/utils.o): (.data.$__unnamed_3) is being placed in '.data.$__unnamed_3' ld.lld: warning: net/built-in.a(netfilter/utils.o): (.data.$__unnamed_4) is being placed in '.data.$__unnamed_4' ld.lld: warning: net/built-in.a(netfilter/utils.o): (.data.$__unnamed_5) is being placed in '.data.$__unnamed_5'
[...]
Also handle this by adding the related sections to generic definitions.
Signed-off-by: Alexander Lobakin alobakin@pm.me
Reviewed-by: Nathan Chancellor natechancellor@gmail.com
include/asm-generic/vmlinux.lds.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index 5f2f5b1db84f..cc659e77fcb0 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -95,7 +95,7 @@ */ #ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION #define TEXT_MAIN .text .text.[0-9a-zA-Z_]* -#define DATA_MAIN .data .data.[0-9a-zA-Z_]* .data..L* .data..compoundliteral* +#define DATA_MAIN .data .data.[0-9a-zA-Z_]* .data..L* .data..compoundliteral* .data.$__unnamed_* #define SDATA_MAIN .sdata .sdata.[0-9a-zA-Z_]* #define RODATA_MAIN .rodata .rodata.[0-9a-zA-Z_]* .rodata..L*
#define BSS_MAIN .bss .bss.[0-9a-zA-Z_]* .bss..compoundliteral*
2.30.0
Now, after that all the sections are explicitly described and declared in vmlinux.lds.S, we can enable ld orphan warnings to prevent from missing any new sections in future.
Signed-off-by: Alexander Lobakin alobakin@pm.me Reviewed-by: Kees Cook keescook@chromium.org Reviewed-by: Nathan Chancellor natechancellor@gmail.com --- arch/mips/Kconfig | 1 + 1 file changed, 1 insertion(+)
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index d68df1febd25..d3e64cc0932b 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig @@ -18,6 +18,7 @@ config MIPS select ARCH_USE_QUEUED_SPINLOCKS select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT if MMU select ARCH_WANT_IPC_PARSE_VERSION + select ARCH_WANT_LD_ORPHAN_WARN select BUILDTIME_TABLE_SORT select CLONE_BACKWARDS select CPU_NO_EFFICIENT_FFS if (TARGET_ISA_REV < 1)
On Sun, Jan 10, 2021 at 11:53:50AM +0000, Alexander Lobakin wrote:
This series hunts the problems discovered after manual enabling of ARCH_WANT_LD_ORPHAN_WARN. Notably:
- adds the missing PAGE_ALIGNED_DATA() section affecting VDSO placement (marked for stable);
- stops blind catching of orphan text sections with .text.* directive;
- properly stops .eh_frame section generation.
Compile and runtime tested on MIPS32R2 CPS board with no issues using two different toolkits:
- Binutils 2.35.1, GCC 10.2.1 (with Alpine patches);
- LLVM stack: 11.0.0 and from latest Git snapshot.
Since v4 [3]:
- new: drop redundant .text.cps-vec creation and blind inclusion of orphan text sections via .text.* directive in vmlinux.lds.S;
- don't assert SIZEOF(.rel.dyn) as it's reported that it may be not empty on certain machines and compilers (Thomas);
- align GOT table like it's done for ARM64;
- new: catch UBSAN's "unnamed data" sections in generic definitions when building with LD_DEAD_CODE_DATA_ELIMINATION;
- collect Reviewed-bys (Kees, Nathan).
Looks good; which tree will this land through?
-Kees
Since v3 [2]:
- fix the third patch as GNU stack emits .rel.dyn into VDSO for some reason if .cfi_sections is specified.
Since v2 [1]:
- stop discarding .eh_frame and just prevent it from generating (Kees);
- drop redundant sections assertions (Fangrui);
- place GOT table in .text instead of asserting as it's not empty when building with LLVM (Nathan);
- catch compound literals in generic definitions when building with LD_DEAD_CODE_DATA_ELIMINATION (Kees);
- collect two Reviewed-bys (Kees).
Since v1 [0]:
- catch .got entries too as LLD may produce it (Nathan);
- check for unwanted sections to be zero-sized instead of discarding (Fangrui).
[0] https://lore.kernel.org/linux-mips/20210104121729.46981-1-alobakin@pm.me [1] https://lore.kernel.org/linux-mips/20210106200713.31840-1-alobakin@pm.me [2] https://lore.kernel.org/linux-mips/20210107115120.281008-1-alobakin@pm.me [3] https://lore.kernel.org/linux-mips/20210107123331.354075-1-alobakin@pm.me
Alexander Lobakin (9): MIPS: vmlinux.lds.S: add missing PAGE_ALIGNED_DATA() section MIPS: CPS: don't create redundant .text.cps-vec section MIPS: vmlinux.lds.S: add ".gnu.attributes" to DISCARDS MIPS: properly stop .eh_frame generation MIPS: vmlinux.lds.S: explicitly catch .rel.dyn symbols MIPS: vmlinux.lds.S: explicitly declare .got table vmlinux.lds.h: catch compound literals into data and BSS vmlinux.lds.h: catch UBSAN's "unnamed data" into data MIPS: select ARCH_WANT_LD_ORPHAN_WARN
arch/mips/Kconfig | 1 + arch/mips/include/asm/asm.h | 18 ++++++++++++++++++ arch/mips/kernel/cps-vec.S | 1 - arch/mips/kernel/vmlinux.lds.S | 11 +++++++++-- include/asm-generic/vmlinux.lds.h | 6 +++--- 5 files changed, 31 insertions(+), 6 deletions(-)
-- 2.30.0
From: Kees Cook keescook@chromium.org Date: Mon, 11 Jan 2021 11:53:39 -0800
On Sun, Jan 10, 2021 at 11:53:50AM +0000, Alexander Lobakin wrote:
This series hunts the problems discovered after manual enabling of ARCH_WANT_LD_ORPHAN_WARN. Notably:
- adds the missing PAGE_ALIGNED_DATA() section affecting VDSO placement (marked for stable);
- stops blind catching of orphan text sections with .text.* directive;
- properly stops .eh_frame section generation.
Compile and runtime tested on MIPS32R2 CPS board with no issues using two different toolkits:
- Binutils 2.35.1, GCC 10.2.1 (with Alpine patches);
- LLVM stack: 11.0.0 and from latest Git snapshot.
Since v4 [3]:
- new: drop redundant .text.cps-vec creation and blind inclusion of orphan text sections via .text.* directive in vmlinux.lds.S;
- don't assert SIZEOF(.rel.dyn) as it's reported that it may be not empty on certain machines and compilers (Thomas);
- align GOT table like it's done for ARM64;
- new: catch UBSAN's "unnamed data" sections in generic definitions when building with LD_DEAD_CODE_DATA_ELIMINATION;
- collect Reviewed-bys (Kees, Nathan).
Looks good; which tree will this land through?
linux-mips/mips-next I guess, since 7 of 9 patches are related only to this architecture. This might need Arnd's Acked-bys or Reviewed-by for the two that refer include/asm-generic, let's see what Thomas think.
-Kees
Since v3 [2]:
- fix the third patch as GNU stack emits .rel.dyn into VDSO for some reason if .cfi_sections is specified.
Since v2 [1]:
- stop discarding .eh_frame and just prevent it from generating (Kees);
- drop redundant sections assertions (Fangrui);
- place GOT table in .text instead of asserting as it's not empty when building with LLVM (Nathan);
- catch compound literals in generic definitions when building with LD_DEAD_CODE_DATA_ELIMINATION (Kees);
- collect two Reviewed-bys (Kees).
Since v1 [0]:
- catch .got entries too as LLD may produce it (Nathan);
- check for unwanted sections to be zero-sized instead of discarding (Fangrui).
[0] https://lore.kernel.org/linux-mips/20210104121729.46981-1-alobakin@pm.me [1] https://lore.kernel.org/linux-mips/20210106200713.31840-1-alobakin@pm.me [2] https://lore.kernel.org/linux-mips/20210107115120.281008-1-alobakin@pm.me [3] https://lore.kernel.org/linux-mips/20210107123331.354075-1-alobakin@pm.me
Alexander Lobakin (9): MIPS: vmlinux.lds.S: add missing PAGE_ALIGNED_DATA() section MIPS: CPS: don't create redundant .text.cps-vec section MIPS: vmlinux.lds.S: add ".gnu.attributes" to DISCARDS MIPS: properly stop .eh_frame generation MIPS: vmlinux.lds.S: explicitly catch .rel.dyn symbols MIPS: vmlinux.lds.S: explicitly declare .got table vmlinux.lds.h: catch compound literals into data and BSS vmlinux.lds.h: catch UBSAN's "unnamed data" into data MIPS: select ARCH_WANT_LD_ORPHAN_WARN
arch/mips/Kconfig | 1 + arch/mips/include/asm/asm.h | 18 ++++++++++++++++++ arch/mips/kernel/cps-vec.S | 1 - arch/mips/kernel/vmlinux.lds.S | 11 +++++++++-- include/asm-generic/vmlinux.lds.h | 6 +++--- 5 files changed, 31 insertions(+), 6 deletions(-)
-- 2.30.0
-- Kees Cook
Al
On Mon, Jan 11, 2021 at 08:57:25PM +0000, Alexander Lobakin wrote:
From: Kees Cook keescook@chromium.org Date: Mon, 11 Jan 2021 11:53:39 -0800
On Sun, Jan 10, 2021 at 11:53:50AM +0000, Alexander Lobakin wrote:
This series hunts the problems discovered after manual enabling of ARCH_WANT_LD_ORPHAN_WARN. Notably:
- adds the missing PAGE_ALIGNED_DATA() section affecting VDSO placement (marked for stable);
- stops blind catching of orphan text sections with .text.* directive;
- properly stops .eh_frame section generation.
Compile and runtime tested on MIPS32R2 CPS board with no issues using two different toolkits:
- Binutils 2.35.1, GCC 10.2.1 (with Alpine patches);
- LLVM stack: 11.0.0 and from latest Git snapshot.
Since v4 [3]:
- new: drop redundant .text.cps-vec creation and blind inclusion of orphan text sections via .text.* directive in vmlinux.lds.S;
- don't assert SIZEOF(.rel.dyn) as it's reported that it may be not empty on certain machines and compilers (Thomas);
- align GOT table like it's done for ARM64;
- new: catch UBSAN's "unnamed data" sections in generic definitions when building with LD_DEAD_CODE_DATA_ELIMINATION;
- collect Reviewed-bys (Kees, Nathan).
Looks good; which tree will this land through?
linux-mips/mips-next I guess, since 7 of 9 patches are related only to this architecture. This might need Arnd's Acked-bys or Reviewed-by for the two that refer include/asm-generic, let's see what Thomas think.
Looks good from my side and I have it already sitting in branch for submission.
Arnd, are you ok with the changes in include/asm-generic ?
Thomas.
On Mon, Jan 11, 2021 at 11:44 PM Thomas Bogendoerfer tsbogend@alpha.franken.de wrote:
On Mon, Jan 11, 2021 at 08:57:25PM +0000, Alexander Lobakin wrote:
From: Kees Cook keescook@chromium.org Date: Mon, 11 Jan 2021 11:53:39 -0800
On Sun, Jan 10, 2021 at 11:53:50AM +0000, Alexander Lobakin wrote:
This series hunts the problems discovered after manual enabling of ARCH_WANT_LD_ORPHAN_WARN. Notably:
- adds the missing PAGE_ALIGNED_DATA() section affecting VDSO placement (marked for stable);
- stops blind catching of orphan text sections with .text.* directive;
- properly stops .eh_frame section generation.
Compile and runtime tested on MIPS32R2 CPS board with no issues using two different toolkits:
- Binutils 2.35.1, GCC 10.2.1 (with Alpine patches);
- LLVM stack: 11.0.0 and from latest Git snapshot.
Since v4 [3]:
- new: drop redundant .text.cps-vec creation and blind inclusion of orphan text sections via .text.* directive in vmlinux.lds.S;
- don't assert SIZEOF(.rel.dyn) as it's reported that it may be not empty on certain machines and compilers (Thomas);
- align GOT table like it's done for ARM64;
- new: catch UBSAN's "unnamed data" sections in generic definitions when building with LD_DEAD_CODE_DATA_ELIMINATION;
- collect Reviewed-bys (Kees, Nathan).
Looks good; which tree will this land through?
linux-mips/mips-next I guess, since 7 of 9 patches are related only to this architecture. This might need Arnd's Acked-bys or Reviewed-by for the two that refer include/asm-generic, let's see what Thomas think.
Looks good from my side and I have it already sitting in branch for submission.
Arnd, are you ok with the changes in include/asm-generic ?
Yes, I'm never quite sure about what to make of linker script changes, but I trust Kees on the review. For merging it through your tree:
Acked-by: Arnd Bergmann arnd@arndb.de
On Sun, Jan 10, 2021 at 11:53:50AM +0000, Alexander Lobakin wrote:
This series hunts the problems discovered after manual enabling of ARCH_WANT_LD_ORPHAN_WARN. Notably:
- adds the missing PAGE_ALIGNED_DATA() section affecting VDSO placement (marked for stable);
- stops blind catching of orphan text sections with .text.* directive;
- properly stops .eh_frame section generation.
Compile and runtime tested on MIPS32R2 CPS board with no issues using two different toolkits:
- Binutils 2.35.1, GCC 10.2.1 (with Alpine patches);
- LLVM stack: 11.0.0 and from latest Git snapshot.
Since v4 [3]:
- new: drop redundant .text.cps-vec creation and blind inclusion of orphan text sections via .text.* directive in vmlinux.lds.S;
- don't assert SIZEOF(.rel.dyn) as it's reported that it may be not empty on certain machines and compilers (Thomas);
- align GOT table like it's done for ARM64;
- new: catch UBSAN's "unnamed data" sections in generic definitions when building with LD_DEAD_CODE_DATA_ELIMINATION;
- collect Reviewed-bys (Kees, Nathan).
Since v3 [2]:
- fix the third patch as GNU stack emits .rel.dyn into VDSO for some reason if .cfi_sections is specified.
Since v2 [1]:
- stop discarding .eh_frame and just prevent it from generating (Kees);
- drop redundant sections assertions (Fangrui);
- place GOT table in .text instead of asserting as it's not empty when building with LLVM (Nathan);
- catch compound literals in generic definitions when building with LD_DEAD_CODE_DATA_ELIMINATION (Kees);
- collect two Reviewed-bys (Kees).
Since v1 [0]:
- catch .got entries too as LLD may produce it (Nathan);
- check for unwanted sections to be zero-sized instead of discarding (Fangrui).
[0] https://lore.kernel.org/linux-mips/20210104121729.46981-1-alobakin@pm.me [1] https://lore.kernel.org/linux-mips/20210106200713.31840-1-alobakin@pm.me [2] https://lore.kernel.org/linux-mips/20210107115120.281008-1-alobakin@pm.me [3] https://lore.kernel.org/linux-mips/20210107123331.354075-1-alobakin@pm.me
Alexander Lobakin (9): MIPS: vmlinux.lds.S: add missing PAGE_ALIGNED_DATA() section MIPS: CPS: don't create redundant .text.cps-vec section MIPS: vmlinux.lds.S: add ".gnu.attributes" to DISCARDS MIPS: properly stop .eh_frame generation MIPS: vmlinux.lds.S: explicitly catch .rel.dyn symbols MIPS: vmlinux.lds.S: explicitly declare .got table vmlinux.lds.h: catch compound literals into data and BSS vmlinux.lds.h: catch UBSAN's "unnamed data" into data MIPS: select ARCH_WANT_LD_ORPHAN_WARN
arch/mips/Kconfig | 1 + arch/mips/include/asm/asm.h | 18 ++++++++++++++++++ arch/mips/kernel/cps-vec.S | 1 - arch/mips/kernel/vmlinux.lds.S | 11 +++++++++-- include/asm-generic/vmlinux.lds.h | 6 +++--- 5 files changed, 31 insertions(+), 6 deletions(-)
applied to mips-next.
Thoomas.
linux-stable-mirror@lists.linaro.org