diff options
Diffstat (limited to 'bfd/elf.c')
-rw-r--r-- | bfd/elf.c | 41 |
1 files changed, 22 insertions, 19 deletions
@@ -1363,9 +1363,9 @@ bfd_section_from_phdr (abfd, hdr, index) char namebuf[64]; int split; - split = ((hdr->p_memsz > 0) && - (hdr->p_filesz > 0) && - (hdr->p_memsz > hdr->p_filesz)); + split = ((hdr->p_memsz > 0) + && (hdr->p_filesz > 0) + && (hdr->p_memsz > hdr->p_filesz)); sprintf (namebuf, split ? "segment%da" : "segment%d", index); name = bfd_alloc (abfd, strlen (namebuf) + 1); if (!name) @@ -2605,7 +2605,8 @@ assign_file_positions_for_segments (abfd) p->p_memsz += alloc * bed->s->sizeof_phdr; } - if (p->p_type == PT_LOAD || p->p_type == PT_NOTE) + if (p->p_type == PT_LOAD + || (p->p_type == PT_NOTE && abfd->format == bfd_core)) { if (! m->includes_filehdr && ! m->includes_phdrs) p->p_offset = off; @@ -2704,7 +2705,7 @@ assign_file_positions_for_segments (abfd) voff += sec->_raw_size; } - if (p->p_type == PT_NOTE) + if (p->p_type == PT_NOTE && abfd->format == bfd_core) { if (i == 0) /* the actual "note" segment */ { /* this one actually contains everything. */ @@ -2891,8 +2892,8 @@ assign_file_positions_except_relocs (abfd) file_ptr off; struct elf_backend_data *bed = get_elf_backend_data (abfd); - if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 && - abfd->format != bfd_core) + if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 + && abfd->format != bfd_core) { Elf_Internal_Shdr **hdrpp; unsigned int i; @@ -3364,11 +3365,13 @@ copy_private_bfd_data (ibfd, obfd) /* Special case: corefile "NOTE" section containing regs, prpsinfo etc. */ -#define IS_COREFILE_NOTE(p, s) \ - (p->p_type == PT_NOTE && \ - s->vma == 0 && s->lma == 0 && s->_cooked_size == 0 && \ - (bfd_vma) s->filepos >= p->p_offset && \ - (bfd_vma) s->filepos + s->_raw_size <= p->p_offset + p->p_filesz) +#define IS_COREFILE_NOTE(p, s) \ + (p->p_type == PT_NOTE \ + && ibfd->format == bfd_core \ + && s->vma == 0 && s->lma == 0 \ + && (bfd_vma) s->filepos >= p->p_offset \ + && (bfd_vma) s->filepos + s->_raw_size \ + <= p->p_offset + p->p_filesz) /* The complicated case when p_vaddr is 0 is to handle the Solaris linker, which generates a PT_INTERP section with p_vaddr and @@ -3405,9 +3408,9 @@ copy_private_bfd_data (ibfd, obfd) for (s = ibfd->sections; s != NULL; s = s->next) if (s->output_section != NULL) { - if ((IS_CONTAINED_BY (s->vma, s->_raw_size, p->p_vaddr, p) || - IS_SOLARIS_PT_INTERP (p, s)) && - (s->flags & SEC_ALLOC) != 0) + if ((IS_CONTAINED_BY (s->vma, s->_raw_size, p->p_vaddr, p) + || IS_SOLARIS_PT_INTERP (p, s)) + && (s->flags & SEC_ALLOC) != 0) ++csecs; else if (IS_COREFILE_NOTE (p, s)) ++csecs; @@ -3538,8 +3541,8 @@ copy_private_bfd_data (ibfd, obfd) /* Match up the physical address of the segment with the LMA address of the output section. */ - if (IS_CONTAINED_BY (os->lma, os->_raw_size, m->p_paddr, p) || - IS_COREFILE_NOTE (p, s)) + if (IS_CONTAINED_BY (os->lma, os->_raw_size, m->p_paddr, p) + || IS_COREFILE_NOTE (p, s)) { if (matching_lma == 0) matching_lma = os->lma; @@ -3611,8 +3614,8 @@ copy_private_bfd_data (ibfd, obfd) os = s->output_section; - if (IS_CONTAINED_BY (os->lma, os->_raw_size, m->p_paddr, p) || - IS_COREFILE_NOTE (p, s)) + if (IS_CONTAINED_BY (os->lma, os->_raw_size, m->p_paddr, p) + || IS_COREFILE_NOTE (p, s)) { if (m->count == 0) { |