aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--sysdeps/aarch64/start.S13
2 files changed, 16 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 971257a4bd..da74352ce1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2018-01-12 Szabolcs Nagy <szabolcs.nagy@arm.com>
+
+ * aarch64/start.S (_start): Use __wrap_main.
+ (__wrap_main): New local symbol.
+
2018-01-12 Dmitry V. Levin <ldv@altlinux.org>
[BZ #22679]
diff --git a/sysdeps/aarch64/start.S b/sysdeps/aarch64/start.S
index 9f3b4188db..bad000f555 100644
--- a/sysdeps/aarch64/start.S
+++ b/sysdeps/aarch64/start.S
@@ -71,8 +71,8 @@ _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 x0, __wrap_main
+ add x0, x0, :lo12:__wrap_main
adrp x3, __libc_csu_init
add x3, x3, :lo12:__libc_csu_init
adrp x4, __libc_csu_fini
@@ -94,6 +94,15 @@ _start:
/* should never get here....*/
bl abort
+#if defined PIC && !defined SHARED
+ /* When main is not defined in the executable but in a shared library
+ then a wrapper is needed in crt1.o of the static-pie enabled libc,
+ because crt1.o and rcrt1.o share code and the later must avoid the
+ use of GOT relocations before __libc_start_main is called. */
+__wrap_main:
+ b main
+#endif
+
/* Define a symbol for the first piece of initialized data. */
.data
.globl __data_start