| From 5755a503f59c2751797ab2c5a741dbd9f1aca441 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 23 Apr 2021 13:51:59 -0700 |
| Subject: arm64/vdso: Discard .note.gnu.property sections in vDSO |
| |
| From: Bill Wendling <morbo@google.com> |
| |
| [ Upstream commit 388708028e6937f3fc5fc19aeeb847f8970f489c ] |
| |
| The arm64 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 the kernel linker script only contains a single |
| NOTE segment: |
| |
| PHDRS |
| { |
| text PT_LOAD FLAGS(5) FILEHDR PHDRS; /* PF_R|PF_X */ |
| dynamic PT_DYNAMIC FLAGS(4); /* PF_R */ |
| note PT_NOTE FLAGS(4); /* PF_R */ |
| } |
| |
| The NOTE segment generated by the vDSO linker script is aligned to 4 bytes. |
| But the .note.gnu.property section must be aligned to 8 bytes on arm64. |
| |
| $ readelf -n vdso64.so |
| |
| Displaying notes found in: .note |
| Owner Data size Description |
| Linux 0x00000004 Unknown note type: (0x00000000) |
| description data: 06 00 00 00 |
| readelf: Warning: note with invalid namesz and/or descsz found at offset 0x20 |
| readelf: Warning: type: 0x78, namesize: 0x00000100, descsize: 0x756e694c, alignment: 8 |
| |
| Since the note.gnu.property section in the vDSO is not checked by the |
| dynamic linker, discard the .note.gnu.property sections in the vDSO. |
| |
| Similar to commit 4caffe6a28d31 ("x86/vdso: Discard .note.gnu.property |
| sections in vDSO"), but for arm64. |
| |
| Signed-off-by: Bill Wendling <morbo@google.com> |
| Reviewed-by: Kees Cook <keescook@chromium.org> |
| Acked-by: Ard Biesheuvel <ardb@kernel.org> |
| Link: https://lore.kernel.org/r/20210423205159.830854-1-morbo@google.com |
| Signed-off-by: Catalin Marinas <catalin.marinas@arm.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/arm64/kernel/vdso/vdso.lds.S | 8 +++++++- |
| 1 file changed, 7 insertions(+), 1 deletion(-) |
| |
| --- a/arch/arm64/kernel/vdso/vdso.lds.S |
| +++ b/arch/arm64/kernel/vdso/vdso.lds.S |
| @@ -39,6 +39,13 @@ SECTIONS |
| .gnu.version_d : { *(.gnu.version_d) } |
| .gnu.version_r : { *(.gnu.version_r) } |
| |
| + /* |
| + * Discard .note.gnu.property sections which are unused and have |
| + * different alignment requirement from vDSO note sections. |
| + */ |
| + /DISCARD/ : { |
| + *(.note.GNU-stack .note.gnu.property) |
| + } |
| .note : { *(.note.*) } :text :note |
| |
| . = ALIGN(16); |
| @@ -59,7 +66,6 @@ SECTIONS |
| PROVIDE(end = .); |
| |
| /DISCARD/ : { |
| - *(.note.GNU-stack) |
| *(.data .data.* .gnu.linkonce.d.* .sdata*) |
| *(.bss .sbss .dynbss .dynsbss) |
| } |