diff options
-rw-r--r-- | bfd/ChangeLog | 3 | ||||
-rw-r--r-- | bfd/elfcode.h | 48 |
2 files changed, 29 insertions, 22 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 4eee113..32f9205 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,8 @@ Wed Nov 24 02:02:41 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + * elfcode.h (map_program_segments): Restore check of file_size != + mem_size, but only if SHT_PROGBITS. + * ecofflink.c: New file to hold ECOFF debug information linking routines. * ecoff.c (ecoff_clear_output_flags, ecoff_rel, ecoff_dump_seclet, diff --git a/bfd/elfcode.h b/bfd/elfcode.h index 1d44b2f..e8a40f7 100644 --- a/bfd/elfcode.h +++ b/bfd/elfcode.h @@ -1254,7 +1254,8 @@ DEFUN (elf_fake_sections, (abfd, asect, obj), this_hdr->sh_type = SHT_PROGBITS; else if ((asect->flags & SEC_ALLOC) && ((asect->flags & SEC_LOAD) == 0)) { - BFD_ASSERT (!strcmp (asect->name, ".bss")); + BFD_ASSERT (strcmp (asect->name, ".bss") == 0 + || strcmp (asect->name, ".sbss") == 0); this_hdr->sh_type = SHT_NOBITS; } /* FIXME I am not sure how to detect a .note section from the flags @@ -1710,8 +1711,6 @@ map_program_segments (abfd) { file_ptr f1; - if (file_size != mem_size) - break; if (done[i]) continue; i_shdrp = i_shdrpp[i]; @@ -1721,6 +1720,8 @@ map_program_segments (abfd) { if (i_shdrp->sh_offset - f1 != i_shdrp->sh_addr - high) continue; + if (file_size != mem_size) + break; } else /* sh_type == NOBITS */ { @@ -1818,6 +1819,7 @@ assign_file_positions_except_relocs (abfd) Elf_Internal_Shdr *i_shdrp; Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd); int exec_p = (abfd->flags & EXEC_P) != 0; + bfd_vma maxpagesize = get_elf_backend_data (abfd)->maxpagesize; /* Everything starts after the ELF file header. */ off = i_ehdrp->e_ehsize; @@ -1847,7 +1849,6 @@ assign_file_positions_except_relocs (abfd) } if (exec_p) { - bfd_vma maxpagesize = get_elf_backend_data (abfd)->maxpagesize; if (maxpagesize == 0) maxpagesize = 1; /* make the arithmetic work */ /* This isn't necessarily going to give the best packing, if the @@ -1860,30 +1861,33 @@ assign_file_positions_except_relocs (abfd) } /* Blindly assume that the segments are ordered optimally. With the default LD script, they will be. */ - { - /* need big unsigned type */ - bfd_vma addtl_off; - addtl_off = i_shdrp->sh_addr - off; - addtl_off = addtl_off % maxpagesize; - if (addtl_off) - { - off += addtl_off; - } - } - if (i_shdrp->sh_type == SHT_NOBITS) + if (i_shdrp->sh_type != SHT_NOBITS) { - file_ptr off2; - i_shdrp->sh_offset = off; - if (off % maxpagesize != 0) - off2 = maxpagesize - (off % maxpagesize); - if (off2 > i_shdrp->sh_size) - off2 = i_shdrp->sh_size; - off += off2; + /* need big unsigned type */ + bfd_vma addtl_off; + addtl_off = i_shdrp->sh_addr - off; + addtl_off = addtl_off % maxpagesize; + if (addtl_off) + { + off += addtl_off; + } } } off = assign_file_position_for_section (i_shdrp, off); if (exec_p + && i_shdrp->sh_type == SHT_NOBITS + && (i == i_ehdrp->e_shnum + || i_shdrpp[i + 1]->sh_type != SHT_NOBITS)) + { + /* Skip to the next page to ensure that when the file is + loaded the bss section is loaded with zeroes. I don't + know if this is required on all platforms, but it + shouldn't really hurt. */ + off = BFD_ALIGN (off, maxpagesize); + } + + if (exec_p && get_elf_backend_data(abfd)->maxpagesize > 1 && i_shdrp->sh_type == SHT_PROGBITS && (i_shdrp->sh_flags & SHF_ALLOC) |