Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1308725
| From | Ard Biesheuvel <ard.biesheuvel@linaro.org> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | Re: [PATCH v3 11/21] arm64: avoid R_AARCH64_ABS64 relocations for Image header fields |
| Date | 2016-01-13 19:50 +0100 |
| Message-ID | <qQyEx-3Fw-3@gated-at.bofh.it> (permalink) |
| References | <qPKy5-2SK-3@gated-at.bofh.it> <qPKHM-2Wj-23@gated-at.bofh.it> <qQybv-3tX-9@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
On 13 January 2016 at 19:12, Mark Rutland <mark.rutland@arm.com> wrote: > On Mon, Jan 11, 2016 at 02:19:04PM +0100, Ard Biesheuvel wrote: >> Unfortunately, the current way of using the linker to emit build time >> constants into the Image header will no longer work once we switch to >> the use of PIE executables. The reason is that such constants are emitted >> into the binary using R_AARCH64_ABS64 relocations, which we will resolve >> at runtime, not at build time, and the places targeted by those >> relocations will contain zeroes before that. >> >> So move back to assembly time constants or R_AARCH64_ABS32 relocations >> (which, interestingly enough, do get resolved at build time) > > To me it seems very odd that ABS64 and ABS32 are treated differently, > and it makes me somewhat uncomfortable becuase it feels like a bug. > > Do we know whether the inconsistency between ABS64 and ABS32 was > deliberate? > > I couldn't spot anything declaring a difference in the AArch64 ELF > spec, and I'm not sure where else to look. > My assumption is that PIE only defers resolving R_AARCH64_ABS64 relocations since those are the only ones that be used to refer to memory addresses >> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> >> --- >> arch/arm64/include/asm/assembler.h | 15 ++++++++ >> arch/arm64/kernel/head.S | 17 +++++++-- >> arch/arm64/kernel/image.h | 37 ++++++-------------- >> 3 files changed, 40 insertions(+), 29 deletions(-) >> >> diff --git a/arch/arm64/include/asm/assembler.h b/arch/arm64/include/asm/assembler.h >> index d8bfcc1ce923..e211af783a3d 100644 >> --- a/arch/arm64/include/asm/assembler.h >> +++ b/arch/arm64/include/asm/assembler.h >> @@ -222,4 +222,19 @@ lr .req x30 // link register >> .size __pi_##x, . - x; \ >> ENDPROC(x) >> >> + .macro le16, val >> + .byte \val & 0xff >> + .byte (\val >> 8) & 0xff >> + .endm >> + >> + .macro le32, val >> + le16 \val >> + le16 (\val >> 16) >> + .endm >> + >> + .macro le64, val >> + le32 \val >> + le32 (\val >> 32) >> + .endm >> + >> #endif /* __ASM_ASSEMBLER_H */ >> diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S >> index 350515276541..211f75e673f4 100644 >> --- a/arch/arm64/kernel/head.S >> +++ b/arch/arm64/kernel/head.S >> @@ -51,6 +51,17 @@ >> #define KERNEL_START _text >> #define KERNEL_END _end >> >> +#ifdef CONFIG_CPU_BIG_ENDIAN >> +#define __HEAD_FLAG_BE 1 >> +#else >> +#define __HEAD_FLAG_BE 0 >> +#endif >> + >> +#define __HEAD_FLAG_PAGE_SIZE ((PAGE_SHIFT - 10) / 2) >> + >> +#define __HEAD_FLAGS ((__HEAD_FLAG_BE << 0) | \ >> + (__HEAD_FLAG_PAGE_SIZE << 1)) >> + >> /* >> * Kernel startup entry point. >> * --------------------------- >> @@ -83,9 +94,9 @@ efi_head: >> b stext // branch to kernel start, magic >> .long 0 // reserved >> #endif >> - .quad _kernel_offset_le // Image load offset from start of RAM, little-endian >> - .quad _kernel_size_le // Effective size of kernel image, little-endian >> - .quad _kernel_flags_le // Informative flags, little-endian >> + le64 TEXT_OFFSET // Image load offset from start of RAM, little-endian >> + .long _kernel_size_le, 0 // Effective size of kernel image, little-endian >> + le64 __HEAD_FLAGS // Informative flags, little-endian >> .quad 0 // reserved >> .quad 0 // reserved >> .quad 0 // reserved >> diff --git a/arch/arm64/kernel/image.h b/arch/arm64/kernel/image.h >> index bc2abb8b1599..bb6b0e69d0a4 100644 >> --- a/arch/arm64/kernel/image.h >> +++ b/arch/arm64/kernel/image.h >> @@ -26,41 +26,26 @@ >> * There aren't any ELF relocations we can use to endian-swap values known only >> * at link time (e.g. the subtraction of two symbol addresses), so we must get >> * the linker to endian-swap certain values before emitting them. >> + * Note that this will not work for 64-bit values: these are resolved using >> + * R_AARCH64_ABS64 relocations, which are fixed up at runtime rather than at >> + * build time when building the PIE executable (for KASLR). >> */ >> #ifdef CONFIG_CPU_BIG_ENDIAN >> -#define DATA_LE64(data) \ >> - ((((data) & 0x00000000000000ff) << 56) | \ >> - (((data) & 0x000000000000ff00) << 40) | \ >> - (((data) & 0x0000000000ff0000) << 24) | \ >> - (((data) & 0x00000000ff000000) << 8) | \ >> - (((data) & 0x000000ff00000000) >> 8) | \ >> - (((data) & 0x0000ff0000000000) >> 24) | \ >> - (((data) & 0x00ff000000000000) >> 40) | \ >> - (((data) & 0xff00000000000000) >> 56)) >> +#define DATA_LE32(data) \ >> + ((((data) & 0x000000ff) << 24) | \ >> + (((data) & 0x0000ff00) << 8) | \ >> + (((data) & 0x00ff0000) >> 8) | \ >> + (((data) & 0xff000000) >> 24)) >> #else >> -#define DATA_LE64(data) ((data) & 0xffffffffffffffff) >> +#define DATA_LE32(data) ((data) & 0xffffffff) >> #endif >> >> -#ifdef CONFIG_CPU_BIG_ENDIAN >> -#define __HEAD_FLAG_BE 1 >> -#else >> -#define __HEAD_FLAG_BE 0 >> -#endif >> - >> -#define __HEAD_FLAG_PAGE_SIZE ((PAGE_SHIFT - 10) / 2) >> - >> -#define __HEAD_FLAGS ((__HEAD_FLAG_BE << 0) | \ >> - (__HEAD_FLAG_PAGE_SIZE << 1)) >> - >> /* >> * These will output as part of the Image header, which should be little-endian >> - * regardless of the endianness of the kernel. While constant values could be >> - * endian swapped in head.S, all are done here for consistency. >> + * regardless of the endianness of the kernel. >> */ >> #define HEAD_SYMBOLS \ >> - _kernel_size_le = DATA_LE64(_end - _text); \ >> - _kernel_offset_le = DATA_LE64(TEXT_OFFSET); \ >> - _kernel_flags_le = DATA_LE64(__HEAD_FLAGS); >> + _kernel_size_le = DATA_LE32(_end - _text); >> >> #ifdef CONFIG_EFI >> >> -- >> 2.5.0 >>
Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
[PATCH v3 00/21] arm64: implement support for KASLR Ard Biesheuvel <ard.biesheuvel@linaro.org> - 2016-01-11 14:20 +0100
[PATCH v3 14/21] arm64: [re]define SWAPPER_TABLE_[SHIFT|SIZE] for use in asm code Ard Biesheuvel <ard.biesheuvel@linaro.org> - 2016-01-11 14:30 +0100
Re: [PATCH v3 14/21] arm64: [re]define SWAPPER_TABLE_[SHIFT|SIZE] for use in asm code Ard Biesheuvel <ard.biesheuvel@linaro.org> - 2016-01-11 14:30 +0100
[PATCH v3 08/21] arm64: add support for module PLTs Ard Biesheuvel <ard.biesheuvel@linaro.org> - 2016-01-11 14:30 +0100
[PATCH v3 04/21] arm64: decouple early fixmap init from linear mapping Ard Biesheuvel <ard.biesheuvel@linaro.org> - 2016-01-11 14:30 +0100
Re: [PATCH v3 04/21] arm64: decouple early fixmap init from linear mapping Mark Rutland <mark.rutland@arm.com> - 2016-01-11 17:10 +0100
Re: [PATCH v3 04/21] arm64: decouple early fixmap init from linear mapping Ard Biesheuvel <ard.biesheuvel@linaro.org> - 2016-01-11 17:20 +0100
Re: [PATCH v3 04/21] arm64: decouple early fixmap init from linear mapping Mark Rutland <mark.rutland@arm.com> - 2016-01-11 17:30 +0100
Re: [PATCH v3 04/21] arm64: decouple early fixmap init from linear mapping Mark Rutland <mark.rutland@arm.com> - 2016-01-11 18:00 +0100
Re: [PATCH v3 04/21] arm64: decouple early fixmap init from linear mapping Ard Biesheuvel <ard.biesheuvel@linaro.org> - 2016-01-11 18:10 +0100
Re: [PATCH v3 04/21] arm64: decouple early fixmap init from linear mapping Ard Biesheuvel <ard.biesheuvel@linaro.org> - 2016-01-11 18:20 +0100
Re: [PATCH v3 04/21] arm64: decouple early fixmap init from linear mapping Mark Rutland <mark.rutland@arm.com> - 2016-01-11 18:30 +0100
[PATCH v3 14/21] arm64: redefine SWAPPER_TABLE_SHIFT for use in asm code Ard Biesheuvel <ard.biesheuvel@linaro.org> - 2016-01-11 14:30 +0100
[PATCH v3 01/21] of/fdt: make memblock minimum physical address arch configurable Ard Biesheuvel <ard.biesheuvel@linaro.org> - 2016-01-11 14:30 +0100
[PATCH v3 16/21] scripts/sortextable: add support for ET_DYN binaries Ard Biesheuvel <ard.biesheuvel@linaro.org> - 2016-01-11 14:30 +0100
[PATCH v3 17/21] arm64: add support for a relocatable kernel and KASLR Ard Biesheuvel <ard.biesheuvel@linaro.org> - 2016-01-11 14:30 +0100
[PATCH v3 11/21] arm64: avoid R_AARCH64_ABS64 relocations for Image header fields Ard Biesheuvel <ard.biesheuvel@linaro.org> - 2016-01-11 14:30 +0100
Re: [PATCH v3 11/21] arm64: avoid R_AARCH64_ABS64 relocations for Image header fields Mark Rutland <mark.rutland@arm.com> - 2016-01-13 19:20 +0100
Re: [PATCH v3 11/21] arm64: avoid R_AARCH64_ABS64 relocations for Image header fields Ard Biesheuvel <ard.biesheuvel@linaro.org> - 2016-01-13 19:50 +0100
Re: [PATCH v3 11/21] arm64: avoid R_AARCH64_ABS64 relocations for Image header fields Ard Biesheuvel <ard.biesheuvel@linaro.org> - 2016-01-14 10:00 +0100
Re: [PATCH v3 11/21] arm64: avoid R_AARCH64_ABS64 relocations for Image header fields Ard Biesheuvel <ard.biesheuvel@linaro.org> - 2016-01-14 10:10 +0100
Re: [PATCH v3 11/21] arm64: avoid R_AARCH64_ABS64 relocations for Image header fields Mark Rutland <mark.rutland@arm.com> - 2016-01-14 11:50 +0100
Re: [PATCH v3 11/21] arm64: avoid R_AARCH64_ABS64 relocations for Image header fields Ard Biesheuvel <ard.biesheuvel@linaro.org> - 2016-01-14 12:30 +0100
[PATCH v3 06/21] arm64: pgtable: implement static [pte|pmd|pud]_offset variants Ard Biesheuvel <ard.biesheuvel@linaro.org> - 2016-01-11 14:30 +0100
Re: [PATCH v3 06/21] arm64: pgtable: implement static [pte|pmd|pud]_offset variants Mark Rutland <mark.rutland@arm.com> - 2016-01-11 17:30 +0100
Re: [PATCH v3 06/21] arm64: pgtable: implement static [pte|pmd|pud]_offset variants Ard Biesheuvel <ard.biesheuvel@linaro.org> - 2016-01-11 18:30 +0100
Re: [PATCH v3 06/21] arm64: pgtable: implement static [pte|pmd|pud]_offset variants Mark Rutland <mark.rutland@arm.com> - 2016-01-11 18:40 +0100
[PATCH v3 13/21] arm64: allow kernel Image to be loaded anywhere in physical memory Ard Biesheuvel <ard.biesheuvel@linaro.org> - 2016-01-11 14:30 +0100
[PATCH v3 12/21] arm64: avoid dynamic relocations in early boot code Ard Biesheuvel <ard.biesheuvel@linaro.org> - 2016-01-11 14:30 +0100
Re: [PATCH v3 12/21] arm64: avoid dynamic relocations in early boot code Mark Rutland <mark.rutland@arm.com> - 2016-01-14 18:20 +0100
[PATCH v3 15/21] arm64: split elf relocs into a separate header. Ard Biesheuvel <ard.biesheuvel@linaro.org> - 2016-01-11 14:30 +0100
[PATCH v3 09/21] extable: add support for relative extables to search and sort routines Ard Biesheuvel <ard.biesheuvel@linaro.org> - 2016-01-11 14:30 +0100
[PATCH v3 10/21] arm64: switch to relative exception tables Ard Biesheuvel <ard.biesheuvel@linaro.org> - 2016-01-11 14:30 +0100
[PATCH v3 19/21] efi: stub: add implementation of efi_random_alloc() Ard Biesheuvel <ard.biesheuvel@linaro.org> - 2016-01-11 14:30 +0100
[PATCH v3 18/21] efi: stub: implement efi_get_random_bytes() based on EFI_RNG_PROTOCOL Ard Biesheuvel <ard.biesheuvel@linaro.org> - 2016-01-11 14:30 +0100
[PATCH v3 20/21] efi: stub: use high allocation for converted command line Ard Biesheuvel <ard.biesheuvel@linaro.org> - 2016-01-11 14:30 +0100
[PATCH v3 21/21] arm64: efi: invoke EFI_RNG_PROTOCOL to supply KASLR randomness Ard Biesheuvel <ard.biesheuvel@linaro.org> - 2016-01-11 14:30 +0100
Re: [PATCH v3 00/21] arm64: implement support for KASLR Kees Cook <keescook@chromium.org> - 2016-01-11 23:10 +0100
Re: [PATCH v3 00/21] arm64: implement support for KASLR Ard Biesheuvel <ard.biesheuvel@linaro.org> - 2016-01-12 08:20 +0100
csiph-web