PR ld/12921
authorAlan Modra <amodra@gmail.com>
Fri, 24 Jun 2011 03:36:40 +0000 (03:36 +0000)
committerAlan Modra <amodra@gmail.com>
Fri, 24 Jun 2011 03:36:40 +0000 (03:36 +0000)
* elf.c (assign_file_positions_for_load_sections): Don't align
sh_offset for all SHT_NOBITS sections here, just .tbss sections
that don't get a PT_LOAD.

bfd/ChangeLog
bfd/elf.c

index 877f0c8..066713d 100644 (file)
@@ -1,3 +1,10 @@
+2011-06-24  Alan Modra  <amodra@gmail.com>
+
+       PR ld/12921
+       * elf.c (assign_file_positions_for_load_sections): Don't align
+       sh_offset for all SHT_NOBITS sections here, just .tbss sections
+       that don't get a PT_LOAD.
+
 2011-06-22  Kaz Kojima  <kkojima@rr.iij4u.or.jp>
 
        * elf32-sh.c (sh_elf_relocate_section): Allow R_SH_TLS_LE_32 for PIE.
index 15e9087..0c1eb7d 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -4684,24 +4684,26 @@ assign_file_positions_for_load_sections (bfd *abfd,
            }
          else
            {
-             if (p->p_type == PT_LOAD
-                 || (this_hdr->sh_type == SHT_NOBITS
-                     && (this_hdr->sh_flags & SHF_TLS) != 0
-                     && this_hdr->sh_offset == 0))
+             if (p->p_type == PT_LOAD)
                {
-                 if (this_hdr->sh_type == SHT_NOBITS)
-                   {
-                     /* These sections don't really need sh_offset,
-                        but give them one anyway.  */
-                     bfd_vma adjust = vma_page_aligned_bias (this_hdr->sh_addr,
-                                                             off, align);
-                     this_hdr->sh_offset = sec->filepos = off + adjust;
-                   }
-                 else
-                   {
-                     this_hdr->sh_offset = sec->filepos = off;
-                     off += this_hdr->sh_size;
-                   }
+                 this_hdr->sh_offset = sec->filepos = off;
+                 if (this_hdr->sh_type != SHT_NOBITS)
+                   off += this_hdr->sh_size;
+               }
+             else if (this_hdr->sh_type == SHT_NOBITS
+                      && (this_hdr->sh_flags & SHF_TLS) != 0
+                      && this_hdr->sh_offset == 0)
+               {
+                 /* This is a .tbss section that didn't get a PT_LOAD.
+                    (See _bfd_elf_map_sections_to_segments "Create a
+                    final PT_LOAD".)  Set sh_offset to the value it
+                    would have if we had created a zero p_filesz and
+                    p_memsz PT_LOAD header for the section.  This
+                    also makes the PT_TLS header have the same
+                    p_offset value.  */
+                 bfd_vma adjust = vma_page_aligned_bias (this_hdr->sh_addr,
+                                                         off, align);
+                 this_hdr->sh_offset = sec->filepos = off + adjust;
                }
 
              if (this_hdr->sh_type != SHT_NOBITS)