From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 112130 invoked by alias); 26 Jan 2018 11:06:09 -0000 Mailing-List: contact libc-stable-help@sourceware.org; run by ezmlm Precedence: bulk List-Post: List-Help: List-Subscribe: List-Archive: Sender: libc-stable-owner@sourceware.org Received: (qmail 112015 invoked by uid 89); 26 Jan 2018 11:06:06 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Checked: by ClamAV 0.99.2 on sourceware.org 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,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy= X-Spam-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,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on sourceware.org X-Spam-Level: X-HELO: hall.aurel32.net Received: from hall.aurel32.net (HELO hall.aurel32.net) (163.172.24.10) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 26 Jan 2018 11:06:01 +0000 Received: from ohm.aurel32.net ([2001:bc8:30d7:111::1000]) by hall.aurel32.net with esmtpsa (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1ef1pX-0005eg-8E; Fri, 26 Jan 2018 12:05:59 +0100 Received: from aurel32 by ohm.aurel32.net with local (Exim 4.90) (envelope-from ) id 1ef1pO-0003AP-O7; Fri, 26 Jan 2018 12:05:50 +0100 From: Aurelien Jarno To: libc-stable@sourceware.org Cc: Szabolcs Nagy Subject: [2.26 COMMITTED] [AARCH64] Rewrite elf_machine_load_address using _DYNAMIC symbol Date: Mon, 01 Jan 2018 00:00:00 -0000 Message-Id: <20180126110524.11127-1-aurelien@aurel32.net> X-Mailer: git-send-email 2.15.1 X-IsSubscribed: yes X-SW-Source: 2018-01/txt/msg00056.txt.bz2 From: Szabolcs Nagy 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 (part of binutils 2.24): 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. Here is the C version one which should be portable in all cases. * sysdeps/aarch64/dl-machine.h (elf_machine_load_address): Use _DYNAMIC symbol to calculate load address. (cherry picked from commit a68ba2f3cd3cbe32c1f31e13c20ed13487727b32) --- ChangeLog | 5 +++++ sysdeps/aarch64/dl-machine.h | 39 +++++---------------------------------- 2 files changed, 10 insertions(+), 34 deletions(-) diff --git a/ChangeLog b/ChangeLog index d1a23a4f1b9..9f65a5cca1f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2017-10-18 Renlin Li + + * sysdeps/aarch64/dl-machine.h (elf_machine_load_address): Use + _DYNAMIC symbol to calculate load address. + 2018-01-19 H.J. Lu [BZ #22715] diff --git a/sysdeps/aarch64/dl-machine.h b/sysdeps/aarch64/dl-machine.h index 60472036f57..3fb00e6e2d4 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 -- 2.15.1