From patchwork Wed Aug 19 12:54:18 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 508722 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id C8980140783 for ; Wed, 19 Aug 2015 22:54:45 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.b=WlyHfUjL; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; q=dns; s=default; b= Xv1CtNxOsYZ/Hdoyz+r8GQSAN+CgcqxbCSjQbWtVwn73+GhuaEjjEQ7xLar5ULPy VXfrd/QI2/pfNFIcMlSntq15G4OBIABMSIYZ9QT0EjzpihRgwJ11KB9xmMdIUvti X5htZIDUGBB+K+BiWSYvHjCvmxTmxtjESpD8sNuLAQ4= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; s=default; bh=QqR5Y dgXjuKg5MY4R67IyEjOALY=; b=WlyHfUjLq5NaJwlsUB5CFNpW22+ZWFdcZ7A76 FC0XiSCIOIGZR7ixQnIqShgQo2ZibrdxT+8vF0lmjiAZlf7pj8Ei2rN1OQE2nGCc /HdQ01bWs6gcfLz05P+cUb0+ksD8mpETV5EOlajmbgsr8/FdGi0ENAzSojYz3aLB U7mT4o= Received: (qmail 57447 invoked by alias); 19 Aug 2015 12:54:23 -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 57378 invoked by uid 89); 19 Aug 2015 12:54:23 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=0.0 required=5.0 tests=AWL, BAYES_50, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-ob0-f176.google.com MIME-Version: 1.0 X-Received: by 10.60.39.136 with SMTP id p8mr10319491oek.45.1439988858326; Wed, 19 Aug 2015 05:54:18 -0700 (PDT) In-Reply-To: <000001d0d9ee$d08d9d50$71a8d7f0$@rt-rk.com> References: <003001d0d9df$6dffa7f0$49fef7d0$@rt-rk.com> <000001d0d9ee$d08d9d50$71a8d7f0$@rt-rk.com> Date: Wed, 19 Aug 2015 05:54:18 -0700 Message-ID: Subject: Re: [PING 2][PATCH v8] Fix dynamic linker issue with bind-now From: "H.J. Lu" To: Petar Jovanovic Cc: GNU C Library , Roland McGrath , Andreas Schwab , Mike Frysinger On Tue, Aug 18, 2015 at 12:48 PM, Petar Jovanovic wrote: > -----Original Message----- > From: H.J. Lu [mailto:hjl.tools@gmail.com] > Sent: Tuesday, August 18, 2015 8:55 PM > To: Petar Jovanovic > Cc: GNU C Library ; Roland McGrath ; Andreas Schwab ; Mike Frysinger > Subject: Re: [PING 2][PATCH v8] Fix dynamic linker issue with bind-now >> Please provide a patch from "git format-patch with proper ChangeLog entry. >> -- >> H.J. > > Hi H.J., > > Have not I already provided this at the start [1] of this thread? > Is there anything that should be modified here? > > Let me know. > > Regards, > Petar > > [1] patch v8, https://sourceware.org/ml/libc-alpha/2015-07/msg00489.html > I moved testcase to sysdep/x86_64 and tested it on x86/x86-64. This is what I checked in for you. Thanks. From fa19d5c48a6b36518ce68412e3bdde6bfa8aa4a6 Mon Sep 17 00:00:00 2001 From: Petar Jovanovic Date: Wed, 20 Aug 2014 00:50:54 +0200 Subject: [PATCH] Fix dynamic linker issue with bind-now Fix the bind-now case when DT_REL and DT_JMPREL sections are separate and there is a gap between them. [BZ #14341] * elf/dynamic-link.h (elf_machine_lazy_rel): Properly handle the case when there is a gap between DT_REL and DT_JMPREL sections. * sysdeps/x86_64/Makefile (tests): Add tst-split-dynreloc. (LDFLAGS-tst-split-dynreloc): New. (tst-split-dynreloc-ENV): Likewise. * sysdeps/x86_64/tst-split-dynreloc.c: New file. * sysdeps/x86_64/tst-split-dynreloc.lds: Likewise. --- ChangeLog | 11 +++++++++++ elf/dynamic-link.h | 14 ++++++++------ sysdeps/x86_64/Makefile | 5 +++++ sysdeps/x86_64/tst-split-dynreloc.c | 28 ++++++++++++++++++++++++++++ sysdeps/x86_64/tst-split-dynreloc.lds | 5 +++++ 5 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 sysdeps/x86_64/tst-split-dynreloc.c create mode 100644 sysdeps/x86_64/tst-split-dynreloc.lds diff --git a/ChangeLog b/ChangeLog index 83fef46..4218f2c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2015-08-19 Petar Jovanovic + + [BZ #14341] + * elf/dynamic-link.h (elf_machine_lazy_rel): Properly handle the + case when there is a gap between DT_REL and DT_JMPREL sections. + * sysdeps/x86_64/Makefile (tests): Add tst-split-dynreloc. + (LDFLAGS-tst-split-dynreloc): New. + (tst-split-dynreloc-ENV): Likewise. + * sysdeps/x86_64/tst-split-dynreloc.c: New file. + * sysdeps/x86_64/tst-split-dynreloc.lds: Likewise. + 2015-08-19 H.J. Lu [BZ #18822] diff --git a/elf/dynamic-link.h b/elf/dynamic-link.h index 8d428e2..d7cff48 100644 --- a/elf/dynamic-link.h +++ b/elf/dynamic-link.h @@ -135,16 +135,18 @@ elf_machine_lazy_rel (struct link_map *map, \ if (ranges[0].start + ranges[0].size == (start + size)) \ ranges[0].size -= size; \ - if (! ELF_DURING_STARTUP && ((do_lazy) || ranges[0].size == 0)) \ + if (ELF_DURING_STARTUP \ + || (!(do_lazy) \ + && (ranges[0].start + ranges[0].size) == start)) \ { \ - ranges[1].start = start; \ - ranges[1].size = size; \ - ranges[1].lazy = (do_lazy); \ + /* Combine processing the sections. */ \ + ranges[0].size += size; \ } \ else \ { \ - /* Combine processing the sections. */ \ - ranges[0].size += size; \ + ranges[1].start = start; \ + ranges[1].size = size; \ + ranges[1].lazy = (do_lazy); \ } \ } \ \ diff --git a/sysdeps/x86_64/Makefile b/sysdeps/x86_64/Makefile index ef70a50..91875f0 100644 --- a/sysdeps/x86_64/Makefile +++ b/sysdeps/x86_64/Makefile @@ -38,6 +38,11 @@ tests += tst-audit3 tst-audit4 tst-audit5 tst-audit10 ifeq (yes,$(config-cflags-avx)) tests += tst-audit6 tst-audit7 endif + +tests += tst-split-dynreloc +LDFLAGS-tst-split-dynreloc = -Wl,-T,$(..)sysdeps/x86_64/tst-split-dynreloc.lds +tst-split-dynreloc-ENV = LD_BIND_NOW=1 + modules-names += tst-auditmod3a tst-auditmod3b \ tst-auditmod4a tst-auditmod4b \ tst-auditmod5a tst-auditmod5b \ diff --git a/sysdeps/x86_64/tst-split-dynreloc.c b/sysdeps/x86_64/tst-split-dynreloc.c new file mode 100644 index 0000000..2f9e9b9 --- /dev/null +++ b/sysdeps/x86_64/tst-split-dynreloc.c @@ -0,0 +1,28 @@ +/* This test will be used to create an executable with a specific + section layout in which .rela.dyn and .rela.plt are not contiguous. + For x86 case, readelf will report something like: + + ... + [10] .rela.dyn RELA + [11] .bar PROGBITS + [12] .rela.plt RELA + ... + + This is important as this case was not correctly handled by dynamic + linker in the bind-now case, and the second section was never + processed. */ + +#include + +const int __attribute__ ((section(".bar"))) bar = 0x12345678; +static const char foo[] = "foo"; + +static int +do_test (void) +{ + printf ("%s %d\n", foo, bar); + return 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/sysdeps/x86_64/tst-split-dynreloc.lds b/sysdeps/x86_64/tst-split-dynreloc.lds new file mode 100644 index 0000000..2229e69 --- /dev/null +++ b/sysdeps/x86_64/tst-split-dynreloc.lds @@ -0,0 +1,5 @@ +SECTIONS +{ + .bar : { *(.bar) } +} +INSERT AFTER .rela.dyn; -- 2.4.3