All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] powerpc: Keep .rela* sections when CONFIG_RELOCATABLE is defined
@ 2020-04-28 13:21 ` H.J. Lu
  0 siblings, 0 replies; 18+ messages in thread
From: H.J. Lu @ 2020-04-28 13:21 UTC (permalink / raw)
  To: linux-kernel
  Cc: Yu-cheng Yu, Arnd Bergmann, linux-arch, Michael Ellerman,
	Benjamin Herrenschmidt, Paul Mackerras, Kees Cook,
	Borislav Petkov, Naveen N . Rao, linuxppc-dev

arch/powerpc/kernel/vmlinux.lds.S has

 #ifdef CONFIG_RELOCATABLE
 ...
        .rela.dyn : AT(ADDR(.rela.dyn) - LOAD_OFFSET)
        {
                __rela_dyn_start = .;
                *(.rela*)
        }
 #endif
 ...
        DISCARDS
        /DISCARD/ : {
                *(*.EMB.apuinfo)
                *(.glink .iplt .plt .rela* .comment)
                *(.gnu.version*)
                *(.gnu.attributes)
                *(.eh_frame)
        }

Since .rela* sections are needed when CONFIG_RELOCATABLE is defined,
don't discard .rela* sections if CONFIG_RELOCATABLE is defined.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
Acked-by: Michael Ellerman <mpe@ellerman.id.au> (powerpc)
---
 arch/powerpc/kernel/vmlinux.lds.S | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/arch/powerpc/kernel/vmlinux.lds.S b/arch/powerpc/kernel/vmlinux.lds.S
index 31a0f201fb6f..4ba07734a210 100644
--- a/arch/powerpc/kernel/vmlinux.lds.S
+++ b/arch/powerpc/kernel/vmlinux.lds.S
@@ -366,9 +366,12 @@ SECTIONS
 	DISCARDS
 	/DISCARD/ : {
 		*(*.EMB.apuinfo)
-		*(.glink .iplt .plt .rela* .comment)
+		*(.glink .iplt .plt .comment)
 		*(.gnu.version*)
 		*(.gnu.attributes)
 		*(.eh_frame)
+#ifndef CONFIG_RELOCATABLE
+		*(.rela*)
+#endif
 	}
 }
-- 
2.25.4


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 1/2] powerpc: Keep .rela* sections when CONFIG_RELOCATABLE is defined
@ 2020-04-28 13:21 ` H.J. Lu
  0 siblings, 0 replies; 18+ messages in thread
From: H.J. Lu @ 2020-04-28 13:21 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-arch, Yu-cheng Yu, Kees Cook, Arnd Bergmann,
	Paul Mackerras, Naveen N . Rao, Borislav Petkov, linuxppc-dev

arch/powerpc/kernel/vmlinux.lds.S has

 #ifdef CONFIG_RELOCATABLE
 ...
        .rela.dyn : AT(ADDR(.rela.dyn) - LOAD_OFFSET)
        {
                __rela_dyn_start = .;
                *(.rela*)
        }
 #endif
 ...
        DISCARDS
        /DISCARD/ : {
                *(*.EMB.apuinfo)
                *(.glink .iplt .plt .rela* .comment)
                *(.gnu.version*)
                *(.gnu.attributes)
                *(.eh_frame)
        }

Since .rela* sections are needed when CONFIG_RELOCATABLE is defined,
don't discard .rela* sections if CONFIG_RELOCATABLE is defined.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
Acked-by: Michael Ellerman <mpe@ellerman.id.au> (powerpc)
---
 arch/powerpc/kernel/vmlinux.lds.S | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/arch/powerpc/kernel/vmlinux.lds.S b/arch/powerpc/kernel/vmlinux.lds.S
index 31a0f201fb6f..4ba07734a210 100644
--- a/arch/powerpc/kernel/vmlinux.lds.S
+++ b/arch/powerpc/kernel/vmlinux.lds.S
@@ -366,9 +366,12 @@ SECTIONS
 	DISCARDS
 	/DISCARD/ : {
 		*(*.EMB.apuinfo)
-		*(.glink .iplt .plt .rela* .comment)
+		*(.glink .iplt .plt .comment)
 		*(.gnu.version*)
 		*(.gnu.attributes)
 		*(.eh_frame)
+#ifndef CONFIG_RELOCATABLE
+		*(.rela*)
+#endif
 	}
 }
-- 
2.25.4


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 2/2] Discard .note.gnu.property sections in generic NOTES
  2020-04-28 13:21 ` H.J. Lu
@ 2020-04-28 13:21   ` H.J. Lu
  -1 siblings, 0 replies; 18+ messages in thread
From: H.J. Lu @ 2020-04-28 13:21 UTC (permalink / raw)
  To: linux-kernel
  Cc: Yu-cheng Yu, Arnd Bergmann, linux-arch, Michael Ellerman,
	Benjamin Herrenschmidt, Paul Mackerras, Kees Cook,
	Borislav Petkov, Naveen N . Rao, linuxppc-dev

With the command-line option, -mx86-used-note=yes, the x86 assembler
in binutils 2.32 and above generates a program property note in a note
section, .note.gnu.property, to encode used x86 ISAs and features.  But
kernel linker script only contains a single NOTE segment:

PHDRS {
 text PT_LOAD FLAGS(5);
 data PT_LOAD FLAGS(6);
 percpu PT_LOAD FLAGS(6);
 init PT_LOAD FLAGS(7);
 note PT_NOTE FLAGS(0);
}
SECTIONS
{
...
 .notes : AT(ADDR(.notes) - 0xffffffff80000000) { __start_notes = .; KEEP(*(.not
e.*)) __stop_notes = .; } :text :note
...
}

The NOTE segment generated by kernel linker script is aligned to 4 bytes.
But .note.gnu.property section must be aligned to 8 bytes on x86-64 and
we get

[hjl@gnu-skx-1 linux]$ readelf -n vmlinux

Displaying notes found in: .notes
  Owner                Data size Description
  Xen                  0x00000006 Unknown note type: (0x00000006)
   description data: 6c 69 6e 75 78 00
  Xen                  0x00000004 Unknown note type: (0x00000007)
   description data: 32 2e 36 00
  xen-3.0              0x00000005 Unknown note type: (0x006e6558)
   description data: 08 00 00 00 03
readelf: Warning: note with invalid namesz and/or descsz found at offset 0x50
readelf: Warning:  type: 0xffffffff, namesize: 0x006e6558, descsize:
0x80000000, alignment: 8
[hjl@gnu-skx-1 linux]$

Since note.gnu.property section in kernel image is never used, this patch
discards .note.gnu.property sections in kernel linker script by adding

/DISCARD/ : {
  *(.note.gnu.property)
}

before kernel NOTE segment in generic NOTES.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
Reviewed-by: Kees Cook <keescook@chromium.org>
---
 include/asm-generic/vmlinux.lds.h | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
index 71e387a5fe90..95cd678428f4 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -833,7 +833,14 @@
 #define TRACEDATA
 #endif
 
