[PING,2,v8] Fix dynamic linker issue with bind-now
Commit Message
On Tue, Aug 18, 2015 at 12:48 PM, Petar Jovanovic
<petar.jovanovic@rt-rk.com> wrote:
> -----Original Message-----
> From: H.J. Lu [mailto:hjl.tools@gmail.com]
> Sent: Tuesday, August 18, 2015 8:55 PM
> To: Petar Jovanovic <petar.jovanovic@rt-rk.com>
> Cc: GNU C Library <libc-alpha@sourceware.org>; Roland McGrath <roland@hack.frob.com>; Andreas Schwab <schwab@linux-m68k.org>; Mike Frysinger <vapier@gentoo.org>
> 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 <petar.jovanovic@rt-rk.com>
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
@@ -1,3 +1,14 @@
+2015-08-19 Petar Jovanovic <petar.jovanovic@rt-rk.com>
+
+ [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 <hongjiu.lu@intel.com>
[BZ #18822]
@@ -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); \
} \
} \
\
@@ -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 \
new file mode 100644
@@ -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 <stdio.h>
+
+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"
new file mode 100644
@@ -0,0 +1,5 @@
+SECTIONS
+{
+ .bar : { *(.bar) }
+}
+INSERT AFTER .rela.dyn;
--
2.4.3