This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PING 3][PATCH v4] Fix dynamic linker issue with bind-now


ping

-----Original Message-----
From: Petar Jovanovic [mailto:petar.jovanovic@rt-rk.com] 
Sent: Friday, June 12, 2015 6:36 PM
To: 'libc-alpha@sourceware.org'
Cc: 'vapier@gentoo.org'; 'roland@hack.frob.com'
Subject: [PING 2][PATCH v4] Fix dynamic linker issue with bind-now

ping

-----Original Message-----
From: Petar Jovanovic [mailto:petar.jovanovic@rt-rk.com]
Sent: Tuesday, May 26, 2015 5:21 PM
To: 'libc-alpha@sourceware.org'
Cc: 'vapier@gentoo.org'; 'roland@hack.frob.com'
Subject: [PING][PATCH v4] Fix dynamic linker issue with bind-now

PTAL.

-----Original Message-----
From: Petar Jovanovic [mailto:petar.jovanovic@rt-rk.com]
Sent: Tuesday, April 28, 2015 8:03 PM
To: libc-alpha@sourceware.org
Cc: vapier@gentoo.org; roland@hack.frob.com; Petar Jovanovic
Subject: [PATCH v4] 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.
---
v4:
- Moved the Makefile part into sysdeps/x86_64/Makefile, so the test is
  executed for x86-64 only

v3:
- addressed comments raised by Mike Frysinger
  - use of test-skeleton.c
  - use -Wl,-z,now instead of LD_BIND_NOW=1
  - moved comments to the start of the test file

v2:
- addressed all comments raised by Andreas Schwab

 elf/dynamic-link.h         |    4 +++-
 elf/tst-split-dynreloc.c   |   28 ++++++++++++++++++++++++++++
 elf/tst-split-dynreloc.lds |    6 ++++++
 sysdeps/x86_64/Makefile    |    4 ++++
 4 files changed, 41 insertions(+), 1 deletion(-)  create mode 100644
elf/tst-split-dynreloc.c  create mode 100644 elf/tst-split-dynreloc.lds

diff --git a/elf/dynamic-link.h b/elf/dynamic-link.h index 8d428e2..83e760b
100644
--- a/elf/dynamic-link.h
+++ b/elf/dynamic-link.h
@@ -135,7 +135,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-split-dynreloc.c b/elf/tst-split-dynreloc.c new file
mode 100644 index 0000000..bdb6b7c
--- /dev/null
+++ b/elf/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 <stdio.h>
+
+static 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/elf/tst-split-dynreloc.lds b/elf/tst-split-dynreloc.lds new
file mode 100644 index 0000000..ed0a656
--- /dev/null
+++ b/elf/tst-split-dynreloc.lds
@@ -0,0 +1,6 @@
+SECTIONS
+{
+   .bar : { *(.bar) }
+}
+INSERT AFTER .rela.dyn;
+
diff --git a/sysdeps/x86_64/Makefile b/sysdeps/x86_64/Makefile index
ef70a50..b9d949c 100644
--- a/sysdeps/x86_64/Makefile
+++ b/sysdeps/x86_64/Makefile
@@ -38,6 +38,10 @@ 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,tst-split-dynreloc.lds -Wl,-z,now
+
 modules-names += tst-auditmod3a tst-auditmod3b \
 		tst-auditmod4a tst-auditmod4b \
 		tst-auditmod5a tst-auditmod5b \
--
1.7.9.5


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]