aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog3
-rw-r--r--bfd/elfcode.h48
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)