[BZ,#18410] : Incorrect handling of missing DT_PLTRELSZ
Commit Message
A shared object doesn't need PLT if there are no PLT relocations. It
shouldn't be an error if DT_PLTRELSZ is missing.
OK for master?
H.J.
--
[BZ #18410]
* elf/dl-reloc.c (_dl_relocate_object): Don't issue an error
for missing DT_PLTRELSZ.
---
elf/dl-reloc.c | 14 +++-----------
1 file changed, 3 insertions(+), 11 deletions(-)
Comments
On Mon, May 18, 2015 at 1:41 PM, Roland McGrath <roland@hack.frob.com> wrote:
> Can you add a test case?
It is already in glibc. elf/tst-audit10 fails on x86 using binutils with
commit a3747075ae478f27bf3e0643021a85fb6cdad0e3
Author: H.J. Lu <hjl.tools@gmail.com>
Date: Tue May 12 13:11:48 2015 -0700
Allocate the first .plt entry space only if needed
Commit dd7e64d45b317128f5fe813a8da0b13b4ad046ae may optimize out
i386/x86-64 JUMP_SLOT relocation. If there is no JUMP_SLOT relocation
left, we don't need to the first .plt entry. This patch allocates
space for the first .plt entry only if we also reserve space for a PLT
slot for JUMP_SLOT relocation.
> On Mon, May 18, 2015 at 1:41 PM, Roland McGrath <roland@hack.frob.com> wrote:
> > Can you add a test case?
>
> It is already in glibc. elf/tst-audit10 fails on x86 using binutils with
These are the kinds of details about a change that you should always
include in the first posting.
@@ -258,21 +258,13 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
ELF_DYNAMIC_RELOCATE (l, lazy, consider_profiling, skip_ifunc);
#ifndef PROF
- if (__glibc_unlikely (consider_profiling))
+ if (__glibc_unlikely (consider_profiling
+ && l->l_info[DT_PLTRELSZ] != NULL))
{
/* Allocate the array which will contain the already found
relocations. If the shared object lacks a PLT (for example
if it only contains lead function) the l_info[DT_PLTRELSZ]
will be NULL. */
- if (l->l_info[DT_PLTRELSZ] == NULL)
- {
- errstring = N_("%s: no PLTREL found in object %s\n");
- fatal:
- _dl_fatal_printf (errstring,
- RTLD_PROGNAME,
- l->l_name);
- }
-
size_t sizeofrel = l->l_info[DT_PLTREL]->d_un.d_val == DT_RELA
? sizeof (ElfW(Rela))
: sizeof (ElfW(Rel));
@@ -283,7 +275,7 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
{
errstring = N_("\
%s: out of memory to store relocation results for %s\n");
- goto fatal;
+ _dl_fatal_printf (errstring, RTLD_PROGNAME, l->l_name);
}
}
#endif