aarch64: fix start code for static pie

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.
This commit is contained in:
Szabolcs Nagy 2017-11-17 10:45:32 +00:00
parent 7d38eb3897
commit 14d886edbd
2 changed files with 14 additions and 1 deletions

View File

@ -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]

View 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)