Fix copying Solaris binaries with objcopy.
authorNick Clifton <nickc@redhat.com>
Thu, 14 Apr 2016 11:04:09 +0000 (12:04 +0100)
committerNick Clifton <nickc@redhat.com>
Thu, 14 Apr 2016 11:04:09 +0000 (12:04 +0100)
PR target/19938
bfd * elf-bbfd.h (struct elf_backend_data): New field:
elf_strtab_flags.
New field: elf_backend_set_special_section_info_and_link
* elfxx-target.h (elf_backend_strtab_flags): Define if not already
defined.
(elf_backend_set_special_section_info_and_link): Define if not
already defined.
(elfNN_bed): Use elf_backend_set_special_section_info_and_link and
elf_backend_strtab_flags macros to initialise fields in structure.
* elf.c (_bfd_elf_make_section_from_shdr): Check for SHF_STRINGS
being set even if SHF_MERGE is not set.
(elf_fake_sections): Likewise.
(section_match): New function.  Matches two ELF sections based
upon fixed characteristics.
(find_link): New function.  Locates a section in a BFD that
matches a section in a different BFD.
(_bfd_elf_copy_private_bfd_data): Copy the sh_info and sh_link
fields of reserved sections.
(bfd_elf_compute_section_file_positions): Set the flags for the
.shstrtab section based upon the elf_strtab_flags field in the
elf_backend_data structure.
(swap_out_syms): Likewise for the .strtab section.
* elflink.c (bfd_elf_final_link): Set the flags for the
.strtab section based upon the elf_strtab_flags field in the
elf_backend_data structure.
* elf32-i386.c (elf32_i386_set_special_info_link): New function.
(elf_backend_strtab_flags): Set to SHF_STRINGS for Solaris
targets.
(elf_backend_set_special_section_info_and_link): Define for
Solaris targets.
* elf32-sparc.c: Likewise.
* elf64-x86-64.c: Likewise.

binutils* testsuite/binutils-all/i386/compressed-1b.d: Allow for the
string sections possibly having the SHF_STRINGS flag bit set.
* testsuite/binutils-all/i386/compressed-1c.d: Likewise.
* testsuite/binutils-all/readelf.s: Likewise.
* testsuite/binutils-all/readelf.s-64: Likewise.
* testsuite/binutils-all/x86-64/compressed-1b.d: Likewise.
* testsuite/binutils-all/x86-64/compressed-1c.d: Likewise.

gas * testsuite/gas/i386/ilp32/x86-64-unwind.d: Allow for the string
sections possibly having the SHF_STRINGS flag bit set.
* testsuite/gas/i386/x86-64-unwind.d: Likewise.

19 files changed:
bfd/ChangeLog
bfd/elf-bfd.h
bfd/elf.c
bfd/elf32-i386.c
bfd/elf32-sparc.c
bfd/elf64-x86-64.c
bfd/elflink.c
bfd/elfxx-target.h
binutils/ChangeLog
binutils/testsuite/binutils-all/i386/compressed-1b.d
binutils/testsuite/binutils-all/i386/compressed-1c.d
binutils/testsuite/binutils-all/readelf.s
binutils/testsuite/binutils-all/readelf.s-64
binutils/testsuite/binutils-all/testprog.c
binutils/testsuite/binutils-all/x86-64/compressed-1b.d
binutils/testsuite/binutils-all/x86-64/compressed-1c.d
gas/ChangeLog
gas/testsuite/gas/i386/ilp32/x86-64-unwind.d
gas/testsuite/gas/i386/x86-64-unwind.d

index 578fbc73db058c14ab2b019f09381480f77192a6..0a0dd2c17a5e5beaa357f1615dbe5b5d9871e4f8 100644 (file)
@@ -1,3 +1,39 @@
+2016-04-14  Nick Clifton  <nickc@redhat.com>
+
+       PR target/19938
+       * elf-bbfd.h (struct elf_backend_data): New field:
+       elf_strtab_flags.
+       New field: elf_backend_set_special_section_info_and_link
+       * elfxx-target.h (elf_backend_strtab_flags): Define if not already
+       defined.
+       (elf_backend_set_special_section_info_and_link): Define if not
+       already defined.
+       (elfNN_bed): Use elf_backend_set_special_section_info_and_link and
+       elf_backend_strtab_flags macros to initialise fields in structure.
+       * elf.c (_bfd_elf_make_section_from_shdr): Check for SHF_STRINGS
+       being set even if SHF_MERGE is not set.
+       (elf_fake_sections): Likewise.
+       (section_match): New function.  Matches two ELF sections based
+       upon fixed characteristics.
+       (find_link): New function.  Locates a section in a BFD that
+       matches a section in a different BFD.
+       (_bfd_elf_copy_private_bfd_data): Copy the sh_info and sh_link
+       fields of reserved sections.
+       (bfd_elf_compute_section_file_positions): Set the flags for the
+       .shstrtab section based upon the elf_strtab_flags field in the
+       elf_backend_data structure.
+       (swap_out_syms): Likewise for the .strtab section.
+       * elflink.c (bfd_elf_final_link): Set the flags for the
+       .strtab section based upon the elf_strtab_flags field in the
+       elf_backend_data structure.
+       * elf32-i386.c (elf32_i386_set_special_info_link): New function.
+       (elf_backend_strtab_flags): Set to SHF_STRINGS for Solaris
+       targets.
+       (elf_backend_set_special_section_info_and_link): Define for
+       Solaris targets.
+       * elf32-sparc.c: Likewise.
+       * elf64-x86-64.c: Likewise.
+
 2016-04-11  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR ld/19939
