public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: Renlin Li <renlin.li@foss.arm.com>
To: libc-alpha@sourceware.org
Cc: Marcus Shawcroft <Marcus.Shawcroft@arm.com>,
	Richard Earnshaw <Richard.Earnshaw@arm.com>
Subject: [GLIBC][AARCH64]Rewrite elf_machine_load_address using _DYNAMIC symbol
Date: Fri, 04 Nov 2016 09:42:00 -0000	[thread overview]
Message-ID: <581C57FF.2090901@foss.arm.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 1224 bytes --]

Hi all,

This patch rewrites aarch64 elf_machine_load_address to use special _DYNAMIC
symbol instead of _dl_start.

The static address of _DYNAMIC symbol is stored in the first GOT entry.
Here is the change which makes this solution work.
https://sourceware.org/ml/binutils/2013-06/msg00248.html

i386, x86_64 targets use the same method to do this as well.

The original implementation relies on a trick that R_AARCH64_ABS32 relocation
being resolved at link time and the static address fits in the 32bits.
However, in LP64, normally, the address is defined to be 64 bit.

Additionally, the original inline assembly is not optimized. It uses 4
instructions including a jump.

Optimally, the new implementation here is just two instructions:
ldr %1, _GLOBAL_OFFSET_TABLE_
adr %2, _DYNAMIC

The size of ld.so is around 130K, so it's save to use ldr, adr to get the address.
The address range for those two instruction is +/-1MB.

And by the way, this method is ILP32 safe as well.
aarch64 linux toolchain regression test OK. OK to commit?

Regards,
Renlin Li


ChangeLog:

2016-11-04  Renlin Li  <renlin.li@arm.com>

	* sysdeps/aarch64/dl-machine.h (elf_machine_load_address): Use
	_DYNAMIC symbol to calculate load address.

[-- Attachment #2: tmp(4).diff --]
[-- Type: text/x-patch, Size: 1437 bytes --]

diff --git a/sysdeps/aarch64/dl-machine.h b/sysdeps/aarch64/dl-machine.h
index 217e179..b2f6618 100644
--- a/sysdeps/aarch64/dl-machine.h
+++ b/sysdeps/aarch64/dl-machine.h
@@ -49,25 +49,19 @@ elf_machine_load_address (void)
   /* To figure out the load address we use the definition that for any symbol:
      dynamic_addr(symbol) = static_addr(symbol) + load_addr
 
-     The choice of symbol is arbitrary. The static address we obtain
-     by constructing a non GOT reference to the symbol, the dynamic
-     address of the symbol we compute using adrp/add to compute the
-     symbol's address relative to the PC.
-     This depends on 32bit relocations being resolved at link time
-     and that the static address fits in the 32bits.  */
-
-  ElfW(Addr) static_addr;
-  ElfW(Addr) dynamic_addr;
+     _DYNAMIC symbol is used here as its static address is stored in
+     the special unrelocated first GOT entry.  */
 
+  ElfW(Addr) static_addr, dynamic_addr;
   asm ("					\n"
-"	adrp	%1, _dl_start;			\n"
-"	add	%1, %1, #:lo12:_dl_start	\n"
-"	ldr	%w0, 1f				\n"
-"	b	2f				\n"
-"1:						\n"
-"	.word	_dl_start			\n"
-"2:						\n"
-    : "=r" (static_addr),  "=r" (dynamic_addr));
+       "adr	%0, _DYNAMIC			\n"
+#ifdef __LP64__
+       "ldr	%1, _GLOBAL_OFFSET_TABLE_	\n"
+#else
+       "ldr	%w1, _GLOBAL_OFFSET_TABLE_	\n"
+#endif
+       : "=r" (dynamic_addr), "=r" (static_addr));
+
   return dynamic_addr - static_addr;
 }
 

             reply	other threads:[~2016-11-04  9:42 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-11-04  9:42 Renlin Li [this message]
2016-11-04 21:24 ` Roland McGrath
2016-11-07 15:15   ` Szabolcs Nagy
2016-11-07 15:23     ` Szabolcs Nagy
2016-11-07 15:52       ` Szabolcs Nagy
2016-11-09 19:06         ` Maciej W. Rozycki
2016-11-08 21:28     ` Roland McGrath
2016-11-09 14:48       ` Szabolcs Nagy
2016-11-09 22:02         ` Roland McGrath
2017-10-17 15:41 ` Szabolcs Nagy
2017-10-17 16:28   ` Szabolcs Nagy
2017-10-18 10:32     ` Renlin Li
2017-10-18 16:12       ` Szabolcs Nagy

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=581C57FF.2090901@foss.arm.com \
    --to=renlin.li@foss.arm.com \
    --cc=Marcus.Shawcroft@arm.com \
    --cc=Richard.Earnshaw@arm.com \
    --cc=libc-alpha@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).