include/elf/
authorAlan Modra <amodra@gmail.com>
Tue, 20 Jul 2010 14:08:32 +0000 (14:08 +0000)
committerAlan Modra <amodra@gmail.com>
Tue, 20 Jul 2010 14:08:32 +0000 (14:08 +0000)
* internal.h (ELF_TBSS_SPECIAL): New macro, extracted from..
(ELF_SECTION_SIZE): ..here.
(ELF_SECTION_IN_SEGMENT_1): Add "strict" arg.
(ELF_SECTION_IN_SEGMENT_STRICT): New macro.
bfd/
* elf.c (assign_file_positions_for_load_sections): Check that
zero size sections are allocated in segments too.
(assign_file_positions_for_non_load_sections): Warn if zero
size alloc sections are found here.
(copy_elf_program_header): Don't drop zero size sections from
segment map.
(copy_private_bfd_data): Check for changes in zero size sections.
binutils/
* readelf.c (process_program_headers): Don't ignore all zero size
sections.
ld/testsuite/
* ld-powerpc/tlsexe.r: Update.
* ld-powerpc/tlsexetoc.r: Update.
* ld-powerpc/tlsso.r: Update.
* ld-powerpc/tlstocso.r: Update.

bfd/ChangeLog
bfd/elf.c
binutils/ChangeLog
binutils/readelf.c
include/elf/ChangeLog
include/elf/internal.h
ld/testsuite/ChangeLog
ld/testsuite/ld-powerpc/tlsexe.r
ld/testsuite/ld-powerpc/tlsexetoc.r
ld/testsuite/ld-powerpc/tlsso.r
ld/testsuite/ld-powerpc/tlstocso.r

index a6dd0d8b2fa6dc7f4d065b2dcd585b1f0dfd8f75..aa36284e8e2977c848527a552a74d636e51190b2 100644 (file)
@@ -1,3 +1,13 @@
+2010-07-20  Alan Modra  <amodra@gmail.com>
+
+       * elf.c (assign_file_positions_for_load_sections): Check that
+       zero size sections are allocated in segments too.
+       (assign_file_positions_for_non_load_sections): Warn if zero
+       size alloc sections are found here.
+       (copy_elf_program_header): Don't drop zero size sections from
+       segment map.
+       (copy_private_bfd_data): Check for changes in zero size sections.
+
 2010-07-17  Alan Modra  <amodra@gmail.com>
 
        * elf.c (_bfd_elf_map_sections_to_segments): Force new segment
