diff options
author | Alan Modra <amodra@bigpond.net.au> | 2012-06-12 06:31:05 +0000 |
---|---|---|
committer | Alan Modra <amodra@bigpond.net.au> | 2012-06-12 06:31:05 +0000 |
commit | 2d6cce641124d25230506a1797c6fe996641eafa (patch) | |
tree | 75806f999a38c1d0ae2f3fe3fc9fcb4770e15b62 /bfd/elf.c | |
parent | c0f507dd5556ac48474e90988dcccef9bcd4645a (diff) | |
download | binutils-redhat-2d6cce641124d25230506a1797c6fe996641eafa.tar.gz |
PR ld/14207
* elf.c (_bfd_elf_map_sections_to_segments): Disregard bss type
sections at end of PT_LOAD segment when searching for segment
that contains end of relro extent.
Diffstat (limited to 'bfd/elf.c')
-rw-r--r-- | bfd/elf.c | 21 |
1 files changed, 14 insertions, 7 deletions
@@ -4152,15 +4152,22 @@ _bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info) { for (m = mfirst; m != NULL; m = m->next) { - if (m->p_type == PT_LOAD) + if (m->p_type == PT_LOAD + && m->count != 0 + && m->sections[0]->vma >= info->relro_start + && m->sections[0]->vma < info->relro_end) { - asection *last = m->sections[m->count - 1]; - bfd_vma vaddr = m->sections[0]->vma; - bfd_vma filesz = last->vma - vaddr + last->size; + i = m->count; + while (--i != (unsigned) -1) + if ((m->sections[i]->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) + == (SEC_LOAD | SEC_HAS_CONTENTS)) + break; + + if (i == (unsigned) -1) + continue; - if (vaddr < info->relro_end - && vaddr >= info->relro_start - && (vaddr + filesz) >= info->relro_end) + if (m->sections[i]->vma + m->sections[i]->size + >= info->relro_end) break; } } |