* elfcode.h (map_program_segments): Restore check of file_size !=
authorIan Lance Taylor <ian@airs.com>
Wed, 24 Nov 1993 07:31:02 +0000 (07:31 +0000)
committerIan Lance Taylor <ian@airs.com>
Wed, 24 Nov 1993 07:31:02 +0000 (07:31 +0000)
mem_size, but only if SHT_PROGBITS.

bfd/ChangeLog
bfd/elfcode.h

index 4eee113f6c0dacc82378cda8a05f944cd3b86923..32f92057d04ddaa9c4d0741dd64d0458dacf9b29 100644 (file)
@@ -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,
index 1d44b2f3b7738a2c7c990a6a8af45bf8132c6040..e8a40f74c87aa5c8c490b15ed5bf6d36e2bba267 100644 (file)
@@ -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,29 +1861,32 @@ 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