+/*
+ * Discard .note.gnu.property sections which are unused and have
+ * different alignment requirement from kernel note sections.
+ */
 #define NOTES								\
+	/DISCARD/ : {							\
+		*(.note.gnu.property)					\
+	}								\
 	.notes : AT(ADDR(.notes) - LOAD_OFFSET) {			\
 		__start_notes = .;					\
 		KEEP(*(.note.*))					\
-- 
2.25.4


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 2/2] Discard .note.gnu.property sections in generic NOTES
@ 2020-04-28 13:21   ` H.J. Lu
  0 siblings, 0 replies; 18+ messages in thread
From: H.J. Lu @ 2020-04-28 13:21 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-arch, Yu-cheng Yu, Kees Cook, Arnd Bergmann,
	Paul Mackerras, Naveen N . Rao, Borislav Petkov, linuxppc-dev

With the command-line option, -mx86-used-note=yes, the x86 assembler
in binutils 2.32 and above generates a program property note in a note
section, .note.gnu.property, to encode used x86 ISAs and features.  But
kernel linker script only contains a single NOTE segment:

PHDRS {
 text PT_LOAD FLAGS(5);
 data PT_LOAD FLAGS(6);
 percpu PT_LOAD FLAGS(6);
 init PT_LOAD FLAGS(7);
 note PT_NOTE FLAGS(0);
}
SECTIONS
{
...
 .notes : AT(ADDR(.notes) - 0xffffffff80000000) { __start_notes = .; KEEP(*(.not
e.*)) __stop_notes = .; } :text :note
...
}

The NOTE segment generated by kernel linker script is aligned to 4 bytes.
But .note.gnu.property section must be aligned to 8 bytes on x86-64 and
we get

[hjl@gnu-skx-1 linux]$ readelf -n vmlinux

Displaying notes found in: .notes
  Owner                Data size Description
  Xen                  0x00000006 Unknown note type: (0x00000006)
   description data: 6c 69 6e 75 78 00
  Xen                  0x00000004 Unknown note type: (0x00000007)
   description data: 32 2e 36 00
  xen-3.0              0x00000005 Unknown note type: (0x006e6558)
   description data: 08 00 00 00 03
readelf: Warning: note with invalid namesz and/or descsz found at offset 0x50
readelf: Warning:  type: 0xffffffff, namesize: 0x006e6558, descsize:
0x80000000, alignment: 8
[hjl@gnu-skx-1 linux]$

Since note.gnu.property section in kernel image is never used, this patch
discards .note.gnu.property sections in kernel linker script by adding

/DISCARD/ : {
  *(.note.gnu.property)
}

before kernel NOTE segment in generic NOTES.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
Reviewed-by: Kees Cook <keescook@chromium.org>
---
 include/asm-generic/vmlinux.lds.h | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
index 71e387a5fe90..95cd678428f4 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -833,7 +833,14 @@
 #define TRACEDATA
 #endif
 
+/*
+ * Discard .note.gnu.property sections which are unused and have
+ * different alignment requirement from kernel note sections.
+ */
 #define NOTES								\
+	/DISCARD/ : {							\
+		*(.note.gnu.property)					\
+	}								\
 	.notes : AT(ADDR(.notes) - LOAD_OFFSET) {			\
 		__start_notes = .;					\
 		KEEP(*(.note.*))					\
-- 
2.25.4


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* Re: [PATCH 2/2] Discard .note.gnu.property sections in generic NOTES
  2020-04-28 13:21   ` H.J. Lu
@ 2022-09-16 19:40     ` Omar Sandoval
  -1 siblings, 0 replies; 18+ messages in thread
From: Omar Sandoval @ 2022-09-16 19:40 UTC (permalink / raw)
  To: H.J. Lu
  Cc: linux-kernel, Yu-cheng Yu, Arnd Bergmann, linux-arch,
	Michael Ellerman, Benjamin Herrenschmidt, Paul Mackerras,
	Kees Cook, Borislav Petkov, Naveen N . Rao, linuxppc-dev

On Tue, Apr 28, 2020 at 06:21:05AM -0700, H.J. Lu wrote:
> With the command-line option, -mx86-used-note=yes, the x86 assembler
> in binutils 2.32 and above generates a program property note in a note
> section, .note.gnu.property, to encode used x86 ISAs and features.  But
> kernel linker script only contains a single NOTE segment:
> 
> PHDRS {
>  text PT_LOAD FLAGS(5);
>  data PT_LOAD FLAGS(6);
>  percpu PT_LOAD FLAGS(6);
>  init PT_LOAD FLAGS(7);
>  note PT_NOTE FLAGS(0);
> }
> SECTIONS
> {
> ...
>  .notes : AT(ADDR(.notes) - 0xffffffff80000000) { __start_notes = .; KEEP(*(.not
> e.*)) __stop_notes = .; } :text :note
> ...
> }
> 
> The NOTE segment generated by kernel linker script is aligned to 4 bytes.
> But .note.gnu.property section must be aligned to 8 bytes on x86-64 and
> we get
> 
> [hjl@gnu-skx-1 linux]$ readelf -n vmlinux
> 
> Displaying notes found in: .notes
>   Owner                Data size Description
>   Xen                  0x00000006 Unknown note type: (0x00000006)
>    description data: 6c 69 6e 75 78 00
>   Xen                  0x00000004 Unknown note type: (0x00000007)
>    description data: 32 2e 36 00
>   xen-3.0              0x00000005 Unknown note type: (0x006e6558)
>    description data: 08 00 00 00 03
> readelf: Warning: note with invalid namesz and/or descsz found at offset 0x50
> readelf: Warning:  type: 0xffffffff, namesize: 0x006e6558, descsize:
> 0x80000000, alignment: 8
> [hjl@gnu-skx-1 linux]$
> 
> Since note.gnu.property section in kernel image is never used, this patch
> discards .note.gnu.property sections in kernel linker script by adding
> 
> /DISCARD/ : {
>   *(.note.gnu.property)
> }
> 
> before kernel NOTE segment in generic NOTES.
> 
> Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
> Reviewed-by: Kees Cook <keescook@chromium.org>
> ---
>  include/asm-generic/vmlinux.lds.h | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
> index 71e387a5fe90..95cd678428f4 100644
> --- a/include/asm-generic/vmlinux.lds.h
> +++ b/include/asm-generic/vmlinux.lds.h
> @@ -833,7 +833,14 @@
>  #define TRACEDATA
>  #endif
>  
> +/*
> + * Discard .note.gnu.property sections which are unused and have
> + * different alignment requirement from kernel note sections.
> + */
>  #define NOTES								\
> +	/DISCARD/ : {							\
> +		*(.note.gnu.property)					\
> +	}								\
>  	.notes : AT(ADDR(.notes) - LOAD_OFFSET) {			\
>  		__start_notes = .;					\
>  		KEEP(*(.note.*))					\
> -- 
> 2.25.4
> 

Hi, H.J.,

I recently ran into this same .notes corruption when building kernels on
Arch Linux.

What ended up happening to this patch? It doesn't appear to have been
merged, and I couldn't find any further discussion about it. I'm happy
to resend it for you if you need a hand.

Thanks,
Omar

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 2/2] Discard .note.gnu.property sections in generic NOTES
@ 2022-09-16 19:40     ` Omar Sandoval
  0 siblings, 0 replies; 18+ messages in thread
