2021-01-10 11:56:56

by Alexander Lobakin

[permalink] [raw]
Subject: [PATCH v5 mips-next 0/9] MIPS: vmlinux.lds.S sections fixes & cleanup

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/[email protected]
[1] https://lore.kernel.org/linux-mips/[email protected]
[2] https://lore.kernel.org/linux-mips/[email protected]
[3] https://lore.kernel.org/linux-mips/[email protected]

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



2021-01-10 11:59:00

by Alexander Lobakin

[permalink] [raw]
Subject: [PATCH v5 mips-next 1/9] MIPS: vmlinux.lds.S: add missing PAGE_ALIGNED_DATA() section

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: [email protected] # 4.4+
Signed-off-by: Alexander Lobakin <[email protected]>
Reviewed-by: Kees Cook <[email protected]>
Reviewed-by: Nathan Chancellor <[email protected]>
---
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
--
2.30.0


2021-01-10 11:59:08

by Alexander Lobakin

[permalink] [raw]
Subject: [PATCH v5 mips-next 5/9] MIPS: vmlinux.lds.S: explicitly catch .rel.dyn symbols

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/[email protected]

Reported-by: Thomas Bogendoerfer <[email protected]>
Signed-off-by: Alexander Lobakin <[email protected]>
---
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


2021-01-10 11:59:13

by Alexander Lobakin

[permalink] [raw]
Subject: [PATCH v5 mips-next 4/9] MIPS: properly stop .eh_frame generation

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 <[email protected]>
Signed-off-by: Alexander Lobakin <[email protected]>
Reviewed-by: Kees Cook <[email protected]>
Reviewed-by: Nathan Chancellor <[email protected]>
---
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)
}
}
--
2.30.0


2021-01-10 11:59:26

by Alexander Lobakin

[permalink] [raw]
Subject: [PATCH v5 mips-next 2/9] MIPS: CPS: don't create redundant .text.cps-vec section

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 <[email protected]>
---
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
--
2.30.0


2021-01-10 11:59:39

by Alexander Lobakin

[permalink] [raw]
Subject: [PATCH v5 mips-next 3/9] MIPS: vmlinux.lds.S: add ".gnu.attributes" to DISCARDS

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 <[email protected]>
Reviewed-by: Nathan Chancellor <[email protected]>
---
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)
--
2.30.0


2021-01-10 11:59:39

by Alexander Lobakin

[permalink] [raw]
Subject: [PATCH v5 mips-next 6/9] MIPS: vmlinux.lds.S: explicitly declare .got table

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 <[email protected]>
Signed-off-by: Alexander Lobakin <[email protected]>
Reviewed-by: Kees Cook <[email protected]>
Reviewed-by: Nathan Chancellor <[email protected]>
---
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 */

--
2.30.0


2021-01-10 11:59:40

by Alexander Lobakin

[permalink] [raw]
Subject: [PATCH v5 mips-next 8/9] vmlinux.lds.h: catch UBSAN's "unnamed data" into data

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 <[email protected]>
---
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


2021-01-10 12:00:44

by Alexander Lobakin

[permalink] [raw]
Subject: [PATCH v5 mips-next 7/9] vmlinux.lds.h: catch compound literals into data and BSS

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/[email protected]

Suggested-by: Sami Tolvanen <[email protected]>
Suggested-by: Kees Cook <[email protected]>
Signed-off-by: Alexander Lobakin <[email protected]>
Reviewed-by: Kees Cook <[email protected]>
Reviewed-by: Nathan Chancellor <[email protected]>
---
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
--
2.30.0


2021-01-10 12:02:08

by Alexander Lobakin

[permalink] [raw]
Subject: [PATCH v5 mips-next 9/9] MIPS: select ARCH_WANT_LD_ORPHAN_WARN

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 <[email protected]>
Reviewed-by: Kees Cook <[email protected]>
Reviewed-by: Nathan Chancellor <[email protected]>
---
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)
--
2.30.0


2021-01-11 01:30:20

by Nathan Chancellor

[permalink] [raw]
Subject: Re: [PATCH v5 mips-next 5/9] MIPS: vmlinux.lds.S: explicitly catch .rel.dyn symbols

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/[email protected]
>
> Reported-by: Thomas Bogendoerfer <[email protected]>
> Signed-off-by: Alexander Lobakin <[email protected]>

Reviewed-by: Nathan Chancellor <[email protected]>

> ---
> 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
>
>

2021-01-11 02:08:16

by Nathan Chancellor

[permalink] [raw]
Subject: Re: [PATCH v5 mips-next 8/9] vmlinux.lds.h: catch UBSAN's "unnamed data" into data

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 <[email protected]>

Reviewed-by: Nathan Chancellor <[email protected]>

> ---
> 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
>
>

2021-01-11 19:56:47

by Kees Cook

[permalink] [raw]
Subject: Re: [PATCH v5 mips-next 0/9] MIPS: vmlinux.lds.S sections fixes & cleanup

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/[email protected]
> [1] https://lore.kernel.org/linux-mips/[email protected]
> [2] https://lore.kernel.org/linux-mips/[email protected]
> [3] https://lore.kernel.org/linux-mips/[email protected]
>
> 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

2021-01-11 21:01:20

by Alexander Lobakin

[permalink] [raw]
Subject: Re: [PATCH v5 mips-next 0/9] MIPS: vmlinux.lds.S sections fixes & cleanup

From: Kees Cook <[email protected]>
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/[email protected]
>> [1] https://lore.kernel.org/linux-mips/[email protected]
>> [2] https://lore.kernel.org/linux-mips/[email protected]
>> [3] https://lore.kernel.org/linux-mips/[email protected]
>>
>> 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

2021-01-12 09:57:47

by Thomas Bogendoerfer

[permalink] [raw]
Subject: Re: [PATCH v5 mips-next 0/9] MIPS: vmlinux.lds.S sections fixes & cleanup

On Mon, Jan 11, 2021 at 08:57:25PM +0000, Alexander Lobakin wrote:
> From: Kees Cook <[email protected]>
> 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.

--
Crap can work. Given enough thrust pigs will fly, but it's not necessarily a
good idea. [ RFC1925, 2.3 ]

2021-01-15 11:19:34

by Arnd Bergmann

[permalink] [raw]
Subject: Re: [PATCH v5 mips-next 0/9] MIPS: vmlinux.lds.S sections fixes & cleanup

On Mon, Jan 11, 2021 at 11:44 PM Thomas Bogendoerfer
<[email protected]> wrote:
> On Mon, Jan 11, 2021 at 08:57:25PM +0000, Alexander Lobakin wrote:
> > From: Kees Cook <[email protected]>
> > 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 <[email protected]>

2021-01-15 14:50:15

by Thomas Bogendoerfer

[permalink] [raw]
Subject: Re: [PATCH v5 mips-next 0/9] MIPS: vmlinux.lds.S sections fixes & cleanup

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/[email protected]
> [1] https://lore.kernel.org/linux-mips/[email protected]
> [2] https://lore.kernel.org/linux-mips/[email protected]
> [3] https://lore.kernel.org/linux-mips/[email protected]
>
> 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.

--
Crap can work. Given enough thrust pigs will fly, but it's not necessarily a
good idea. [ RFC1925, 2.3 ]