index f820e857faf908178c74a268856ab17a5fc14216..5c93d78c394ec29dd479c1db8c23675315e06b7a 100644 (file)
@@ -1300,6 +1300,14 @@ struct elf_backend_data
   /* Return the section which RELOC_SEC applies to.  */
   asection *(*get_reloc_section) (asection *reloc_sec);
 
+  /* Called when setting the sh_link and sh_info fields of a section with a
+     type >= SHT_LOOS.  Returns TRUE if these fields were initialised in
+     OHEADER, FALSE otherwise.  IHEADER is the best guess matching section
+     from the input bfd IBFD.  */
+  bfd_boolean (*elf_backend_set_special_section_info_and_link)
+    (const bfd *ibfd, bfd *obfd, const Elf_Internal_Shdr *iheader,
+     Elf_Internal_Shdr *oheader);
+               
   /* Used to handle bad SHF_LINK_ORDER input.  */
   bfd_error_handler_type link_order_error_handler;
 
@@ -1361,6 +1369,9 @@ struct elf_backend_data
   /* Alignment for the PT_GNU_STACK segment. */
   unsigned stack_align;
 
+  /* Flag bits to assign to a section of type SHT_STRTAB.  */
+  unsigned long elf_strtab_flags;
+
   /* This is TRUE if the linker should act like collect and gather
      global constructors and destructors by name.  This is TRUE for
      MIPS ELF because the Irix 5 tools can not handle the .init
index 90319a2702116799567a73444d5b79772005feab..408dab7f3396d0fa1a7129c5a57239350b22ce7f 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -970,9 +970,9 @@ _bfd_elf_make_section_from_shdr (bfd *abfd,
     {
       flags |= SEC_MERGE;
       newsect->entsize = hdr->sh_entsize;
-      if ((hdr->sh_flags & SHF_STRINGS) != 0)
-       flags |= SEC_STRINGS;
     }
+  if ((hdr->sh_flags & SHF_STRINGS) != 0)
+    flags |= SEC_STRINGS;
   if (hdr->sh_flags & SHF_GROUP)
     if (!setup_group (abfd, hdr, newsect))
       return FALSE;
@@ -1175,7 +1175,8 @@ _bfd_elf_make_section_from_shdr (bfd *abfd,
   return TRUE;
 }
 
-const char *const bfd_elf_section_type_names[] = {
+const char *const bfd_elf_section_type_names[] =
+{
   "SHT_NULL", "SHT_PROGBITS", "SHT_SYMTAB", "SHT_STRTAB",
   "SHT_RELA", "SHT_HASH", "SHT_DYNAMIC", "SHT_NOTE",
   "SHT_NOBITS", "SHT_REL", "SHT_SHLIB", "SHT_DYNSYM",
@@ -1212,14 +1213,62 @@ bfd_elf_generic_reloc (bfd *abfd ATTRIBUTE_UNUSED,
   return bfd_reloc_continue;
 }
 \f
+/* Returns TRUE if section A matches section B.
+   Names, addresses and links may be different, but everything else
+   should be the same.  */
+
+static bfd_boolean
+section_match (Elf_Internal_Shdr * a, Elf_Internal_Shdr * b)
+{
+  return
+    a->sh_type         == b->sh_type
+    && a->sh_flags     == b->sh_flags
+    && a->sh_addralign == b->sh_addralign
+    && a->sh_size      == b->sh_size
+    && a->sh_entsize   == b->sh_entsize
+    /* FIXME: Check sh_addr ?  */
+    ;
+}
+
+/* Find a section in OBFD that has the same characteristics
+   as IHEADER.  Return the index of this section or SHN_UNDEF if
+   none can be found.  Check's section HINT first, as this is likely
+   to be the correct section.  */
+
+static unsigned int
+find_link (bfd * obfd, Elf_Internal_Shdr * iheader, unsigned int hint)
+{
+  Elf_Internal_Shdr ** oheaders = elf_elfsections (obfd);
+  unsigned int i;
+
+  if (section_match (oheaders[hint], iheader))
+    return hint;
+
+  for (i = 1; i < elf_numsections (obfd); i++)
+    {
+      Elf_Internal_Shdr * oheader = oheaders[i];
+
+      if (section_match (oheader, iheader))
+       /* FIXME: Do we care if there is a potential for
+          multiple matches ?  */
+       return i;
+    }
+
+  return SHN_UNDEF;
+}
+
 /* Copy the program header and other data from one object module to
    another.  */
 
 bfd_boolean
 _bfd_elf_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
 {
+  Elf_Internal_Shdr ** iheaders = elf_elfsections (ibfd);
+  Elf_Internal_Shdr ** oheaders = elf_elfsections (obfd);
+  unsigned int i;
+
   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
-      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
+    || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
     return TRUE;
 
   if (!elf_flags_init (obfd))
@@ -1237,59 +1286,126 @@ _bfd_elf_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
   /* Copy object attributes.  */
   _bfd_elf_copy_obj_attributes (ibfd, obfd);
 
-  /* This is an feature for objcopy --only-keep-debug:  When a section's type
-     is changed to NOBITS, we preserve the sh_link and sh_info fields so that
-     they can be matched up with the original.  */
-  Elf_Internal_Shdr ** iheaders = elf_elfsections (ibfd);
-  Elf_Internal_Shdr ** oheaders = elf_elfsections (obfd);
+  if (iheaders == NULL || oheaders == NULL)
+    return TRUE;
 
-  if (iheaders != NULL && oheaders != NULL)
+  /* Possibly copy the sh_info and sh_link fields.  */
+  for (i = 1; i < elf_numsections (obfd); i++)
     {
-      unsigned int i;
-
-      for (i = 0; i < elf_numsections (obfd); i++)
-       {
-         unsigned int j;
-         Elf_Internal_Shdr * oheader = oheaders[i];
+      unsigned int j;
+      Elf_Internal_Shdr * oheader = oheaders[i];
 
-         if (oheader == NULL
-             || oheader->sh_type != SHT_NOBITS
-             || oheader->sh_size == 0
-             || (oheader->sh_info != 0 && oheader->sh_link != 0))
-           continue;
+      if (oheader == NULL
+         || (oheader->sh_type != SHT_NOBITS
+             && oheader->sh_type < SHT_LOOS)
+         || oheader->sh_size == 0
+         || (oheader->sh_info != 0 && oheader->sh_link != 0))
+       continue;
 
-         /* Scan for the matching section in the input bfd.
-            FIXME: We could use something better than a linear scan here.
-            Unfortunately we cannot compare names as the output string table
-            is empty, so instead we check size, address and type.  */
-         for (j = 0; j < elf_numsections (ibfd); j++)
+      /* Scan for the matching section in the input bfd.
+        FIXME: We could use something better than a linear scan here.
+        Unfortunately we cannot compare names as the output string table
+        is empty, so instead we check size, address and type.  */
+      for (j = 1; j < elf_numsections (ibfd); j++)
+       {
+         Elf_Internal_Shdr * iheader = iheaders[j];
+
+         /* Since --only-keep-debug turns all non-debug sections into
+            SHT_NOBITS sections, the output SHT_NOBITS type matches any
+            input type.  */
+         if ((oheader->sh_type == SHT_NOBITS
+              || iheader->sh_type == oheader->sh_type)
+             && iheader->sh_flags == oheader->sh_flags
+             && iheader->sh_addralign == oheader->sh_addralign
+             && iheader->sh_entsize == oheader->sh_entsize
+             && iheader->sh_size == oheader->sh_size
+             && iheader->sh_addr == oheader->sh_addr
+             && (iheader->sh_info != oheader->sh_info
+                 || iheader->sh_link != oheader->sh_link))
            {
-             Elf_Internal_Shdr * iheader = iheaders[j];
-
-             /* Since --only-keep-debug turns all non-debug sections
-                into SHT_NOBITS sections, the output SHT_NOBITS type
-                matches any input type.  */
-             if ((oheader->sh_type == SHT_NOBITS
-                  || iheader->sh_type == oheader->sh_type)
-                 && iheader->sh_flags == oheader->sh_flags
-                 && iheader->sh_addralign == oheader->sh_addralign
-                 && iheader->sh_entsize == oheader->sh_entsize
-                 && iheader->sh_size == oheader->sh_size
-                 && iheader->sh_addr == oheader->sh_addr
-                 && (iheader->sh_info != oheader->sh_info
-                     || iheader->sh_link != oheader->sh_link))
+             /* PR 19938: Attempt to preserve the sh_link and sh_info fields
+                of OS and Processor specific sections.  We try harder for
+                these sections, because this is not just about matching
+                stripped binaries to their originals.  */
+             if (oheader->sh_type >= SHT_LOOS)
                {
-                 /* Note: Strictly speaking these assignments are wrong.
+                 const struct elf_backend_data *bed = get_elf_backend_data (obfd);
+                 bfd_boolean changed = FALSE;
+                 unsigned int link;
+
+                 /* Allow the target a chance to decide how these fields should
+                    be set.  */
+                 if (bed->elf_backend_set_special_section_info_and_link != NULL
+                     && bed->elf_backend_set_special_section_info_and_link
+                     (ibfd, obfd, iheader, oheader))
+                   break;
+
+                 /* We have iheader which matches oheader, but which has
+                    non-zero sh_info and/or sh_link fields.  Attempt to
+                    follow those links and find the section in the output
+                    bfd which corresponds to the linked section in the input
+                    bfd.  */
+                 if (iheader->sh_link != SHN_UNDEF)
+                   {
+                     link = find_link (obfd, iheaders[iheader->sh_link],
+                                       iheader->sh_link);
+                     if (link != SHN_UNDEF)
+                       {
+                         oheader->sh_link = link;
+                         changed = TRUE;
+                       }
+                     else
+                       /* FIXME: Should we install iheader->sh_link
+                          if we could not find a match ?  */
+                       (* _bfd_error_handler)
+                         (_("%B: Failed to find link section for section %d"),
+                          obfd, i);
+                   }
+
+                 if (iheader->sh_info)
+                   {
+                     /* The sh_info field can hold arbitrary information,
+                        but if the SHF_LINK_INFO flag is set then it
+                        should be interpreted as a section index.  */
+                     if (iheader->sh_flags & SHF_INFO_LINK)
+                       link = find_link (obfd, iheaders[iheader->sh_info],
+                                         iheader->sh_info);
+                     else
+                       /* No idea what it means - just copy it.  */
+                       link = iheader->sh_info;
+                         
+                     if (link != SHN_UNDEF)
+                       {
+                         oheader->sh_info = link;
+                         changed = TRUE;
+                       }
+                     else
+                       (* _bfd_error_handler)
+                         (_("%B: Failed to find info section for section %d"),
+                          obfd, i);
+                   }
+
+                 if (changed)
+                   break;
+               }
+             else
+               {
+                 /* This is an feature for objcopy --only-keep-debug:
+                    When a section's type is changed to NOBITS, we preserve
+                    the sh_link and sh_info fields so that they can be
+                    matched up with the original.
+
+                    Note: Strictly speaking these assignments are wrong.
                     The sh_link and sh_info fields should point to the
                     relevent sections in the output BFD, which may not be in
-                    the same location as they were in the input BFD.  But the
-                    whole point of this action is to preserve the original
-                    values of the sh_link and sh_info fields, so that they
-                    can be matched up with the section headers in the
-                    original file.  So strictly speaking we may be creating
-                    an invalid ELF file, but it is only for a file that just
-                    contains debug info and only for sections without any
-                    contents.  */
+                    the same location as they were in the input BFD.  But
+                    the whole point of this action is to preserve the
+                    original values of the sh_link and sh_info fields, so
+                    that they can be matched up with the section headers in
+                    the original file.  So strictly speaking we may be
+                    creating an invalid ELF file, but it is only for a file
+                    that just contains debug info and only for sections
+                    without any contents.  */
                  if (oheader->sh_link == 0)
                    oheader->sh_link = iheader->sh_link;
                  if (oheader->sh_info == 0)
@@ -3099,9 +3215,9 @@ elf_fake_sections (bfd *abfd, asection *asect, void *fsarg)
     {
       this_hdr->sh_flags |= SHF_MERGE;
       this_hdr->sh_entsize = asect->entsize;
-      if ((asect->flags & SEC_STRINGS) != 0)
-       this_hdr->sh_flags |= SHF_STRINGS;
     }
+  if ((asect->flags & SEC_STRINGS) != 0)
+    this_hdr->sh_flags |= SHF_STRINGS;
   if ((asect->flags & SEC_GROUP) == 0 && elf_group_name (asect) != NULL)
     this_hdr->sh_flags |= SHF_GROUP;
   if ((asect->flags & SEC_THREAD_LOCAL) != 0)
@@ -3919,7 +4035,7 @@ _bfd_elf_compute_section_file_positions (bfd *abfd,
   shstrtab_hdr = &elf_tdata (abfd)->shstrtab_hdr;
   /* sh_name was set in prep_headers.  */
   shstrtab_hdr->sh_type = SHT_STRTAB;
-  shstrtab_hdr->sh_flags = 0;
+  shstrtab_hdr->sh_flags = bed->elf_strtab_flags;
   shstrtab_hdr->sh_addr = 0;
   /* sh_size is set in _bfd_elf_assign_file_positions_for_non_load.  */
   shstrtab_hdr->sh_entsize = 0;
@@ -7551,8 +7667,7 @@ Unable to find equivalent output section for symbol '%s' from section '%s'"),
   *sttp = stt;
   symstrtab_hdr->sh_size = _bfd_elf_strtab_size (stt);
   symstrtab_hdr->sh_type = SHT_STRTAB;
-
-  symstrtab_hdr->sh_flags = 0;
+  symstrtab_hdr->sh_flags = bed->elf_strtab_flags;
   symstrtab_hdr->sh_addr = 0;
   symstrtab_hdr->sh_entsize = 0;
   symstrtab_hdr->sh_link = 0;
index 376f2cc0482786c3af11d50e3379913c2fe2f3a3..470fcd10ccc896e7b279460c894ac04b75a1f433 100644 (file)
@@ -6051,16 +6051,94 @@ elf_i386_fbsd_post_process_headers (bfd *abfd, struct bfd_link_info *info)
 
 /* The 32-bit static TLS arena size is rounded to the nearest 8-byte
    boundary.  */
-#undef elf_backend_static_tls_alignment
+#undef  elf_backend_static_tls_alignment
 #define elf_backend_static_tls_alignment 8
 
 /* The Solaris 2 ABI requires a plt symbol on all platforms.
 
    Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output
    File, p.63.  */
-#undef elf_backend_want_plt_sym
+#undef  elf_backend_want_plt_sym
 #define elf_backend_want_plt_sym       1
 
+#undef  elf_backend_strtab_flags
+#define elf_backend_strtab_flags       SHF_STRINGS
+
+static bfd_boolean
+elf32_i386_set_special_info_link (const bfd *ibfd ATTRIBUTE_UNUSED,
+                                 bfd *obfd ATTRIBUTE_UNUSED,
+                                 const Elf_Internal_Shdr *isection ATTRIBUTE_UNUSED,
+                                 Elf_Internal_Shdr *osection ATTRIBUTE_UNUSED)
+{
+  /* PR 19938: FIXME: Need to add code for setting the sh_info
+     and sh_link fields of Solaris specific section types.
+
+     Based upon Oracle Solaris 11.3 Linkers and Libraries Guide, Ch. 13,
+     Object File Format, Table 13-9  ELF sh_link and sh_info Interpretation:
+
+http://docs.oracle.com/cd/E53394_01/html/E54813/chapter6-94076.html#scrolltoc
+
+     The following values should be set:
+     
+Type                 Link                           Info
+-----------------------------------------------------------------------------
+SHT_SUNW_ancillary   The section header index of    0
+ [0x6fffffee]        the associated string table.
+       
+SHT_SUNW_capinfo     The section header index of    For a dynamic object, the
+ [0x6ffffff0]        the associated symbol table.   section header index of
+                                                    the associated
+                                                   SHT_SUNW_capchain table,
+                                                   otherwise 0.
+
+SHT_SUNW_symsort     The section header index of    0
+ [0x6ffffff1]        the associated symbol table.
+
+SHT_SUNW_tlssort     The section header index of    0
+ [0x6ffffff2]        the associated symbol table.
+       
+SHT_SUNW_LDYNSYM     The section header index of    One greater than the 
+ [0x6ffffff3]        the associated string table.   symbol table index of the
+                    This index is the same string  last local symbol, 
+                    table used by the SHT_DYNSYM   STB_LOCAL. Since
+                    section.                       SHT_SUNW_LDYNSYM only
+                                                   contains local symbols,
+                                                   sh_info is equivalent to
+                                                   the number of symbols in
+                                                   the table.
+
+SHT_SUNW_cap         If symbol capabilities exist,  If any capabilities refer
+ [0x6ffffff5]        the section header index of    to named strings, the
+                     the associated                 section header index of
+                    SHT_SUNW_capinfo table,        the associated string 
+                         otherwise 0.              table, otherwise 0.
+
+SHT_SUNW_move        The section header index of    0
+ [0x6ffffffa]        the associated symbol table.
+       
+SHT_SUNW_COMDAT      0                              0
+ [0x6ffffffb]
+
+SHT_SUNW_syminfo     The section header index of    The section header index
+ [0x6ffffffc]        the associated symbol table.   of the associated
+                                                   .dynamic section.
+
+SHT_SUNW_verdef      The section header index of    The number of version 
+ [0x6ffffffd]        the associated string table.   definitions within the
+                                                   section.
+
+SHT_SUNW_verneed     The section header index of    The number of version
+ [0x6ffffffe]        the associated string table.   dependencies within the
+                                                    section.
+
+SHT_SUNW_versym      The section header index of    0
+ [0x6fffffff]        the associated symbol table.  */
+  return FALSE;
+}
+
+#undef  elf_backend_set_special_section_info_and_link
+#define elf_backend_set_special_section_info_and_link elf32_i386_set_special_info_link
+
 #include "elf32-target.h"
 
 /* Intel MCU support.  */
@@ -6077,7 +6155,7 @@ elf32_iamcu_elf_object_p (bfd *abfd)
 #define TARGET_LITTLE_SYM              iamcu_elf32_vec
 #undef  TARGET_LITTLE_NAME
 #define TARGET_LITTLE_NAME             "elf32-iamcu"
-#undef ELF_ARCH
+#undef  ELF_ARCH
 #define ELF_ARCH                       bfd_arch_iamcu
 
 #undef ELF_MACHINE_CODE
@@ -6096,6 +6174,9 @@ elf32_iamcu_elf_object_p (bfd *abfd)
 #undef elf_backend_want_plt_sym
 #define elf_backend_want_plt_sym           0
 
+#undef  elf_backend_strtab_flags
+#undef  elf_backend_set_special_section_info_and_link
+
 #include "elf32-target.h"
 
 /* Restore defaults.  */
index 213d20a13822d8f45b1d01d2aac9288e18223cb9..c045854f89a22f3ee89568d5da6f2302879df8c1 100644 (file)
@@ -258,9 +258,26 @@ elf32_sparc_add_symbol_hook (bfd * abfd,
 
 /* The 32-bit static TLS arena size is rounded to the nearest 8-byte
    boundary.  */
-#undef elf_backend_static_tls_alignment
+#undef  elf_backend_static_tls_alignment
 #define elf_backend_static_tls_alignment       8
 
+#undef  elf_backend_strtab_flags
+#define elf_backend_strtab_flags       SHF_STRINGS
+
+static bfd_boolean
+elf32_sparc_set_special_info_link (const bfd *ibfd ATTRIBUTE_UNUSED,
+                                  bfd *obfd ATTRIBUTE_UNUSED,
+                                  const Elf_Internal_Shdr *isection ATTRIBUTE_UNUSED,
+                                  Elf_Internal_Shdr *osection ATTRIBUTE_UNUSED)
+{
+  /* PR 19938: FIXME: Need to add code for setting the sh_info
+     and sh_link fields of Solaris specific section types.  */
+  return FALSE;
+}
+
+#undef  elf_backend_set_special_section_info_and_link
+#define elf_backend_set_special_section_info_and_link elf32_sparc_set_special_info_link
+
 #include "elf32-target.h"
 
 /* A wrapper around _bfd_sparc_elf_link_hash_table_create that identifies
@@ -292,39 +309,41 @@ elf32_sparc_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker)
   elf_vxworks_final_write_processing (abfd, linker);
 }
 
-#undef TARGET_BIG_SYM
+#undef  TARGET_BIG_SYM
 #define TARGET_BIG_SYM sparc_elf32_vxworks_vec
-#undef TARGET_BIG_NAME
+#undef  TARGET_BIG_NAME
 #define TARGET_BIG_NAME        "elf32-sparc-vxworks"
 
-#undef ELF_MINPAGESIZE
+#undef  ELF_MINPAGESIZE
 #define ELF_MINPAGESIZE        0x1000
 
 #undef bfd_elf32_bfd_link_hash_table_create
 #define bfd_elf32_bfd_link_hash_table_create \
   elf32_sparc_vxworks_link_hash_table_create
 
-#undef elf_backend_want_got_plt
+#undef  elf_backend_want_got_plt
 #define elf_backend_want_got_plt               1
-#undef elf_backend_plt_readonly
+#undef  elf_backend_plt_readonly
 #define elf_backend_plt_readonly               1
-#undef elf_backend_got_header_size
+#undef  elf_backend_got_header_size
 #define elf_backend_got_header_size            12
-#undef elf_backend_add_symbol_hook
+#undef  elf_backend_add_symbol_hook
 #define elf_backend_add_symbol_hook \
   elf_vxworks_add_symbol_hook
-#undef elf_backend_link_output_symbol_hook
+#undef  elf_backend_link_output_symbol_hook
 #define elf_backend_link_output_symbol_hook \
   elf_vxworks_link_output_symbol_hook
-#undef elf_backend_emit_relocs
+#undef  elf_backend_emit_relocs
 #define elf_backend_emit_relocs \
   elf_vxworks_emit_relocs
-#undef elf_backend_final_write_processing
+#undef  elf_backend_final_write_processing
 #define elf_backend_final_write_processing \
   elf32_sparc_vxworks_final_write_processing
-#undef elf_backend_static_tls_alignment
+#undef  elf_backend_static_tls_alignment
+#undef  elf_backend_strtab_flags
+#undef  elf_backend_set_special_section_info_and_link
 
-#undef elf32_bed
+#undef  elf32_bed
 #define elf32_bed                              sparc_elf_vxworks_bed
 
 #include "elf32-target.h"
index b58a699ab09bfaff0bfa66563cf5d04881ce72bb..5533b4ad526940a6e1f7478635d0c26c8317db20 100644 (file)
@@ -6708,16 +6708,33 @@ static const struct bfd_elf_special_section
 
 /* The 64-bit static TLS arena size is rounded to the nearest 16-byte
    boundary.  */
-#undef elf_backend_static_tls_alignment
+#undef  elf_backend_static_tls_alignment
 #define elf_backend_static_tls_alignment    16
 
 /* The Solaris 2 ABI requires a plt symbol on all platforms.
 
    Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output
    File, p.63.  */
-#undef elf_backend_want_plt_sym
+#undef  elf_backend_want_plt_sym
 #define elf_backend_want_plt_sym           1
 
+#undef  elf_backend_strtab_flags
+#define elf_backend_strtab_flags       SHF_STRINGS
+
+static bfd_boolean
+elf64_x86_64_set_special_info_link (const bfd *ibfd ATTRIBUTE_UNUSED,
+                                   bfd *obfd ATTRIBUTE_UNUSED,
+                                   const Elf_Internal_Shdr *isection ATTRIBUTE_UNUSED,
+                                   Elf_Internal_Shdr *osection ATTRIBUTE_UNUSED)
+{
+  /* PR 19938: FIXME: Need to add code for setting the sh_info
+     and sh_link fields of Solaris specific section types.  */
+  return FALSE;
+}
+
+#undef  elf_backend_set_special_section_info_and_link
+#define elf_backend_set_special_section_info_and_link elf64_x86_64_set_special_info_link
+
 #include "elf64-target.h"
 
 /* Native Client support.  */
@@ -6749,6 +6766,8 @@ elf64_x86_64_nacl_elf_object_p (bfd *abfd)
 #undef elf_backend_static_tls_alignment
 #undef elf_backend_want_plt_sym
 #define elf_backend_want_plt_sym       0
+#undef  elf_backend_strtab_flags
+#undef  elf_backend_set_special_section_info_and_link
 
 /* NaCl uses substantially different PLT entries for the same effects.  */
 
index 42b3689048ceebd31e65e9850c439ce465616fe6..37638b2f2c88134ace1abe4bf0ce30f835623dae 100644 (file)
@@ -11705,7 +11705,7 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info)
       symstrtab_hdr = &elf_tdata (abfd)->strtab_hdr;
       /* sh_name was set in prep_headers.  */
       symstrtab_hdr->sh_type = SHT_STRTAB;
-      symstrtab_hdr->sh_flags = 0;
+      symstrtab_hdr->sh_flags = bed->elf_strtab_flags;
       symstrtab_hdr->sh_addr = 0;
       symstrtab_hdr->sh_size = _bfd_elf_strtab_size (flinfo.symstrtab);
       symstrtab_hdr->sh_entsize = 0;
index ca30b1d9d1437accb3d50a5e5611e40f2dfb9a74..c179721ac685adb586c5d0d68b4e44b9dedd26bc 100644 (file)
 #ifndef elf_backend_stack_align
 #define elf_backend_stack_align 16
 #endif
+#ifndef elf_backend_strtab_flags
+#define elf_backend_strtab_flags 0
+#endif
 
 #define bfd_elfNN_bfd_debug_info_start bfd_void
 #define bfd_elfNN_bfd_debug_info_end   bfd_void
 #define elf_backend_get_reloc_section _bfd_elf_get_reloc_section
 #endif
 
+#ifndef elf_backend_set_special_section_info_and_link
+#define elf_backend_set_special_section_info_and_link NULL
+#endif
+
 #ifndef elf_backend_compact_eh_encoding
 #define elf_backend_compact_eh_encoding NULL
 #endif
@@ -786,6 +793,7 @@ static struct elf_backend_data elfNN_bed =
   elf_backend_is_function_type,
   elf_backend_maybe_function_sym,
   elf_backend_get_reloc_section,
+  elf_backend_set_special_section_info_and_link,
   elf_backend_link_order_error_handler,
   elf_backend_relplt_name,
   ELF_MACHINE_ALT1,
@@ -804,6 +812,7 @@ static struct elf_backend_data elfNN_bed =
   elf_backend_cant_unwind_opcode,
   elf_backend_static_tls_alignment,
   elf_backend_stack_align,
+  elf_backend_strtab_flags,
   elf_backend_collect,
   elf_backend_type_change_ok,
   elf_backend_may_use_rel_p,
index 07b6d13f15c7a6a93a48c9cf38780a0494e3789c..6edcaa53bc54528fe1bae291d4054e0832acd614 100644 (file)
@@ -1,6 +1,17 @@
+2016-04-14  Nick Clifton  <nickc@redhat.com>
+
+       PR target/19938
+       * testsuite/binutils-all/i386/compressed-1b.d: Allow for the
+       string sections possibly having the SHF_STRINGS flag bit set.
+       * testsuite/binutils-all/i386/compressed-1c.d: Likewise.
+       * testsuite/binutils-all/readelf.s: Likewise.
+       * testsuite/binutils-all/readelf.s-64: Likewise.
+       * testsuite/binutils-all/x86-64/compressed-1b.d: Likewise.
+       * testsuite/binutils-all/x86-64/compressed-1c.d: Likewise.
+
 2016-04-13  Nick Clifton  <nickc@redhat.com>
 
-       PR target/19983
+       PR target/19938
        * readelf.c (get_solaris_section_type): New function: Returns the
        name of Solaris specific section types.
        (get_solaris_dynamic_type): New function: Return the name of
index 40bd5e694818f46f7ae3cf2f85206894c1de35cb..d74af4d160cc3d8c4005a35d86f11dcd1bd188b5 100644 (file)
@@ -13,6 +13,6 @@ Section Headers:
   \[ 1\] .text             PROGBITS        00000000 000040 00001b 00  AX  0   0 16
   \[ 2\] .data             PROGBITS        00000000 00005b 000000 00  WA  0   0  1
   \[ 3\] .bss              NOBITS          00000000 00005b 000000 00  WA  0   0  1
-  \[ 4\] .shstrtab         STRTAB          00000000 [0-9a-f]+ 00001c 00      0   0  1
+  \[ 4\] .shstrtab         STRTAB          00000000 [0-9a-f]+ 00001c 00   .  0   0  1
 Key to Flags:
 #...
index 1f46e3cea341a8206eb0d0fce045bf37b5f33ba8..3a0cba50694d9b95875c67de238b9214218f9167 100644 (file)
@@ -13,6 +13,6 @@ Section Headers:
   \[ 1\] .text             PROGBITS        00000000 000040 00001b 00  AX  0   0 16
   \[ 2\] .data             PROGBITS        00000000 00005b 000000 00  WA  0   0  1
   \[ 3\] .bss              NOBITS          00000000 00005b 000000 00  WA  0   0  1
-  \[ 4\] .shstrtab         STRTAB          00000000 [0-9a-f]+ 00001c 00      0   0  1
+  \[ 4\] .shstrtab         STRTAB          00000000 [0-9a-f]+ 00001c 00 .* 0   0  1
 Key to Flags:
 #...
index 3b044b1072dedd3065a9945279ca104cfd98283f..22b38435b5ff572edad3be3168a17a06381ff695 100644 (file)
@@ -14,8 +14,8 @@ Section Headers:
 # MIPS targets put .reginfo, .mdebug, .MIPS.abiflags and .gnu.attributes here.
 # v850 targets put .call_table_data and .call_table_text here.
 #...
- +\[ .\] .shstrtab +STRTAB +00000000 0+.* 0+.* 00 +0 +0 +.
+ +\[ .\] .shstrtab +STRTAB +00000000 0+.* 0+.* 00 .* +0 +0 +.
  +\[..\] .symtab +SYMTAB +00000000 0+.* 0+.* 10 +.. +.+ +4
- +\[..\] .strtab +STRTAB +00000000 0+.* 0+.* 00 +0 +0 +1
+ +\[..\] .strtab +STRTAB +00000000 0+.* 0+.* 00 .* +0 +0 +1
 Key to Flags:
 #...
index 40b1f5aae4c5e69d8a135c03bbc7a0785c11ff0e..d1983003944e66b0bedc74c0579cea6df6c817e0 100644 (file)
@@ -14,11 +14,11 @@ Section Headers:
  +\[ 4\] .bss +NOBITS +0000000000000000 +000000(4c|50|54|58)
  +0000000000000000 +0000000000000000 +WA +0 +0 +.*
  +\[ 5\] .shstrtab +STRTAB +0000000000000000 +[0-9a-f]+
- +00000000000000.. +0000000000000000 +0 +0 +.*
+ +00000000000000.. +0000000000000000 .* +0 +0 +.*
  +\[ 6\] .symtab +SYMTAB +0000000000000000 +0+.*
 # aarch64-elf targets have one more data symbol.
  +0+.* +0000000000000018 +7 +(6|7) +8
  +\[ 7\] .strtab +STRTAB +0000000000000000 +0+.*
- +0+.* +0000000000000000 +0 +0 +1
+ +0+.* +0000000000000000 .* +0 +0 +1
 Key to Flags:
 #...
index 6ead98e721f08d2a8e20239b866d0826172b7ff6..b8531e22674b62a44633eaabce08566e69dc5152 100644 (file)
@@ -1,12 +1,12 @@
 /* This program is used to test objcopy, readelf and strip.  */
 
-extern int strcmp (char *, const char *);
+extern int strcmp (const char *, const char *);
 extern int printf (const char *, ...);
 
 int common;
 int global = 1;
 static int local = 2;
-static char string[] = "string";
+static const char string[] = "string";
 
 int
 fn (void)
index f55efacc53fc869c4566076d4dd3a0d160163d66..040bdd3a670e53a7f6b9246f780f5025241219ae 100644 (file)
@@ -13,6 +13,6 @@ Section Headers:
   \[ 1\] .text             PROGBITS        0000000000000000 000040 000015 00  AX  0   0 16
   \[ 2\] .data             PROGBITS        0000000000000000 000055 000000 00  WA  0   0  1
   \[ 3\] .bss              NOBITS          0000000000000000 000055 000000 00  WA  0   0  1
-  \[ 4\] .shstrtab         STRTAB          0000000000000000 [0-9a-f]+ 00001c 00      0   0  1
+  \[ 4\] .shstrtab         STRTAB          0000000000000000 [0-9a-f]+ 00001c 00 .* 0   0  1
 Key to Flags:
 #...
index bb8f6e398b07a8793a7f3adafc7b1db5b89995a4..96eb6d46c61bde186cef3f5884c60a8604ba55a1 100644 (file)
@@ -13,6 +13,6 @@ Section Headers:
   \[ 1\] .text             PROGBITS        0000000000000000 000040 000015 00  AX  0   0 16
   \[ 2\] .data             PROGBITS        0000000000000000 000055 000000 00  WA  0   0  1
   \[ 3\] .bss              NOBITS          0000000000000000 000055 000000 00  WA  0   0  1
-  \[ 4\] .shstrtab         STRTAB          0000000000000000 [0-9a-f]+ 00001c 00      0   0  1
+  \[ 4\] .shstrtab         STRTAB          0000000000000000 [0-9a-f]+ 00001c 00 .* 0   0  1
 Key to Flags:
 #...
index 92f3286d7f0fe6b6524cb1a9791290992a269c38..d1e95c57435668102bc524e5a5b8c99c391931b1 100644 (file)
@@ -1,3 +1,10 @@
+2016-04-14  Nick Clifton  <nickc@redhat.com>
+
+       PR target/19938
+       * testsuite/gas/i386/ilp32/x86-64-unwind.d: Allow for the string
+       sections possibly having the SHF_STRINGS flag bit set.
+       * testsuite/gas/i386/x86-64-unwind.d: Likewise.
+
 2016-04-12  Claudiu Zissulescu  <claziss@synopsys.com>
 
        * config/tc-arc.c (mach_type_specified_p): Change type to
index 0bac7a2777619f197e87aeed1f1562b26004279f..5cea05ee849f6cb2d33206f5c59e8a3d7542e688 100644 (file)
@@ -11,8 +11,8 @@ Section Headers:
   \[ 2\] .data             PROGBITS        00000000 000034 000000 00  WA  0   0  1
   \[ 3\] .bss              NOBITS          00000000 000034 000000 00  WA  0   0  1
   \[ 4\] .eh_frame         X86_64_UNWIND   00000000 000034 000008 00   A  0   0  1
-  \[ 5\] .shstrtab         STRTAB          00000000 [0-9a-f]+ 000036 00      0   0  1
+  \[ 5\] .shstrtab         STRTAB          00000000 [0-9a-f]+ 000036 00   .  0   0  1
   \[ 6\] .symtab           SYMTAB          00000000 [0-9a-f]+ 000050 10      7   5  4
-  \[ 7\] .strtab           STRTAB          00000000 [0-9a-f]+ 000001 00      0   0  1
+  \[ 7\] .strtab           STRTAB          00000000 [0-9a-f]+ 000001 00   .  0   0  1
 Key to Flags:
 #pass
index 613760fa660c0e4302bf9ecdfefe7318fe6f5bcc..7a4c64c9dbdf995d760d65308cbd7eeeca258a87 100644 (file)
@@ -17,10 +17,10 @@ Section Headers:
   \[ 4\] \.eh_frame         X86_64_UNWIND    0000000000000000  00000040
        0000000000000008  0000000000000000   A       0     0     1
   \[ 5\] \.shstrtab         STRTAB           0000000000000000  [0-9a-f]+
-       0000000000000036  0000000000000000           0     0     1
+       0000000000000036  0000000000000000   .       0     0     1
   \[ 6\] \.symtab           SYMTAB           0000000000000000  [0-9a-f]+
        0000000000000078  0000000000000018           7     5     8
   \[ 7\] \.strtab           STRTAB           0000000000000000  [0-9a-f]+
-       0000000000000001  0000000000000000           0     0     1
+       0000000000000001  0000000000000000   .       0     0     1
 Key to Flags:
 #...