From: Omar Sandoval @ 2022-09-16 19:40 UTC (permalink / raw)
  To: H.J. Lu
  Cc: linux-arch, Yu-cheng Yu, Kees Cook, Arnd Bergmann, linux-kernel,
	Paul Mackerras, Naveen N . Rao, Borislav Petkov, linuxppc-dev

On Tue, Apr 28, 2020 at 06:21:05AM -0700, H.J. Lu wrote:
> With the command-line option, -mx86-used-note=yes, the x86 assembler
> in binutils 2.32 and above generates a program property note in a note
> section, .note.gnu.property, to encode used x86 ISAs and features.  But
> kernel linker script only contains a single NOTE segment:
> 
> PHDRS {
>  text PT_LOAD FLAGS(5);
>  data PT_LOAD FLAGS(6);
>  percpu PT_LOAD FLAGS(6);
>  init PT_LOAD FLAGS(7);
>  note PT_NOTE FLAGS(0);
> }
> SECTIONS
> {
> ...
>  .notes : AT(ADDR(.notes) - 0xffffffff80000000) { __start_notes = .; KEEP(*(.not
> e.*)) __stop_notes = .; } :text :note
> ...
> }
> 
> The NOTE segment generated by kernel linker script is aligned to 4 bytes.
> But .note.gnu.property section must be aligned to 8 bytes on x86-64 and
> we get
> 
> [hjl@gnu-skx-1 linux]$ readelf -n vmlinux
> 
> Displaying notes found in: .notes
>   Owner                Data size Description
>   Xen                  0x00000006 Unknown note type: (0x00000006)
>    description data: 6c 69 6e 75 78 00
>   Xen                  0x00000004 Unknown note type: (0x00000007)
>    description data: 32 2e 36 00
>   xen-3.0              0x00000005 Unknown note type: (0x006e6558)
>    description data: 08 00 00 00 03
> readelf: Warning: note with invalid namesz and/or descsz found at offset 0x50
> readelf: Warning:  type: 0xffffffff, namesize: 0x006e6558, descsize:
> 0x80000000, alignment: 8
> [hjl@gnu-skx-1 linux]$
> 
> Since note.gnu.property section in kernel image is never used, this patch
> discards .note.gnu.property sections in kernel linker script by adding
> 
> /DISCARD/ : {
>   *(.note.gnu.property)
> }
> 
> before kernel NOTE segment in generic NOTES.
> 
> Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
> Reviewed-by: Kees Cook <keescook@chromium.org>
> ---
>  include/asm-generic/vmlinux.lds.h | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
> index 71e387a5fe90..95cd678428f4 100644
> --- a/include/asm-generic/vmlinux.lds.h
> +++ b/include/asm-generic/vmlinux.lds.h
> @@ -833,7 +833,14 @@
>  #define TRACEDATA
>  #endif
>  
> +/*
> + * Discard .note.gnu.property sections which are unused and have
> + * different alignment requirement from kernel note sections.
> + */
>  #define NOTES								\
> +	/DISCARD/ : {							\
> +		*(.note.gnu.property)					\
> +	}								\
>  	.notes : AT(ADDR(.notes) - LOAD_OFFSET) {			\
>  		__start_notes = .;					\
>  		KEEP(*(.note.*))					\
> -- 
> 2.25.4
> 

Hi, H.J.,

I recently ran into this same .notes corruption when building kernels on
Arch Linux.

What ended up happening to this patch? It doesn't appear to have been
merged, and I couldn't find any further discussion about it. I'm happy
to resend it for you if you need a hand.

Thanks,
Omar

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 2/2] Discard .note.gnu.property sections in generic NOTES
  2022-09-16 19:40     ` Omar Sandoval
  (?)
@ 2022-09-17  6:31     ` Christophe Leroy
  2022-09-19 17:26         ` Omar Sandoval
  -1 siblings, 1 reply; 18+ messages in thread
From: Christophe Leroy @ 2022-09-17  6:31 UTC (permalink / raw)
  To: Omar Sandoval, H.J. Lu
  Cc: linux-arch, Yu-cheng Yu, Kees Cook, Arnd Bergmann, linux-kernel,
	Paul Mackerras, Naveen N . Rao, Borislav Petkov, linuxppc-dev



Le 16/09/2022 à 21:40, Omar Sandoval a écrit :
> [Vous ne recevez pas souvent de courriers de osandov@osandov.com. D?couvrez pourquoi ceci est important ? https://aka.ms/LearnAboutSenderIdentification ]
> 
> On Tue, Apr 28, 2020 at 06:21:05AM -0700, H.J. Lu wrote:
>> With the command-line option, -mx86-used-note=yes, the x86 assembler
>> in binutils 2.32 and above generates a program property note in a note
>> section, .note.gnu.property, to encode used x86 ISAs and features.  But
>> kernel linker script only contains a single NOTE segment:
>>
>> PHDRS {
>>   text PT_LOAD FLAGS(5);
>>   data PT_LOAD FLAGS(6);
>>   percpu PT_LOAD FLAGS(6);
>>   init PT_LOAD FLAGS(7);
>>   note PT_NOTE FLAGS(0);
>> }
>> SECTIONS
>> {
>> ...
>>   .notes : AT(ADDR(.notes) - 0xffffffff80000000) { __start_notes = .; KEEP(*(.not
>> e.*)) __stop_notes = .; } :text :note
>> ...
>> }
>>
>> The NOTE segment generated by kernel linker script is aligned to 4 bytes.
>> But .note.gnu.property section must be aligned to 8 bytes on x86-64 and
>> we get
>>
>> [hjl@gnu-skx-1 linux]$ readelf -n vmlinux
>>
>> Displaying notes found in: .notes
>>    Owner                Data size Description
>>    Xen                  0x00000006 Unknown note type: (0x00000006)
>>     description data: 6c 69 6e 75 78 00
>>    Xen                  0x00000004 Unknown note type: (0x00000007)
>>     description data: 32 2e 36 00
>>    xen-3.0              0x00000005 Unknown note type: (0x006e6558)
>>     description data: 08 00 00 00 03
>> readelf: Warning: note with invalid namesz and/or descsz found at offset 0x50
>> readelf: Warning:  type: 0xffffffff, namesize: 0x006e6558, descsize:
>> 0x80000000, alignment: 8
>> [hjl@gnu-skx-1 linux]$
>>
>> Since note.gnu.property section in kernel image is never used, this patch
>> discards .note.gnu.property sections in kernel linker script by adding
>>
>> /DISCARD/ : {
>>    *(.note.gnu.property)
>> }
>>
>> before kernel NOTE segment in generic NOTES.
>>
>> Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
>> Reviewed-by: Kees Cook <keescook@chromium.org>
>> ---
>>   include/asm-generic/vmlinux.lds.h | 7 +++++++
>>   1 file changed, 7 insertions(+)
>>
>> diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
>> index 71e387a5fe90..95cd678428f4 100644
>> --- a/include/asm-generic/vmlinux.lds.h
>> +++ b/include/asm-generic/vmlinux.lds.h
>> @@ -833,7 +833,14 @@
>>   #define TRACEDATA
>>   #endif
>>
>> +/*
>> + * Discard .note.gnu.property sections which are unused and have
>> + * different alignment requirement from kernel note sections.
>> + */
>>   #define NOTES                                                                \
>> +     /DISCARD/ : {                                                   \
>> +             *(.note.gnu.property)                                   \
>> +     }                                                               \
>>        .notes : AT(ADDR(.notes) - LOAD_OFFSET) {                       \
>>                __start_notes = .;                                      \
>>                KEEP(*(.note.*))                                        \
>> --
>> 2.25.4
>>
> 
> Hi, H.J.,
> 
> I recently ran into this same .notes corruption when building kernels on
> Arch Linux.
> 
> What ended up happening to this patch? It doesn't appear to have been
> merged, and I couldn't find any further discussion about it. I'm happy
> to resend it for you if you need a hand.

As far as I can see, ARM64 is doing something with that section, see 
arch/arm64/include/asm/assembler.h

Instead of discarding that section, would it be enough to force 
alignment of .notes to 8 bytes ?

Thanks
Christophe


> 
> Thanks,
> Omar

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 2/2] Discard .note.gnu.property sections in generic NOTES
  2022-09-17  6:31     ` Christophe Leroy