index 63f02606e4f63daee37aacd1e7bfada9fd490d5b..e7651ba3020fe0eb371c62f26ac1c64f35a40937 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -4589,8 +4589,7 @@ assign_file_positions_for_load_sections (bfd *abfd,
 
              sec = m->sections[i];
              this_hdr = &(elf_section_data(sec)->this_hdr);
-             if (this_hdr->sh_size != 0
-                 && !ELF_SECTION_IN_SEGMENT_1 (this_hdr, p, check_vma))
+             if (!ELF_SECTION_IN_SEGMENT_1 (this_hdr, p, check_vma, 0))
                {
                  (*_bfd_error_handler)
                    (_("%B: section `%A' can't be allocated in segment %d"),
@@ -4640,13 +4639,12 @@ assign_file_positions_for_non_load_sections (bfd *abfd,
        BFD_ASSERT (hdr->sh_offset == hdr->bfd_section->filepos);
       else if ((hdr->sh_flags & SHF_ALLOC) != 0)
        {
-         if (hdr->sh_size != 0)
-           ((*_bfd_error_handler)
-            (_("%B: warning: allocated section `%s' not in segment"),
-             abfd,
-             (hdr->bfd_section == NULL
-              ? "*unknown*"
-              : hdr->bfd_section->name)));
+         (*_bfd_error_handler)
+           (_("%B: warning: allocated section `%s' not in segment"),
+            abfd,
+            (hdr->bfd_section == NULL
+             ? "*unknown*"
+             : hdr->bfd_section->name));
          /* We don't need to page align empty sections.  */
          if ((abfd->flags & D_PAGED) != 0 && hdr->sh_size != 0)
            off += vma_page_aligned_bias (hdr->sh_addr, off,
@@ -5868,8 +5866,7 @@ copy_elf_program_header (bfd *ibfd, bfd *obfd)
           section = section->next)
        {
          this_hdr = &(elf_section_data(section)->this_hdr);
-         if (this_hdr->sh_size != 0
-             && ELF_SECTION_IN_SEGMENT (this_hdr, segment))
+         if (ELF_SECTION_IN_SEGMENT (this_hdr, segment))
            {
              if (!first_section)
                first_section = lowest_section = section;
@@ -5948,8 +5945,7 @@ copy_elf_program_header (bfd *ibfd, bfd *obfd)
               section = section->next)
            {
              this_hdr = &(elf_section_data(section)->this_hdr);
-             if (this_hdr->sh_size != 0
-                 && ELF_SECTION_IN_SEGMENT (this_hdr, segment))
+             if (ELF_SECTION_IN_SEGMENT (this_hdr, segment))
                {
                  map->sections[isec++] = section->output_section;
                  if (isec == section_count)
@@ -6026,8 +6022,7 @@ copy_private_bfd_data (bfd *ibfd, bfd *obfd)
 
              /* Check if this section is covered by the segment.  */
              this_hdr = &(elf_section_data(section)->this_hdr);
-             if (this_hdr->sh_size != 0
-                 && ELF_SECTION_IN_SEGMENT (this_hdr, segment))
+             if (ELF_SECTION_IN_SEGMENT (this_hdr, segment))
                {
                  /* FIXME: Check if its output section is changed or
                     removed.  What else do we need to check?  */
index 18c06c5475045587dab9a9525f1a43b328924bad..8e3ecb63a86e924044d6033de6249aec0b1ebb92 100644 (file)
@@ -1,3 +1,8 @@
+2010-07-20  Alan Modra  <amodra@gmail.com>
+
+       * readelf.c (process_program_headers): Don't ignore all zero size
+       sections.
+
 2010-07-19  Andreas Schwab  <schwab@redhat.com>
 
        * readelf.c (process_section_headers): Update key to flags.
index 883c48221e279e6709be22c927ee0a2cf761fd73..447932c3761c53817b563d8c8a21119305a3d0cd 100644 (file)
@@ -3889,8 +3889,8 @@ process_program_headers (FILE * file)
 
          for (j = 1; j < elf_header.e_shnum; j++, section++)
            {
-             if (ELF_SECTION_SIZE (section, segment) != 0
-                 && ELF_SECTION_IN_SEGMENT (section, segment))
+             if (!ELF_TBSS_SPECIAL (section, segment)
+                 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
                printf ("%s ", SECTION_NAME (section));
            }
 
index 8a8e118cac37e153ed1e4d3855ccbf59789639ef..edd9b48b003a11e29a800411f25e43320867e460 100644 (file)
@@ -1,3 +1,10 @@
+2010-07-20  Alan Modra  <amodra@gmail.com>
+
+       * internal.h (ELF_TBSS_SPECIAL): New macro, extracted from..
+       (ELF_SECTION_SIZE): ..here.
+       (ELF_SECTION_IN_SEGMENT_1): Add "strict" arg.
+       (ELF_SECTION_IN_SEGMENT_STRICT): New macro.
+
 2010-06-25  Alan Modra  <amodra@gmail.com>
 
        * ppc64.h (R_PPC64_LO_DS_OPT): Define.
index 1dd336dd6dad619b5e069588e928af9211b2ef3e..6998ae03c4523430e10e12faa4a520dbc19c9a3d 100644 (file)
@@ -291,37 +291,55 @@ struct elf_segment_map
 
 /* .tbss is special.  It doesn't contribute memory space to normal
    segments and it doesn't take file space in normal segments.  */
+#define ELF_TBSS_SPECIAL(sec_hdr, segment)                     \
+  (((sec_hdr)->sh_flags & SHF_TLS) != 0                                \
+   && (sec_hdr)->sh_type == SHT_NOBITS                         \
+   && (segment)->p_type != PT_TLS)
+
 #define ELF_SECTION_SIZE(sec_hdr, segment)                     \
-  ((!(((sec_hdr)->sh_flags & SHF_TLS) != 0                     \
-      && (sec_hdr)->sh_type == SHT_NOBITS)                     \
-    || (segment)->p_type == PT_TLS) ? (sec_hdr)->sh_size : 0)
-
-/* Decide if the given sec_hdr is in the given segment.  PT_TLS segment
-   contains only SHF_TLS sections.  Only PT_LOAD, PT_GNU_RELRO and
-   and PT_TLS segments can contain SHF_TLS sections.  */
-#define ELF_SECTION_IN_SEGMENT_1(sec_hdr, segment, check_vma)          \
-  ((((((sec_hdr)->sh_flags & SHF_TLS) != 0)                            \
+  (ELF_TBSS_SPECIAL(sec_hdr, segment) ? 0 : (sec_hdr)->sh_size)
+
+/* Decide if the section SEC_HDR is in SEGMENT.  If CHECK_VMA, then
+   VMAs are checked for alloc sections.  If STRICT, then a zero size
+   section won't match at the end of a segment, unless the segment
+   is also zero size.  */
+#define ELF_SECTION_IN_SEGMENT_1(sec_hdr, segment, check_vma, strict)  \
+  ((/* Only PT_LOAD, PT_GNU_RELRO and PT_TLS segments can contain      \
+       SHF_TLS sections.  */                                           \
+    ((((sec_hdr)->sh_flags & SHF_TLS) != 0)                            \
      && ((segment)->p_type == PT_TLS                                   \
         || (segment)->p_type == PT_GNU_RELRO                           \
         || (segment)->p_type == PT_LOAD))                              \
+    /* PT_TLS segment contains only SHF_TLS sections, PT_PHDR no       \
+       sections at all.  */                                            \
     || (((sec_hdr)->sh_flags & SHF_TLS) == 0                           \
        && (segment)->p_type != PT_TLS                                  \
        && (segment)->p_type != PT_PHDR))                               \
-   /* Any section besides one of type SHT_NOBITS must have a file      \
-      offset within the segment.  */                                   \
+   /* Any section besides one of type SHT_NOBITS must have file                \
+      offsets within the segment.  */                                  \
    && ((sec_hdr)->sh_type == SHT_NOBITS                                        \
        || ((bfd_vma) (sec_hdr)->sh_offset >= (segment)->p_offset       \
-          && ((sec_hdr)->sh_offset + ELF_SECTION_SIZE(sec_hdr, segment) \
-              <= (segment)->p_offset + (segment)->p_filesz)))          \
-   /* SHF_ALLOC sections must have VMAs within the segment.  Be                \
-      careful about segments right at the end of memory.  */           \
+          && (!(strict)                                                \
+              || ((sec_hdr)->sh_offset - (segment)->p_offset           \
+                  <= (segment)->p_filesz - 1))                         \
+          && (((sec_hdr)->sh_offset - (segment)->p_offset              \
+               + ELF_SECTION_SIZE(sec_hdr, segment))                   \
+              <= (segment)->p_filesz)))                                \
+   /* SHF_ALLOC sections must have VMAs within the segment.  */                \
    && (!(check_vma)                                                    \
        || ((sec_hdr)->sh_flags & SHF_ALLOC) == 0                       \
        || ((sec_hdr)->sh_addr >= (segment)->p_vaddr                    \
-          && ((sec_hdr)->sh_addr - (segment)->p_vaddr                  \
-              + ELF_SECTION_SIZE(sec_hdr, segment) <= (segment)->p_memsz))))
+          && (!(strict)                                                \
+              || ((sec_hdr)->sh_addr - (segment)->p_vaddr              \
+                  <= (segment)->p_memsz - 1))                          \
+          && (((sec_hdr)->sh_addr - (segment)->p_vaddr                 \
+               + ELF_SECTION_SIZE(sec_hdr, segment))                   \
+              <= (segment)->p_memsz))))
 
 #define ELF_SECTION_IN_SEGMENT(sec_hdr, segment)                       \
-  (ELF_SECTION_IN_SEGMENT_1 (sec_hdr, segment, 1))
+  (ELF_SECTION_IN_SEGMENT_1 (sec_hdr, segment, 1, 0))
+
+#define ELF_SECTION_IN_SEGMENT_STRICT(sec_hdr, segment)                        \
+  (ELF_SECTION_IN_SEGMENT_1 (sec_hdr, segment, 1, 1))
 
 #endif /* _ELF_INTERNAL_H */
index 4691310a4ac6fe11479281b96f057474c0816b6e..6ec6d55f44d030f076293a323045acf0da0439a6 100644 (file)
@@ -1,3 +1,10 @@
+2010-07-20  Alan Modra  <amodra@gmail.com>
+
+       * ld-powerpc/tlsexe.r: Update.
+       * ld-powerpc/tlsexetoc.r: Update.
+       * ld-powerpc/tlsso.r: Update.
+       * ld-powerpc/tlstocso.r: Update.
+
 2010-07-20  Alan Modra  <amodra@gmail.com>
 
        * ld-powerpc/vxworks-relax.s: Add branches to match expected output.
index db43d87c5fd0b563641c4a2a2024eb392f7c8cfa..68b36bb1e9ffb069d05b02c555b955485f4b01f4 100644 (file)
@@ -47,7 +47,7 @@ Program Headers:
  +0+ +
  +01 +\.interp 
  +02 +\.interp \.hash \.dynsym \.dynstr \.rela\.dyn \.rela\.plt \.text 
- +03 +\.tdata \.dynamic \.got \.plt 
+ +03 +\.tdata \.dynamic (\.branch_lt |)\.got \.plt 
  +04 +\.dynamic 
  +05 +\.tdata \.tbss 
 
index 82426acd4d68334230ad650f39bf396aa46d9deb..8ba85038f1595680d54ef24aa38bd45ea9a7c7d4 100644 (file)
@@ -47,7 +47,7 @@ Program Headers:
  +0+ +
  +01 +\.interp 
  +02 +\.interp \.hash \.dynsym \.dynstr \.rela\.dyn \.rela\.plt \.text 
- +03 +\.tdata \.dynamic \.got \.plt 
+ +03 +\.tdata \.dynamic (\.branch_lt |)\.got \.plt 
  +04 +\.dynamic 
  +05 +\.tdata \.tbss 
 
index fa792f35aab80b0633faaeb118b1a1d9fce66533..99c3659f64f014fb08b8dab0bc633d4e0d6dbf02 100644 (file)
@@ -40,7 +40,7 @@ Program Headers:
  Section to Segment mapping:
  +Segment Sections\.\.\.
  +0+ +\.hash \.dynsym \.dynstr \.rela\.dyn \.rela\.plt \.text 
- +01 +\.tdata \.dynamic \.got \.plt 
+ +01 +\.tdata \.dynamic (\.branch_lt |)\.got \.plt 
  +02 +\.dynamic 
  +03 +\.tdata \.tbss 
 
index 21ddeee63813c7f372f434b31759c57156558aaf..d04cf7087aefd50d2f30cd45c6638ca174c6a5b7 100644 (file)
@@ -40,7 +40,7 @@ Program Headers:
  Section to Segment mapping:
  +Segment Sections\.\.\.
  +0+ +\.hash \.dynsym \.dynstr \.rela\.dyn \.rela\.plt \.text 
- +01 +\.tdata \.dynamic \.got \.plt 
+ +01 +\.tdata \.dynamic (\.branch_lt |)\.got \.plt 
  +02 +\.dynamic 
  +03 +\.tdata \.tbss