PR ld/13962
PR ld/7023 * elf.c (bfd_section_from_shdr): Fail when .dynsym sh_info is out of range. As a special case, fix sh_info for zero sh_size. Do the same for .symtab.
This commit is contained in:
parent
83e56e63c2
commit
eee3b78649
|
@ -1,3 +1,11 @@
|
||||||
|
2012-05-16 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
|
PR ld/13962
|
||||||
|
PR ld/7023
|
||||||
|
* elf.c (bfd_section_from_shdr): Fail when .dynsym sh_info is
|
||||||
|
out of range. As a special case, fix sh_info for zero sh_size.
|
||||||
|
Do the same for .symtab.
|
||||||
|
|
||||||
2012-05-15 James Murray <jsm@jsm-net.demon.co.uk>
|
2012-05-15 James Murray <jsm@jsm-net.demon.co.uk>
|
||||||
Stephane Carrez <stcarrez@nerim.fr>
|
Stephane Carrez <stcarrez@nerim.fr>
|
||||||
|
|
||||||
|
|
20
bfd/elf.c
20
bfd/elf.c
|
@ -1646,7 +1646,15 @@ bfd_section_from_shdr (bfd *abfd, unsigned int shindex)
|
||||||
if (hdr->sh_entsize != bed->s->sizeof_sym)
|
if (hdr->sh_entsize != bed->s->sizeof_sym)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
if (hdr->sh_info * hdr->sh_entsize > hdr->sh_size)
|
if (hdr->sh_info * hdr->sh_entsize > hdr->sh_size)
|
||||||
return FALSE;
|
{
|
||||||
|
if (hdr->sh_size != 0)
|
||||||
|
return FALSE;
|
||||||
|
/* Some assemblers erroneously set sh_info to one with a
|
||||||
|
zero sh_size. ld sees this as a global symbol count
|
||||||
|
of (unsigned) -1. Fix it here. */
|
||||||
|
hdr->sh_info = 0;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
BFD_ASSERT (elf_onesymtab (abfd) == 0);
|
BFD_ASSERT (elf_onesymtab (abfd) == 0);
|
||||||
elf_onesymtab (abfd) = shindex;
|
elf_onesymtab (abfd) = shindex;
|
||||||
elf_tdata (abfd)->symtab_hdr = *hdr;
|
elf_tdata (abfd)->symtab_hdr = *hdr;
|
||||||
|
@ -1699,6 +1707,16 @@ bfd_section_from_shdr (bfd *abfd, unsigned int shindex)
|
||||||
|
|
||||||
if (hdr->sh_entsize != bed->s->sizeof_sym)
|
if (hdr->sh_entsize != bed->s->sizeof_sym)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
if (hdr->sh_info * hdr->sh_entsize > hdr->sh_size)
|
||||||
|
{
|
||||||
|
if (hdr->sh_size != 0)
|
||||||
|
return FALSE;
|
||||||
|
/* Some linkers erroneously set sh_info to one with a
|
||||||
|
zero sh_size. ld sees this as a global symbol count
|
||||||
|
of (unsigned) -1. Fix it here. */
|
||||||
|
hdr->sh_info = 0;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
BFD_ASSERT (elf_dynsymtab (abfd) == 0);
|
BFD_ASSERT (elf_dynsymtab (abfd) == 0);
|
||||||
elf_dynsymtab (abfd) = shindex;
|
elf_dynsymtab (abfd) = shindex;
|
||||||
elf_tdata (abfd)->dynsymtab_hdr = *hdr;
|
elf_tdata (abfd)->dynsymtab_hdr = *hdr;
|
||||||
|
|
Loading…
Reference in New Issue