@ 2022-09-19 17:26         ` Omar Sandoval
  0 siblings, 0 replies; 18+ messages in thread
From: Omar Sandoval @ 2022-09-19 17:26 UTC (permalink / raw)
  To: Christophe Leroy, Mark Brown
  Cc: H.J. Lu, linux-arch, Yu-cheng Yu, Kees Cook, Arnd Bergmann,
	linux-kernel, Paul Mackerras, Naveen N . Rao, Borislav Petkov,
	linuxppc-dev

On Sat, Sep 17, 2022 at 06:31:20AM +0000, Christophe Leroy wrote:
> 
> 
> Le 16/09/2022 à 21:40, Omar Sandoval a écrit :
> > [Vous ne recevez pas souvent de courriers de osandov@osandov.com. D?couvrez pourquoi ceci est important ? https://aka.ms/LearnAboutSenderIdentification ]
> > 
> > On Tue, Apr 28, 2020 at 06:21:05AM -0700, H.J. Lu wrote:
> >> With the command-line option, -mx86-used-note=yes, the x86 assembler
> >> in binutils 2.32 and above generates a program property note in a note
> >> section, .note.gnu.property, to encode used x86 ISAs and features.  But
> >> kernel linker script only contains a single NOTE segment:
> >>
> >> PHDRS {
> >>   text PT_LOAD FLAGS(5);
> >>   data PT_LOAD FLAGS(6);
> >>   percpu PT_LOAD FLAGS(6);
> >>   init PT_LOAD FLAGS(7);
> >>   note PT_NOTE FLAGS(0);
> >> }
> >> SECTIONS
> >> {
> >> ...
> >>   .notes : AT(ADDR(.notes) - 0xffffffff80000000) { __start_notes = .; KEEP(*(.not
> >> e.*)) __stop_notes = .; } :text :note
> >> ...
> >> }
> >>
> >> The NOTE segment generated by kernel linker script is aligned to 4 bytes.
> >> But .note.gnu.property section must be aligned to 8 bytes on x86-64 and
> >> we get
> >>
> >> [hjl@gnu-skx-1 linux]$ readelf -n vmlinux
> >>
> >> Displaying notes found in: .notes
> >>    Owner                Data size Description
> >>    Xen                  0x00000006 Unknown note type: (0x00000006)
> >>     description data: 6c 69 6e 75 78 00
> >>    Xen                  0x00000004 Unknown note type: (0x00000007)
> >>     description data: 32 2e 36 00
> >>    xen-3.0              0x00000005 Unknown note type: (0x006e6558)
> >>     description data: 08 00 00 00 03
> >> readelf: Warning: note with invalid namesz and/or descsz found at offset 0x50
> >> readelf: Warning:  type: 0xffffffff, namesize: 0x006e6558, descsize:
> >> 0x80000000, alignment: 8
> >> [hjl@gnu-skx-1 linux]$
> >>
> >> Since note.gnu.property section in kernel image is never used, this patch
> >> discards .note.gnu.property sections in kernel linker script by adding
> >>
> >> /DISCARD/ : {
> >>    *(.note.gnu.property)
> >> }
> >>
> >> before kernel NOTE segment in generic NOTES.
> >>
> >> Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
> >> Reviewed-by: Kees Cook <keescook@chromium.org>
> >> ---
> >>   include/asm-generic/vmlinux.lds.h | 7 +++++++
> >>   1 file changed, 7 insertions(+)
> >>
> >> diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
> >> index 71e387a5fe90..95cd678428f4 100644
> >> --- a/include/asm-generic/vmlinux.lds.h
> >> +++ b/include/asm-generic/vmlinux.lds.h
> >> @@ -833,7 +833,14 @@
> >>   #define TRACEDATA
> >>   #endif
> >>
> >> +/*
> >> + * Discard .note.gnu.property sections which are unused and have
> >> + * different alignment requirement from kernel note sections.
> >> + */
> >>   #define NOTES                                                                \
> >> +     /DISCARD/ : {                                                   \
> >> +             *(.note.gnu.property)                                   \
> >> +     }                                                               \
> >>        .notes : AT(ADDR(.notes) - LOAD_OFFSET) {                       \
> >>                __start_notes = .;                                      \
> >>                KEEP(*(.note.*))                                        \
> >> --
> >> 2.25.4
> >>
> > 
> > Hi, H.J.,
> > 
> > I recently ran into this same .notes corruption when building kernels on
> > Arch Linux.
> > 
> > What ended up happening to this patch? It doesn't appear to have been
> > merged, and I couldn't find any further discussion about it. I'm happy
> > to resend it for you if you need a hand.
> 
> As far as I can see, ARM64 is doing something with that section, see 
> arch/arm64/include/asm/assembler.h
> 
> Instead of discarding that section, would it be enough to force 
> alignment of .notes to 8 bytes ?
> 
> Thanks
> Christophe

Unfortunately, "alignment requirement" here isn't just the starting
alignment of the .notes section; it also refers to internal padding in
the note metadata to keep things aligned. Changing this would break
anyone who parses /sys/kernel/notes (e.g., perf).

Here is a little more context around this mess:

The System V gABI [1] says that the note header and descriptor should be
aligned to 4 bytes for 32-bit files and 8 bytes for 64-bit files.
However, Linux never followed this, and 4-byte alignment is used for
both 32-bit and 64-bit files; see elf(5) [2].

The only exception as of 2022 is
.note.gnu.property/NT_GNU_PROPERTY_TYPE_0, which is defined to follow
the gABI alignment. There was a long thread discussing this back in 2018
with the subject "PT_NOTE alignment, NT_GNU_PROPERTY_TYPE_0, glibc and
gold" [3].

According to the gABI Linux Extensions [4], consumers are now supposed
to use the p_align of the PT_NOTE segment instead of assuming an
alignment.

There are a few issues with this for the kernel:

* The vmlinux linker script squishes together all of the notes sections
  with different alignments without adjusting their internal padding,
  but sets p_align to the maximum required alignment. This is what
  confuses readelf and co: they expect 8-byte alignment, but most of the
  note entries are only padded for 4-byte alignment.
* The vmlinux .notes section is exported as /sys/kernel/notes. This is
  stable ABI and has always had 4-byte alignment; all existing parsers
  assume this.
* /sys/kernel/notes doesn't currently have a way to specify an alternate
  alignment anyways.

My suggestion would be to keep .note.gnu.property in its own section in
vmlinux, or create a new .notes8 section with 8-byte alignment, and
leave .notes and /sys/kernel/notes alone.

I'm not sure what exactly arch/arm64/include/asm/assembler.h is doing
with this file. Perhaps the author, Mark Brown, can clarify?

1: http://www.sco.com/developers/gabi/latest/ch5.pheader.html#note_section
2: https://man7.org/linux/man-pages/man5/elf.5.html#:~:text=Notes%20(Nhdr)
3: https://public-inbox.org/libc-alpha/13a92cb0-a993-f684-9a96-e02e4afb1bef@redhat.com/
4: https://gitlab.com/x86-psABIs/Linux-ABI

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 2/2] Discard .note.gnu.property sections in generic NOTES
@ 2022-09-19 17:26         ` Omar Sandoval
  0 siblings, 0 replies; 18+ messages in thread
