]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
aarch64: fix start code for static pie
authorSzabolcs Nagy <szabolcs.nagy@arm.com>
Fri, 17 Nov 2017 10:45:32 +0000 (10:45 +0000)
committerSzabolcs Nagy <szabolcs.nagy@arm.com>
Mon, 18 Dec 2017 10:07:07 +0000 (10:07 +0000)
There are three flavors of the crt startup code:

1) crt1.o used for non-pie,
2) Scrt1.o used for dynamic linked pie (dynamic linker relocates),
3) rcrt1.o used for static linked pie (self relocation is needed)

In the --enable-static-pie case crt1.o is built with -DPIC and in case
of static linking it interposes _dl_relocate_static_pie in libc to
avoid self relocation.

Scrt1.o is built with -DPIC -DSHARED and it relies on GOT entries that
the static linker cannot relax and thus need relocation before the
start code is executed, so rcrt1.o needs separate implementation.

This implementation does not work for .text > 4G position independent
executables, which is fine since the toolchain does not support
-mcmodel=large with -fPIE.

Tests pass with ld/22269 and ld/22263 binutils bugs fixed.

* sysdeps/aarch64/start.S (_start): Handle PIC && !SHARED case.

ChangeLog
sysdeps/aarch64/start.S

index 815e73571d6192dff1e14853afb03c1bf666fb1c..62e07123d5c6c9930803fecb18b5d13fde13d8d8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2017-12-18  Szabolcs Nagy  <szabolcs.nagy@arm.com>
+
+       * sysdeps/aarch64/start.S (_start): Handle PIC && !SHARED case.
+
 2017-12-16  Aurelien Jarno  <aurelien@aurel32.net>
 
        [BZ #22505]
index c20433ad7334882b3ec0d933c5f10c20f87f6695..0218f8d277216a5b056f56cf8069750c4920f62c 100644 (file)
@@ -60,7 +60,8 @@ _start:
        /* Setup stack limit in argument register */
        mov     x6, sp
 
-#ifdef SHARED
+#ifdef PIC
+# ifdef SHARED
         adrp    x0, :got:main
        ldr     PTR_REG (0), [x0, #:got_lo12:main]
 
@@ -69,6 +70,14 @@ _start:
 
         adrp    x4, :got:__libc_csu_fini
        ldr     PTR_REG (4), [x4, #:got_lo12:__libc_csu_fini]
+# else
+       adrp    x0, main
+       add     x0, x0, :lo12:main
+       adrp    x3, __libc_csu_init
+       add     x3, x3, :lo12:__libc_csu_init
+       adrp    x4, __libc_csu_fini
+       add     x4, x4, :lo12:__libc_csu_fini
+# endif
 #else
        /* Set up the other arguments in registers */
        MOVL (0, main)