From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8075 invoked by alias); 18 Oct 2017 10:32:15 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Received: (qmail 7284 invoked by uid 89); 18 Oct 2017 10:32:15 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_LAZY_DOMAIN_SECURITY,RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy= X-HELO: foss.arm.com Subject: Re: [GLIBC][AARCH64]Rewrite elf_machine_load_address using _DYNAMIC symbol To: Szabolcs Nagy , libc-alpha@sourceware.org References: <581C57FF.2090901@foss.arm.com> <59E624A8.4010304@arm.com> <59E62FBB.2090508@arm.com> Cc: nd@arm.com, Marcus Shawcroft , Richard Earnshaw , "H.J. Lu" From: Renlin Li Message-ID: <59E72DA9.2090404@foss.arm.com> Date: Wed, 18 Oct 2017 10:32:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.3.0 MIME-Version: 1.0 In-Reply-To: <59E62FBB.2090508@arm.com> Content-Type: multipart/mixed; boundary="------------020106020602040401060905" X-SW-Source: 2017-10/txt/msg00816.txt.bz2 This is a multi-part message in MIME format. --------------020106020602040401060905 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-length: 2393 Hi Szabolcs, Here is the C version one which should be portable in all cases. aarch64 native glibc regression test checked Okay. Regards, Renlin ChangeLog: 2017-10-18 Renlin Li * sysdeps/aarch64/dl-machine.h (elf_machine_load_address): Use _DYNAMIC symbol to calculate load address. On 17/10/17 17:28, Szabolcs Nagy wrote: > On 17/10/17 16:41, Szabolcs Nagy wrote: >> On 04/11/16 09:42, Renlin Li wrote: >>> 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 >>> >>> * sysdeps/aarch64/dl-machine.h (elf_machine_load_address): Use >>> _DYNAMIC symbol to calculate load address. >> >> This is OK. >> >> (Roland notes that introducing a BASE symbol with a >> linker script would even avoid loading GOT[0], but >> that can be done separately across targets) >> > > please wait with this. > > looking at the static pie patches, it seems that also needs > to compute the base address and that cannot assume -mcmodel=tiny, > i don't remember if there was a particular reason -mcmodel=large > would be problematic, if inline asm was only used to save a > few instructions then please resend the patch but using c code > (like what x86_64 is doing), that's less fragile. > --------------020106020602040401060905 Content-Type: text/x-patch; name="new.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="new.diff" Content-length: 1686 diff --git a/sysdeps/aarch64/dl-machine.h b/sysdeps/aarch64/dl-machine.h index b124547..e765612 100644 --- a/sysdeps/aarch64/dl-machine.h +++ b/sysdeps/aarch64/dl-machine.h @@ -51,40 +51,11 @@ 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 32/16bit relocations being resolved at link time - and that the static address fits in the 32/16 bits. */ - - ElfW(Addr) static_addr; - ElfW(Addr) dynamic_addr; - - asm (" \n" -" adrp %1, _dl_start; \n" -#ifdef __LP64__ -" add %1, %1, #:lo12:_dl_start \n" -#else -" add %w1, %w1, #:lo12:_dl_start \n" -#endif -" ldr %w0, 1f \n" -" b 2f \n" -"1: \n" -#ifdef __LP64__ -" .word _dl_start \n" -#else -# ifdef __AARCH64EB__ -" .short 0 \n" -# endif -" .short _dl_start \n" -# ifndef __AARCH64EB__ -" .short 0 \n" -# endif -#endif -"2: \n" - : "=r" (static_addr), "=r" (dynamic_addr)); - return dynamic_addr - static_addr; + _DYNAMIC sysmbol is used here as its link-time address stored in + the special unrelocated first GOT entry. */ + + extern ElfW(Dyn) _DYNAMIC[] attribute_hidden; + return (ElfW(Addr)) &_DYNAMIC - elf_machine_dynamic (); } /* Set up the loaded object described by L so its unrelocated PLT --------------020106020602040401060905--