From: Omar Sandoval @ 2022-09-19 17:26 UTC (permalink / raw)
  To: Christophe Leroy, Mark Brown
  Cc: linux-arch, H.J. Lu, Yu-cheng Yu, Kees Cook, Arnd Bergmann,
	linux-kernel, Paul Mackerras, Naveen N . Rao, Borislav Petkov,
	linuxppc-dev

On Sat, Sep 17, 2022 at 06:31:20AM +0000, Christophe Leroy wrote:
> 
> 
> Le 16/09/2022 à 21:40, Omar Sandoval a écrit :
> > [Vous ne recevez pas souvent de courriers de osandov@osandov.com. D?couvrez pourquoi ceci est important ? https://aka.ms/LearnAboutSenderIdentification ]
> > 
> > On Tue, Apr 28, 2020 at 06:21:05AM -0700, H.J. Lu wrote:
> >> With the command-line option, -mx86-used-note=yes, the x86 assembler
> >> in binutils 2.32 and above generates a program property note in a note
> >> section, .note.gnu.property, to encode used x86 ISAs and features.  But
> >> kernel linker script only contains a single NOTE segment:
> >>
> >> PHDRS {
> >>   text PT_LOAD FLAGS(5);
> >>   data PT_LOAD FLAGS(6);
> >>   percpu PT_LOAD FLAGS(6);
> >>   init PT_LOAD FLAGS(7);
> >>   note PT_NOTE FLAGS(0);
> >> }
> >> SECTIONS
> >> {
> >> ...
> >>   .notes : AT(ADDR(.notes) - 0xffffffff80000000) { __start_notes = .; KEEP(*(.not
> >> e.*)) __stop_notes = .; } :text :note
> >> ...
> >> }
> >>
> >> The NOTE segment generated by kernel linker script is aligned to 4 bytes.
> >> But .note.gnu.property section must be aligned to 8 bytes on x86-64 and
> >> we get
> >>
> >> [hjl@gnu-skx-1 linux]$ readelf -n vmlinux
> >>
> >> Displaying notes found in: .notes
> >>    Owner                Data size Description
> >>    Xen                  0x00000006 Unknown note type: (0x00000006)
> >>     description data: 6c 69 6e 75 78 00
> >>    Xen                  0x00000004 Unknown note type: (0x00000007)
> >>     description data: 32 2e 36 00
> >>    xen-3.0              0x00000005 Unknown note type: (0x006e6558)
> >>     description data: 08 00 00 00 03
> >> readelf: Warning: note with invalid namesz and/or descsz found at offset 0x50
> >> readelf: Warning:  type: 0xffffffff, namesize: 0x006e6558, descsize:
> >> 0x80000000, alignment: 8
> >> [hjl@gnu-skx-1 linux]$
> >>
> >> Since note.gnu.property section in kernel image is never used, this patch
> >> discards .note.gnu.property sections in kernel linker script by adding
> >>
> >> /DISCARD/ : {
> >>    *(.note.gnu.property)
> >> }
> >>
> >> before kernel NOTE segment in generic NOTES.
> >>
> >> Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
> >> Reviewed-by: Kees Cook <keescook@chromium.org>
> >> ---
> >>   include/asm-generic/vmlinux.lds.h | 7 +++++++
> >>   1 file changed, 7 insertions(+)
> >>
> >> diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
> >> index 71e387a5fe90..95cd678428f4 100644
> >> --- a/include/asm-generic/vmlinux.lds.h
> >> +++ b/include/asm-generic/vmlinux.lds.h
> >> @@ -833,7 +833,14 @@
> >>   #define TRACEDATA
> >>   #endif
> >>
> >> +/*
> >> + * Discard .note.gnu.property sections which are unused and have
> >> + * different alignment requirement from kernel note sections.
> >> + */
> >>   #define NOTES                                                                \
> >> +     /DISCARD/ : {                                                   \
> >> +             *(.note.gnu.property)                                   \
> >> +     }                                                               \
> >>        .notes : AT(ADDR(.notes) - LOAD_OFFSET) {                       \
> >>                __start_notes = .;                                      \
> >>                KEEP(*(.note.*))                                        \
> >> --
> >> 2.25.4
> >>
> > 
> > Hi, H.J.,
> > 
> > I recently ran into this same .notes corruption when building kernels on
> > Arch Linux.
> > 
> > What ended up happening to this patch? It doesn't appear to have been
> > merged, and I couldn't find any further discussion about it. I'm happy
> > to resend it for you if you need a hand.
> 
> As far as I can see, ARM64 is doing something with that section, see 
> arch/arm64/include/asm/assembler.h
> 
> Instead of discarding that section, would it be enough to force 
> alignment of .notes to 8 bytes ?
> 
> Thanks
> Christophe

Unfortunately, "alignment requirement" here isn't just the starting
alignment of the .notes section; it also refers to internal padding in
the note metadata to keep things aligned. Changing this would break
anyone who parses /sys/kernel/notes (e.g., perf).

Here is a little more context around this mess:

The System V gABI [1] says that the note header and descriptor should be
aligned to 4 bytes for 32-bit files and 8 bytes for 64-bit files.
However, Linux never followed this, and 4-byte alignment is used for
both 32-bit and 64-bit files; see elf(5) [2].

The only exception as of 2022 is
.note.gnu.property/NT_GNU_PROPERTY_TYPE_0, which is defined to follow
the gABI alignment. There was a long thread discussing this back in 2018
with the subject "PT_NOTE alignment, NT_GNU_PROPERTY_TYPE_0, glibc and
gold" [3].

According to the gABI Linux Extensions [4], consumers are now supposed
to use the p_align of the PT_NOTE segment instead of assuming an
alignment.

There are a few issues with this for the kernel:

* The vmlinux linker script squishes together all of the notes sections
  with different alignments without adjusting their internal padding,
  but sets p_align to the maximum required alignment. This is what
  confuses readelf and co: they expect 8-byte alignment, but most of the
  note entries are only padded for 4-byte alignment.
* The vmlinux .notes section is exported as /sys/kernel/notes. This is
  stable ABI and has always had 4-byte alignment; all existing parsers
  assume this.
* /sys/kernel/notes doesn't currently have a way to specify an alternate
  alignment anyways.

My suggestion would be to keep .note.gnu.property in its own section in
vmlinux, or create a new .notes8 section with 8-byte alignment, and
leave .notes and /sys/kernel/notes alone.

I'm not sure what exactly arch/arm64/include/asm/assembler.h is doing
with this file. Perhaps the author, Mark Brown, can clarify?

1: http://www.sco.com/developers/gabi/latest/ch5.pheader.html#note_section
2: https://man7.org/linux/man-pages/man5/elf.5.html#:~:text=Notes%20(Nhdr)
3: https://public-inbox.org/libc-alpha/13a92cb0-a993-f684-9a96-e02e4afb1bef@redhat.com/
4: https://gitlab.com/x86-psABIs/Linux-ABI

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 2/2] Discard .note.gnu.property sections in generic NOTES
  2022-09-19 17:26         ` Omar Sandoval
@ 2022-09-19 17:33           ` Mark Brown
  -1 siblings, 0 replies; 18+ messages in thread
From: Mark Brown @ 2022-09-19 17:33 UTC (permalink / raw)
  To: Omar Sandoval
  Cc: Christophe Leroy, H.J. Lu, linux-arch, Yu-cheng Yu, Kees Cook,
	Arnd Bergmann, linux-kernel, Paul Mackerras, Naveen N . Rao,
	Borislav Petkov, linuxppc-dev

[-- Attachment #1: Type: text/plain, Size: 693 bytes --]

On Mon, Sep 19, 2022 at 10:26:17AM -0700, Omar Sandoval wrote:

In general if you're going to CC someone into a thread please put
a note at the start of your mail explaining why, many of us get
copied on a lot of irrelevant things for no apparently reason so
if it's not immediately obvious why we were sent a mail there's
every chance it'll just be deleted.

> I'm not sure what exactly arch/arm64/include/asm/assembler.h is doing
> with this file. Perhaps the author, Mark Brown, can clarify?

I don't understand the question, what file are you talking about
here?  arch/arm64/include/asm/assembler.h is itself a file and I
couldn't find anything nearby in your mail talking about a file...

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 2/2] Discard .note.gnu.property sections in generic NOTES
@ 2022-09-19 17:33           ` Mark Brown
  0 siblings, 0 replies; 18+ messages in thread
From: Mark Brown @ 2022-09-19 17:33 UTC (permalink / raw)
  To: Omar Sandoval
  Cc: linux-arch, H.J. Lu, Yu-cheng Yu, Kees Cook, Arnd Bergmann,
	linux-kernel, Paul Mackerras, Naveen N . Rao, Borislav Petkov,
	linuxppc-dev

[-- Attachment #1: Type: text/plain, Size: 693 bytes --]

On Mon, Sep 19, 2022 at 10:26:17AM -0700, Omar Sandoval wrote:

In general if you're going to CC someone into a thread please put
a note at the start of your mail explaining why, many of us get
copied on a lot of irrelevant things for no apparently reason so
if it's not immediately obvious why we were sent a mail there's
every chance it'll just be deleted.

> I'm not sure what exactly arch/arm64/include/asm/assembler.h is doing
> with this file. Perhaps the author, Mark Brown, can clarify?

I don't understand the question, what file are you talking about
here?  arch/arm64/include/asm/assembler.h is itself a file and I
couldn't find anything nearby in your mail talking about a file...

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 2/2] Discard .note.gnu.property sections in generic NOTES
  2022-09-19 17:33           ` Mark Brown
@ 2022-09-19 17:40             ` Omar Sandoval
  -1 siblings, 0 replies; 18+ messages in thread
From: Omar Sandoval @ 2022-09-19 17:40 UTC (permalink / raw)
  To: Mark Brown
  Cc: Christophe Leroy, H.J. Lu, linux-arch, Yu-cheng Yu, Kees Cook,
	Arnd Bergmann, linux-kernel, Paul Mackerras, Naveen N . Rao,
	Borislav Petkov, linuxppc-dev

On Mon, Sep 19, 2022 at 06:33:40PM +0100, Mark Brown wrote:
> On Mon, Sep 19, 2022 at 10:26:17AM -0700, Omar Sandoval wrote:
> 
> In general if you're going to CC someone into a thread please put
> a note at the start of your mail explaining why, many of us get
> copied on a lot of irrelevant things for no apparently reason so
> if it's not immediately obvious why we were sent a mail there's
> every chance it'll just be deleted.

Sorry about that.

> > I'm not sure what exactly arch/arm64/include/asm/assembler.h is doing
> > with this file. Perhaps the author, Mark Brown, can clarify?
> 
> I don't understand the question, what file are you talking about
> here?  arch/arm64/include/asm/assembler.h is itself a file and I
> couldn't find anything nearby in your mail talking about a file...

Oops, that was a typo, I meant to say "I'm not sure what
arch/arm64/include/asm/assembler.h is doing with this *note*". To be
more explicit: does ARM64 need .note.gnu.property/NT_GNU_PROPERTY_TYPE_0
in vmlinux?

Thanks,
Omar

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 2/2] Discard .note.gnu.property sections in generic NOTES
@ 2022-09-19 17:40             ` Omar Sandoval
  0 siblings, 0 replies; 18+ messages in thread
From: Omar Sandoval @ 2022-09-19 17:40 UTC (permalink / raw)
  To: Mark Brown
  Cc: linux-arch, H.J. Lu, Yu-cheng Yu, Kees Cook, Arnd Bergmann,
	linux-kernel, Paul Mackerras, Naveen N . Rao, Borislav Petkov,
	linuxppc-dev

On Mon, Sep 19, 2022 at 06:33:40PM +0100, Mark Brown wrote:
> On Mon, Sep 19, 2022 at 10:26:17AM -0700, Omar Sandoval wrote:
> 
> In general if you're going to CC someone into a thread please put
> a note at the start of your mail explaining why, many of us get
> copied on a lot of irrelevant things for no apparently reason so
> if it's not immediately obvious why we were sent a mail there's
> every chance it'll just be deleted.

Sorry about that.

> > I'm not sure what exactly arch/arm64/include/asm/assembler.h is doing
> > with this file. Perhaps the author, Mark Brown, can clarify?
> 
> I don't understand the question, what file are you talking about
> here?  arch/arm64/include/asm/assembler.h is itself a file and I
> couldn't find anything nearby in your mail talking about a file...

Oops, that was a typo, I meant to say "I'm not sure what
arch/arm64/include/asm/assembler.h is doing with this *note*". To be
more explicit: does ARM64 need .note.gnu.property/NT_GNU_PROPERTY_TYPE_0
in vmlinux?

Thanks,
Omar

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 2/2] Discard .note.gnu.property sections in generic NOTES
  2022-09-19 17:40             ` Omar Sandoval
@ 2022-09-19 17:54               ` Mark Brown
  -1 siblings, 0 replies; 18+ messages in thread
