>From 08bf60f1bb4d6d9aae63e80d0dfd0884ad812659 Mon Sep 17 00:00:00 2001
From: Petar Jovanovic <petar.jovanovic@rt-rk.com>
Date: Fri, 31 Oct 2014 03:26:48 +0100
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.
---
 elf/Makefile             |    7 ++++++-
 elf/dynamic-link.h       |    4 +++-
 elf/tst-dynamic-link.c   |   11 +++++++++++
 elf/tst-dynamic-link.lds |    6 ++++++
 4 files changed, 26 insertions(+), 2 deletions(-)
 create mode 100644 elf/tst-dynamic-link.c
 create mode 100644 elf/tst-dynamic-link.lds

diff --git a/elf/Makefile b/elf/Makefile
index 94074f3..1fb2ce5 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -146,8 +146,13 @@ tests += loadtest restest1 preloadtest loadfail multiload origtest resolvfail \
 	 tst-stackguard1 tst-addr1 tst-thrlock \
 	 tst-unique1 tst-unique2 tst-unique3 tst-unique4 \
 	 tst-initorder tst-initorder2 tst-relsort1 tst-null-argv \
-	 tst-ptrguard1
+	 tst-ptrguard1 tst-dynamic-link
 #	 reldep9
+
+LDFLAGS-tst-dynamic-link = -fPIE -Wl,-T,tst-dynamic-link.lds
+CFLAGS-tst-dynamic-link.c = -O0 -DIS_IN_build
+tst-dynamic-link-ENV = LD_BIND_NOW=1
+
 ifeq ($(build-hardcoded-path-in-tests),yes)
 tests += tst-dlopen-aout
 endif
diff --git a/elf/dynamic-link.h b/elf/dynamic-link.h
index 7b3e295..d5dea8e 100644
--- a/elf/dynamic-link.h
+++ b/elf/dynamic-link.h
@@ -133,7 +133,9 @@ 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].size == 0 ||                           \
+                ranges[0].start + ranges[0].size != start))                   \
 	  {								      \
 	    ranges[1].start = start;					      \
 	    ranges[1].size = size;					      \
diff --git a/elf/tst-dynamic-link.c b/elf/tst-dynamic-link.c
new file mode 100644
index 0000000..b9953a2
--- /dev/null
+++ b/elf/tst-dynamic-link.c
@@ -0,0 +1,11 @@
+#include <stdio.h>
+
+static int __attribute__((section(".bar"))) bar = 0x12345678;
+
+static const char foo[] = "foo";
+
+int main() {
+  printf("%s\n", foo);
+  return 0;
+}
+
diff --git a/elf/tst-dynamic-link.lds b/elf/tst-dynamic-link.lds
new file mode 100644
index 0000000..ed0a656
--- /dev/null
+++ b/elf/tst-dynamic-link.lds
@@ -0,0 +1,6 @@
+SECTIONS
+{
+   .bar : { *(.bar) }
+}
+INSERT AFTER .rela.dyn;
+
-- 
1.7.9.5

