From 3832a4d892b209ca17c5320a506c5902da63e025 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 12 Jun 2012 06:31:06 +0000 Subject: [PATCH] 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. --- bfd/ChangeLog | 7 +++++++ bfd/elf.c | 21 ++++++++++++++------- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 220afe3a4fc..5c5c07c1b1c 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2012-06-12 Alan Modra + + 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. + 2012-06-11 H.J. Lu * elf.c (assign_file_positions_for_non_load_sections): Reindent. diff --git a/bfd/elf.c b/bfd/elf.c index 6de314bebd7..6755a4e3090 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; } } -- 2.30.2