From: Mark Brown @ 2022-09-19 17:54 UTC (permalink / raw)
  To: Omar Sandoval
  Cc: Christophe Leroy, H.J. Lu, linux-arch, Yu-cheng Yu, Kees Cook,
	Arnd Bergmann, linux-kernel, Paul Mackerras, Naveen N . Rao,
	Borislav Petkov, linuxppc-dev

[-- Attachment #1: Type: text/plain, Size: 665 bytes --]

On Mon, Sep 19, 2022 at 10:40:36AM -0700, Omar Sandoval wrote:
> On Mon, Sep 19, 2022 at 06:33:40PM +0100, Mark Brown wrote:

> > I don't understand the question, what file are you talking about
> > here?  arch/arm64/include/asm/assembler.h is itself a file and I
> > couldn't find anything nearby in your mail talking about a file...

> Oops, that was a typo, I meant to say "I'm not sure what
> arch/arm64/include/asm/assembler.h is doing with this *note*". To be
> more explicit: does ARM64 need .note.gnu.property/NT_GNU_PROPERTY_TYPE_0
> in vmlinux?

It needs it in at least the vDSO which gets built into vmlinux.
AFAIR we don't use it in normal kernel code.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 2/2] Discard .note.gnu.property sections in generic NOTES
@ 2022-09-19 17:54               ` Mark Brown
  0 siblings, 0 replies; 18+ messages in thread
From: Mark Brown @ 2022-09-19 17:54 UTC (permalink / raw)
  To: Omar Sandoval
  Cc: linux-arch, H.J. Lu, Yu-cheng Yu, Kees Cook, Arnd Bergmann,
	linux-kernel, Paul Mackerras, Naveen N . Rao, Borislav Petkov,
	linuxppc-dev

[-- Attachment #1: Type: text/plain, Size: 665 bytes --]

On Mon, Sep 19, 2022 at 10:40:36AM -0700, Omar Sandoval wrote:
> On Mon, Sep 19, 2022 at 06:33:40PM +0100, Mark Brown wrote:

> > I don't understand the question, what file are you talking about
> > here?  arch/arm64/include/asm/assembler.h is itself a file and I
> > couldn't find anything nearby in your mail talking about a file...

> Oops, that was a typo, I meant to say "I'm not sure what
> arch/arm64/include/asm/assembler.h is doing with this *note*". To be
> more explicit: does ARM64 need .note.gnu.property/NT_GNU_PROPERTY_TYPE_0
> in vmlinux?

It needs it in at least the vDSO which gets built into vmlinux.
AFAIR we don't use it in normal kernel code.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 18+ messages in thread

* [PATCH 2/2] Discard .note.gnu.property sections in generic NOTES
  2020-04-28  1:48 [PATCH 1/2] powerpc: Discard .rela* sections if CONFIG_RELOCATABLE is undefined H.J. Lu
@ 2020-04-28  1:49   ` H.J. Lu
  0 siblings, 0 replies; 18+ messages in thread
From: H.J. Lu @ 2020-04-28  1:49 UTC (permalink / raw)
  To: linux-kernel
  Cc: Yu-cheng Yu, Arnd Bergmann, linux-arch, Michael Ellerman,
	Benjamin Herrenschmidt, Paul Mackerras, Kees Cook,
	Borislav Petkov, Naveen N . Rao, linuxppc-dev

With the command-line option, -mx86-used-note=yes, the x86 assembler
in binutils 2.32 and above generates a program property note in a note
section, .note.gnu.property, to encode used x86 ISAs and features.  But
kernel linker script only contains a single NOTE segment:

PHDRS {
 text PT_LOAD FLAGS(5);
 data PT_LOAD FLAGS(6);
 percpu PT_LOAD FLAGS(6);
 init PT_LOAD FLAGS(7);
 note PT_NOTE FLAGS(0);
}
SECTIONS
{
...
 .notes : AT(ADDR(.notes) - 0xffffffff80000000) { __start_notes = .; KEEP(*(.not
e.*)) __stop_notes = .; } :text :note
...
}

The NOTE segment generated by kernel linker script is aligned to 4 bytes.
But .note.gnu.property section must be aligned to 8 bytes on x86-64 and
we get

[hjl@gnu-skx-1 linux]$ readelf -n vmlinux

Displaying notes found in: .notes
  Owner                Data size Description
  Xen                  0x00000006 Unknown note type: (0x00000006)
   description data: 6c 69 6e 75 78 00
  Xen                  0x00000004 Unknown note type: (0x00000007)
   description data: 32 2e 36 00
  xen-3.0              0x00000005 Unknown note type: (0x006e6558)
   description data: 08 00 00 00 03
readelf: Warning: note with invalid namesz and/or descsz found at offset 0x50
readelf: Warning:  type: 0xffffffff, namesize: 0x006e6558, descsize:
0x80000000, alignment: 8
[hjl@gnu-skx-1 linux]$

Since note.gnu.property section in kernel image is never used, this patch
discards .note.gnu.property sections in kernel linker script by adding

/DISCARD/ : {
  *(.note.gnu.property)
}

before kernel NOTE segment in generic NOTES.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
Reviewed-by: Kees Cook <keescook@chromium.org>
---
 include/asm-generic/vmlinux.lds.h | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
index 71e387a5fe90..95cd678428f4 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -833,7 +833,14 @@
 #define TRACEDATA
 #endif
 
+/*
+ * Discard .note.gnu.property sections which are unused and have
+ * different alignment requirement from kernel note sections.
+ */
 #define NOTES								\
+	/DISCARD/ : {							\
+		*(.note.gnu.property)					\
+	}								\
 	.notes : AT(ADDR(.notes) - LOAD_OFFSET) {			\
 		__start_notes = .;					\
 		KEEP(*(.note.*))					\
-- 
2.25.4


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 2/2] Discard .note.gnu.property sections in generic NOTES
@ 2020-04-28  1:49   ` H.J. Lu
  0 siblings, 0 replies; 18+ messages in thread
From: H.J. Lu @ 2020-04-28  1:49 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-arch, Yu-cheng Yu, Kees Cook, Arnd Bergmann,
	Paul Mackerras, Naveen N . Rao, Borislav Petkov, linuxppc-dev

With the command-line option, -mx86-used-note=yes, the x86 assembler
in binutils 2.32 and above generates a program property note in a note
section, .note.gnu.property, to encode used x86 ISAs and features.  But
kernel linker script only contains a single NOTE segment:

PHDRS {
 text PT_LOAD FLAGS(5);
 data PT_LOAD FLAGS(6);
 percpu PT_LOAD FLAGS(6);
 init PT_LOAD FLAGS(7);
 note PT_NOTE FLAGS(0);
}
SECTIONS
{
...
 .notes : AT(ADDR(.notes) - 0xffffffff80000000) { __start_notes = .; KEEP(*(.not
e.*)) __stop_notes = .; } :text :note
...
}

The NOTE segment generated by kernel linker script is aligned to 4 bytes.
But .note.gnu.property section must be aligned to 8 bytes on x86-64 and
we get

[hjl@gnu-skx-1 linux]$ readelf -n vmlinux

Displaying notes found in: .notes
  Owner                Data size Description
  Xen                  0x00000006 Unknown note type: (0x00000006)
   description data: 6c 69 6e 75 78 00
  Xen                  0x00000004 Unknown note type: (0x00000007)
   description data: 32 2e 36 00
  xen-3.0              0x00000005 Unknown note type: (0x006e6558)
   description data: 08 00 00 00 03
readelf: Warning: note with invalid namesz and/or descsz found at offset 0x50
readelf: Warning:  type: 0xffffffff, namesize: 0x006e6558, descsize:
0x80000000, alignment: 8
[hjl@gnu-skx-1 linux]$

Since note.gnu.property section in kernel image is never used, this patch
discards .note.gnu.property sections in kernel linker script by adding

/DISCARD/ : {
  *(.note.gnu.property)
}

before kernel NOTE segment in generic NOTES.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
Reviewed-by: Kees Cook <keescook@chromium.org>
---
 include/asm-generic/vmlinux.lds.h | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
index 71e387a5fe90..95cd678428f4 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -833,7 +833,14 @@
 #define TRACEDATA
 #endif
 
+/*
+ * Discard .note.gnu.property sections which are unused and have
+ * different alignment requirement from kernel note sections.
+ */
 #define NOTES								\
+	/DISCARD/ : {							\
+		*(.note.gnu.property)					\
+	}								\
 	.notes : AT(ADDR(.notes) - LOAD_OFFSET) {			\
 		__start_notes = .;					\
 		KEEP(*(.note.*))					\
-- 
2.25.4


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 2/2] Discard .note.gnu.property sections in generic NOTES
  2020-03-26 19:30 [PATCH 1/2] Add RUNTIME_DISCARD_EXIT to generic DISCARDS H.J. Lu
@ 2020-03-26 19:30 ` H.J. Lu
  0 siblings, 0 replies; 18+ messages in thread
From: H.J. Lu @ 2020-03-26 19:30 UTC (permalink / raw)
  To: linux-kernel
  Cc: Andy Lutomirski, Thomas Gleixner, Kees Cook, Thomas Lendacky,
	Sami Tolvanen, Heiko Carstens, Ingo Molnar, Borislav Petkov,
	H . Peter Anvin, x86, Arnd Bergmann, linux-arch, Yu-cheng Yu

With the command-line option, -mx86-used-note=yes, the x86 assembler
in binutils 2.32 and above generates a program property note in a note
section, .note.gnu.property, to encode used x86 ISAs and features.  But
kernel linker script only contains a single NOTE segment:

PHDRS {
 text PT_LOAD FLAGS(5);
 data PT_LOAD FLAGS(6);
 percpu PT_LOAD FLAGS(6);
 init PT_LOAD FLAGS(7);
 note PT_NOTE FLAGS(0);
}
SECTIONS
{
...
 .notes : AT(ADDR(.notes) - 0xffffffff80000000) { __start_notes = .; KEEP(*(.not
e.*)) __stop_notes = .; } :text :note
...
}

The NOTE segment generated by kernel linker script is aligned to 4 bytes.
But .note.gnu.property section must be aligned to 8 bytes on x86-64 and
we get

[hjl@gnu-skx-1 linux]$ readelf -n vmlinux

Displaying notes found in: .notes
  Owner                Data size Description
  Xen                  0x00000006 Unknown note type: (0x00000006)
   description data: 6c 69 6e 75 78 00
  Xen                  0x00000004 Unknown note type: (0x00000007)
   description data: 32 2e 36 00
  xen-3.0              0x00000005 Unknown note type: (0x006e6558)
   description data: 08 00 00 00 03
readelf: Warning: note with invalid namesz and/or descsz found at offset 0x50
readelf: Warning:  type: 0xffffffff, namesize: 0x006e6558, descsize:
0x80000000, alignment: 8
[hjl@gnu-skx-1 linux]$

Since note.gnu.property section in kernel image is never used, this patch
discards .note.gnu.property sections in kernel linker script by adding

/DISCARD/ : {
  *(.note.gnu.property)
}

before kernel NOTE segment in generic NOTES.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
Reviewed-by: Kees Cook <keescook@chromium.org>
---
 include/asm-generic/vmlinux.lds.h | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
index 6b943fb8c5fd..6659a7c07c84 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -818,7 +818,14 @@
 #define TRACEDATA
 #endif
 
+/*
+ * Discard .note.gnu.property sections which are unused and have
+ * different alignment requirement from kernel note sections.
+ */
 #define NOTES								\
+	/DISCARD/ : {							\
+		*(.note.gnu.property)					\
+	}								\
 	.notes : AT(ADDR(.notes) - LOAD_OFFSET) {			\
 		__start_notes = .;					\
 		KEEP(*(.note.*))					\
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 18+ messages in thread

end of thread, other threads:[~2022-09-19 17:54 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-28 13:21 [PATCH 1/2] powerpc: Keep .rela* sections when CONFIG_RELOCATABLE is defined H.J. Lu
2020-04-28 13:21 ` H.J. Lu
2020-04-28 13:21 ` [PATCH 2/2] Discard .note.gnu.property sections in generic NOTES H.J. Lu
2020-04-28 13:21   ` H.J. Lu
2022-09-16 19:40   ` Omar Sandoval
2022-09-16 19:40     ` Omar Sandoval
2022-09-17  6:31     ` Christophe Leroy
2022-09-19 17:26       ` Omar Sandoval
2022-09-19 17:26         ` Omar Sandoval
2022-09-19 17:33         ` Mark Brown
2022-09-19 17:33           ` Mark Brown
2022-09-19 17:40           ` Omar Sandoval
2022-09-19 17:40             ` Omar Sandoval
2022-09-19 17:54             ` Mark Brown
2022-09-19 17:54               ` Mark Brown
  -- strict thread matches above, loose matches on Subject: below --
2020-04-28  1:48 [PATCH 1/2] powerpc: Discard .rela* sections if CONFIG_RELOCATABLE is undefined H.J. Lu
2020-04-28  1:49 ` [PATCH 2/2] Discard .note.gnu.property sections in generic NOTES H.J. Lu
2020-04-28  1:49   ` H.J. Lu
2020-03-26 19:30 [PATCH 1/2] Add RUNTIME_DISCARD_EXIT to generic DISCARDS H.J. Lu
2020-03-26 19:30 ` [PATCH 2/2] Discard .note.gnu.property sections in generic NOTES H.J. Lu

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.