diff options
author | Petar Jovanovic <petar.jovanovic@rt-rk.com> | 2014-08-20 00:50:54 +0200 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2015-08-19 05:37:01 -0700 |
commit | fa19d5c48a6b36518ce68412e3bdde6bfa8aa4a6 (patch) | |
tree | feace153d8cbcbcf965076a32bdceee33d5c9895 /elf/dynamic-link.h | |
parent | 33c898d1607c1b8dac69c76eec289980292ebfc2 (diff) | |
download | glibc-fa19d5c48a6b36518ce68412e3bdde6bfa8aa4a6.tar.gz glibc-fa19d5c48a6b36518ce68412e3bdde6bfa8aa4a6.tar.xz glibc-fa19d5c48a6b36518ce68412e3bdde6bfa8aa4a6.zip |
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.
Diffstat (limited to 'elf/dynamic-link.h')
-rw-r--r-- | elf/dynamic-link.h | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/elf/dynamic-link.h b/elf/dynamic-link.h index 8d428e20d3..d7cff482d4 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); \ } \ } \ \ |