aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2012-06-12 06:31:06 +0000
committerAlan Modra <amodra@gmail.com>2012-06-12 06:31:06 +0000
commit3832a4d892b209ca17c5320a506c5902da63e025 (patch)
treed179ad9b598c52a00864338bbba76000be56bfb3 /bfd/elf.c
parenta6feecf7444322ebd3b08e6fac8de65958910ec5 (diff)
downloadgdb-3832a4d892b209ca17c5320a506c5902da63e025.zip
gdb-3832a4d892b209ca17c5320a506c5902da63e025.tar.gz
gdb-3832a4d892b209ca17c5320a506c5902da63e025.tar.bz2
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.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/bfd/elf.c b/bfd/elf.c
index 6de314b..6755a4e 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -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;
}
}