2008-11-07 Andreas Schwab PR 7011 * elf.c (assign_file_positions_for_non_load_sections): Handle PT_GNU_RELRO that covers only a part of a single section. --- bfd/elf.c.~1.466.~ 2008-10-09 11:07:35.000000000 +0200 +++ bfd/elf.c 2008-11-07 11:32:56.000000000 +0100 @@ -4631,7 +4631,9 @@ assign_file_positions_for_non_load_secti m != NULL; m = m->next, p++) { - if (m->count != 0) + if (m->count != 0 + /* Always handle PT_GNU_RELRO here if not linking. */ + || (p->p_type == PT_GNU_RELRO && link_info == NULL)) { if (p->p_type != PT_LOAD && (p->p_type != PT_NOTE @@ -4642,12 +4644,6 @@ assign_file_positions_for_non_load_secti BFD_ASSERT (!m->includes_filehdr && !m->includes_phdrs); - sect = m->sections[m->count - 1]; - hdr = &elf_section_data (sect)->this_hdr; - p->p_filesz = sect->filepos - m->sections[0]->filepos; - if (hdr->sh_type != SHT_NOBITS) - p->p_filesz += hdr->sh_size; - if (p->p_type == PT_GNU_RELRO) { /* When we get here, we are copying executable @@ -4680,7 +4676,14 @@ assign_file_positions_for_non_load_secti abort (); } else - p->p_offset = m->sections[0]->filepos; + { + sect = m->sections[m->count - 1]; + hdr = &elf_section_data (sect)->this_hdr; + p->p_filesz = sect->filepos - m->sections[0]->filepos; + if (hdr->sh_type != SHT_NOBITS) + p->p_filesz += hdr->sh_size; + p->p_offset = m->sections[0]->filepos; + } } } else