From patchwork Wed Oct 26 19:54:10 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthew Fortune X-Patchwork-Id: 16846 Received: (qmail 18627 invoked by alias); 26 Oct 2016 19:54:24 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 18607 invoked by uid 89); 26 Oct 2016 19:54:24 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-3.2 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_NONE, RP_MATCHES_RCVD, SPF_PASS autolearn=ham version=3.3.2 spammy=HX-Envelope-From:sk:Matthew, initialised, 3649, Hx-spam-relays-external:14.03.0294.000 X-HELO: mailapp01.imgtec.com From: Matthew Fortune To: "libc-alpha@sourceware.org" CC: "Sandra Loosemore (sandra@codesourcery.com)" , "Joseph Myers (joseph@codesourcery.com)" , "Petar Jovanovic" Subject: [PATCH] Initialise the machine specific part of rtld bootstrap map Date: Wed, 26 Oct 2016 19:54:10 +0000 Message-ID: <6D39441BF12EF246A7ABCE6654B0235380AABFF9@HHMAIL01.hh.imgtec.org> MIME-Version: 1.0 Hi, This is a long delayed follow up to a patch by Sandra: https://sourceware.org/ml/libc-alpha/2015-03/msg00704.html I've reimplemented it to be MIPS specific and lightweight to just initialise the necessary fields. Tested using mips64el-linux-gnu (n64) with some manual verification to make sure I saw the loader failures if I initialised the fpabi to an illegal value instead of zero. MIPS requires two fields in the machine specific part of the link map to be zero initialised. This is natually achieved except when the map is allocated on the stack. The only map allocated on the stack is the bootstrap map which is often the first use of the stack space following kernel allocation and is therefore zero. However, if rtld is invoked such that the stack has already been used then there may be non-zero data and ABI checks which use the affected fields will spuriously fail. * elf/rtld.c (_dl_start) [ifndef DONT_USE_BOOTSTRAP_MAP]: Call ELF_MACHINE_INIT_MAP. * sysdeps/mips/dl-machine.h (ELF_MACHINE_INIT_MAP): Define macro. Thanks, Matthew --- elf/rtld.c | 3 +++ sysdeps/mips/dl-machine.h | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/elf/rtld.c b/elf/rtld.c index 647661c..31539a4 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -364,6 +364,9 @@ _dl_start (void *arg) do not have to use the temporary bootstrap_map. Global variables are initialized to zero by default. */ #ifndef DONT_USE_BOOTSTRAP_MAP +# ifdef ELF_MACHINE_INIT_MAP + ELF_MACHINE_INIT_MAP (bootstrap_map); +# endif # ifdef HAVE_BUILTIN_MEMSET __builtin_memset (bootstrap_map.l_info, '\0', sizeof (bootstrap_map.l_info)); # else diff --git a/sysdeps/mips/dl-machine.h b/sysdeps/mips/dl-machine.h index 8c0b40e..d929477 100644 --- a/sysdeps/mips/dl-machine.h +++ b/sysdeps/mips/dl-machine.h @@ -93,6 +93,13 @@ do { if ((l)->l_info[DT_MIPS (RLD_MAP_REL)]) \ # define ELF_MACHINE_NAN2008 0 #endif +/* Initialise the machine dependent parts of a map. This is not normally + required unless the map is allocated on the stack. */ +#define ELF_MACHINE_INIT_MAP(MAP) \ +do { (MAP)->l_mach.fpabi = 0; \ + (MAP)->l_mach.odd_spreg = 0; \ + } while (0) + /* Return nonzero iff ELF header is compatible with the running host. */ static inline int __attribute_used__ elf_machine_matches_host (const ElfW(Ehdr) *ehdr)