arm64: relocatable: fix inconsistencies in linker script and options 85/248985/1
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Mon, 3 Dec 2018 19:58:05 +0000 (20:58 +0100)
committerSeung-Woo Kim <sw0312.kim@samsung.com>
Thu, 3 Dec 2020 10:37:27 +0000 (19:37 +0900)
commit 3bbd3db86470c701091fb1d67f1fab6621debf50 upstream.

readelf complains about the section layout of vmlinux when building
with CONFIG_RELOCATABLE=y (for KASLR):

  readelf: Warning: [21]: Link field (0) should index a symtab section.
  readelf: Warning: [21]: Info field (0) should index a relocatable section.

Also, it seems that our use of '-pie -shared' is contradictory, and
thus ambiguous. In general, the way KASLR is wired up at the moment
is highly tailored to how ld.bfd happens to implement (and conflate)
PIE executables and shared libraries, so given the current effort to
support other toolchains, let's fix some of these issues as well.

- Drop the -pie linker argument and just leave -shared. In ld.bfd,
  the differences between them are unclear (except for the ELF type
  of the produced image [0]) but lld chokes on seeing both at the
  same time.

- Rename the .rela output section to .rela.dyn, as is customary for
  shared libraries and PIE executables, so that it is not misidentified
  by readelf as a static relocation section (producing the warnings
  above).

- Pass the -z notext and -z norelro options to explicitly instruct the
  linker to permit text relocations, and to omit the RELRO program
  header (which requires a certain section layout that we don't adhere
  to in the kernel). These are the defaults for current versions of
  ld.bfd.

- Discard .eh_frame and .gnu.hash sections to avoid them from being
  emitted between .head.text and .text, screwing up the section layout.

These changes only affect the ELF image, and produce the same binary
image.

[0] b9dce7f1ba01 ("arm64: kernel: force ET_DYN ELF type for ...")

Cc: Nick Desaulniers <ndesaulniers@google.com>
Cc: Peter Smith <peter.smith@linaro.org>
Tested-by: Nick Desaulniers <ndesaulniers@google.com>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
[sw0312.kim: backport stable linux-4.14.y commit f21ce3cdff2f for gcc 9 built image size]
Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Change-Id: I0ddfedad20188dcd9d7b416370e95d175b595db0

arch/arm64/Makefile
arch/arm64/kernel/vmlinux.lds.S

index 95fe780e13ca1df60cbb70914b050e772323fa85..3e6926776471be54ac1036c28ca5f8263d9a865a 100644 (file)
@@ -18,7 +18,7 @@ ifeq ($(CONFIG_RELOCATABLE), y)
 # Pass --no-apply-dynamic-relocs to restore pre-binutils-2.27 behaviour
 # for relative relocs, since this leads to better Image compression
 # with the relocation offsets always being zero.
-LDFLAGS_vmlinux                += -pie -shared -Bsymbolic \
+LDFLAGS_vmlinux                += -shared -Bsymbolic -z notext -z norelro \
                        $(call ld-option, --no-apply-dynamic-relocs)
 endif
 
index ad1142a7780c475e3e1ebced5b0cf90e733eb0c7..bd4c73b9757bc2841d120698260558089b2bcf23 100644 (file)
@@ -122,7 +122,8 @@ SECTIONS
                *(.discard)
                *(.discard.*)
                *(.interp .dynamic)
-               *(.dynsym .dynstr .hash)
+               *(.dynsym .dynstr .hash .gnu.hash)
+               *(.eh_frame)
        }
 
        . = KIMAGE_VADDR + TEXT_OFFSET;
@@ -193,12 +194,12 @@ SECTIONS
        .altinstr_replacement : {
                KEEP(*(.altinstr_replacement))
        }
-       .rela : ALIGN(8) {
+       .rela.dyn : ALIGN(8) {
                *(.rela .rela*)
        }
 
-       __rela_offset   = ABSOLUTE(ADDR(.rela) - KIMAGE_VADDR);
-       __rela_size     = SIZEOF(.rela);
+       __rela_offset   = ABSOLUTE(ADDR(.rela.dyn) - KIMAGE_VADDR);
+       __rela_size     = SIZEOF(.rela.dyn);
 
        . = ALIGN(SEGMENT_ALIGN);
        __init_end = .;