* elf32-m32c.c (m32c_elf_check_relocs): Use bfd_make_section
authorAlan Modra <amodra@gmail.com>
Mon, 2 Jul 2012 03:02:45 +0000 (03:02 +0000)
committerAlan Modra <amodra@gmail.com>
Mon, 2 Jul 2012 03:02:45 +0000 (03:02 +0000)
"anyway" variant when creating .plt.
(m32c_elf_relax_plt_section): Remove redundant test and unused param.
(m32c_elf_relax_section): Test SEC_LINKER_CREATED before calling
m32c_elf_relax_plt_section.
* elfxx-mips.c (mips_elf_create_got_section): Use make anyway variant
when creating .got and .got.plt.
(_bfd_mips_elf_final_link): Likewise for .rtproc, and use
bfd_get_linker_section.
* sunos.c: Similarly throughout.

bfd/ChangeLog
bfd/elf32-m32c.c
bfd/elfxx-mips.c
bfd/sunos.c

index 6083702f022828f73d37c19875522acbc9aa1d1b..b594c66c0a7e528baaaf1b9416a7f6cfb30851f3 100644 (file)
@@ -1,3 +1,16 @@
+2012-07-02  Alan Modra  <amodra@gmail.com>
+
+       * elf32-m32c.c (m32c_elf_check_relocs): Use bfd_make_section
+       "anyway" variant when creating .plt.
+       (m32c_elf_relax_plt_section): Remove redundant test and unused param.
+       (m32c_elf_relax_section): Test SEC_LINKER_CREATED before calling
+       m32c_elf_relax_plt_section.
+       * elfxx-mips.c (mips_elf_create_got_section): Use make anyway variant
+       when creating .got and .got.plt.
+       (_bfd_mips_elf_final_link): Likewise for .rtproc, and use
+       bfd_get_linker_section.
+       * sunos.c: Similarly throughout.
+
 2012-07-01  Andreas Schwab  <schwab@linux-m68k.org>
 
        * elf.c (_bfd_elf_make_section_from_shdr): Fix typo in error
index 6c4352d7e1e4c6c674b4ffa70c3c0fc95bf81c79..667a4828d27a2dd66174dbf3fa8b3db123f3e1fb 100644 (file)
@@ -639,7 +639,8 @@ m32c_elf_check_relocs
                  flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
                                    | SEC_IN_MEMORY | SEC_LINKER_CREATED
                                    | SEC_READONLY | SEC_CODE);
-                 splt = bfd_make_section_with_flags (dynobj, ".plt", flags);
+                 splt = bfd_make_section_anyway_with_flags (dynobj, ".plt",
+                                                            flags);
                  if (splt == NULL
                      || ! bfd_set_section_alignment (dynobj, splt, 1))
                    return FALSE;
@@ -1031,8 +1032,7 @@ m32c_relax_plt_realloc (struct elf_link_hash_entry *h,
 }
 
 static bfd_boolean
-m32c_elf_relax_plt_section (bfd *dynobj,
-                            asection *splt,
+m32c_elf_relax_plt_section (asection *splt,
                             struct bfd_link_info *info,
                             bfd_boolean *again)
 {
@@ -1045,11 +1045,6 @@ m32c_elf_relax_plt_section (bfd *dynobj,
   if (info->relocatable)
     return TRUE;
 
-  /* We only relax the .plt section at the moment.  */
-  if (dynobj != elf_hash_table (info)->dynobj
-      || strcmp (splt->name, ".plt") != 0)
-    return TRUE;
-
   /* Quick check for an empty plt.  */
   if (splt->size == 0)
     return TRUE;
@@ -1337,8 +1332,9 @@ m32c_elf_relax_section
   int machine;
 
   if (abfd == elf_hash_table (link_info)->dynobj
+      && (sec->flags & SEC_LINKER_CREATED) != 0
       && strcmp (sec->name, ".plt") == 0)
-    return m32c_elf_relax_plt_section (abfd, sec, link_info, again);
+    return m32c_elf_relax_plt_section (sec, link_info, again);
 
   /* Assume nothing changes.  */
   *again = FALSE;
index de5e9c6674a0a943dac157f4dd0ad34d6641f895..4440170e6e613e8325185aead5bbdd7b1a780fa1 100644 (file)
@@ -4874,7 +4874,7 @@ mips_elf_create_got_section (bfd *abfd, struct bfd_link_info *info)
 
   /* We have to use an alignment of 2**4 here because this is hardcoded
      in the function stub generation and in the linker script.  */
-  s = bfd_make_section_with_flags (abfd, ".got", flags);
+  s = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
   if (s == NULL
       || ! bfd_set_section_alignment (abfd, s, 4))
     return FALSE;
@@ -4926,9 +4926,11 @@ mips_elf_create_got_section (bfd *abfd, struct bfd_link_info *info)
     |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
 
   /* We also need a .got.plt section when generating PLTs.  */
-  s = bfd_make_section_with_flags (abfd, ".got.plt",
-                                  SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
-                                  | SEC_IN_MEMORY | SEC_LINKER_CREATED);
+  s = bfd_make_section_anyway_with_flags (abfd, ".got.plt",
+                                         SEC_ALLOC | SEC_LOAD
+                                         | SEC_HAS_CONTENTS
+                                         | SEC_IN_MEMORY
+                                         | SEC_LINKER_CREATED);
   if (s == NULL)
     return FALSE;
   htab->sgotplt = s;
@@ -13309,15 +13311,15 @@ _bfd_mips_elf_final_link (bfd *abfd, struct bfd_link_info *info)
          if (SGI_COMPAT (abfd) && info->shared)
            {
              /* Create .rtproc section.  */
-             rtproc_sec = bfd_get_section_by_name (abfd, ".rtproc");
+             rtproc_sec = bfd_get_linker_section (abfd, ".rtproc");
              if (rtproc_sec == NULL)
                {
                  flagword flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY
                                    | SEC_LINKER_CREATED | SEC_READONLY);
 
-                 rtproc_sec = bfd_make_section_with_flags (abfd,
-                                                           ".rtproc",
-                                                           flags);
+                 rtproc_sec = bfd_make_section_anyway_with_flags (abfd,
+                                                                  ".rtproc",
+                                                                  flags);
                  if (rtproc_sec == NULL
                      || ! bfd_set_section_alignment (abfd, rtproc_sec, 4))
                    return FALSE;
index bd140015eb72b12946fba6758d7643b181283b56..028fb280e3b12a55a77245b74f1f8ed15d63e2aa 100644 (file)
@@ -748,49 +748,53 @@ sunos_create_dynamic_sections (bfd *abfd,
       /* The .dynamic section holds the basic dynamic information: the
         sun4_dynamic structure, the dynamic debugger information, and
         the sun4_dynamic_link structure.  */
-      s = bfd_make_section_with_flags (abfd, ".dynamic", flags);
+      s = bfd_make_section_anyway_with_flags (abfd, ".dynamic", flags);
       if (s == NULL
          || ! bfd_set_section_alignment (abfd, s, 2))
        return FALSE;
 
       /* The .got section holds the global offset table.  The address
         is put in the ld_got field.  */
-      s = bfd_make_section_with_flags (abfd, ".got", flags);
+      s = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
       if (s == NULL
          || ! bfd_set_section_alignment (abfd, s, 2))
        return FALSE;
 
       /* The .plt section holds the procedure linkage table.  The
         address is put in the ld_plt field.  */
-      s = bfd_make_section_with_flags (abfd, ".plt", flags | SEC_CODE);
+      s = bfd_make_section_anyway_with_flags (abfd, ".plt", flags | SEC_CODE);
       if (s == NULL
          || ! bfd_set_section_alignment (abfd, s, 2))
        return FALSE;
 
       /* The .dynrel section holds the dynamic relocs.  The address is
         put in the ld_rel field.  */
-      s = bfd_make_section_with_flags (abfd, ".dynrel", flags | SEC_READONLY);
+      s = bfd_make_section_anyway_with_flags (abfd, ".dynrel",
+                                             flags | SEC_READONLY);
       if (s == NULL
          || ! bfd_set_section_alignment (abfd, s, 2))
        return FALSE;
 
       /* The .hash section holds the dynamic hash table.  The address
         is put in the ld_hash field.  */
-      s = bfd_make_section_with_flags (abfd, ".hash", flags | SEC_READONLY);
+      s = bfd_make_section_anyway_with_flags (abfd, ".hash",
+                                             flags | SEC_READONLY);
       if (s == NULL
          || ! bfd_set_section_alignment (abfd, s, 2))
        return FALSE;
 
       /* The .dynsym section holds the dynamic symbols.  The address
         is put in the ld_stab field.  */
-      s = bfd_make_section_with_flags (abfd, ".dynsym", flags | SEC_READONLY);
+      s = bfd_make_section_anyway_with_flags (abfd, ".dynsym",
+                                             flags | SEC_READONLY);
       if (s == NULL
          || ! bfd_set_section_alignment (abfd, s, 2))
        return FALSE;
 
       /* The .dynstr section holds the dynamic symbol string table.
         The address is put in the ld_symbols field.  */
-      s = bfd_make_section_with_flags (abfd, ".dynstr", flags | SEC_READONLY);
+      s = bfd_make_section_anyway_with_flags (abfd, ".dynstr",
+                                             flags | SEC_READONLY);
       if (s == NULL
          || ! bfd_set_section_alignment (abfd, s, 2))
        return FALSE;
@@ -805,7 +809,7 @@ sunos_create_dynamic_sections (bfd *abfd,
 
       dynobj = sunos_hash_table (info)->dynobj;
 
-      s = bfd_get_section_by_name (dynobj, ".got");
+      s = bfd_get_linker_section (dynobj, ".got");
       if (s->size == 0)
        s->size = BYTES_IN_WORD;
 
@@ -1325,11 +1329,11 @@ sunos_scan_std_relocs (struct bfd_link_info *info,
          if (! sunos_create_dynamic_sections (abfd, info, FALSE))
            return FALSE;
          dynobj = sunos_hash_table (info)->dynobj;
-         splt = bfd_get_section_by_name (dynobj, ".plt");
-         srel = bfd_get_section_by_name (dynobj, ".dynrel");
+         splt = bfd_get_linker_section (dynobj, ".plt");
+         srel = bfd_get_linker_section (dynobj, ".dynrel");
          BFD_ASSERT (splt != NULL && srel != NULL);
 
-         sgot = bfd_get_section_by_name (dynobj, ".got");
+         sgot = bfd_get_linker_section (dynobj, ".got");
          BFD_ASSERT (sgot != NULL);
          if (sgot->size == 0)
            sgot->size = BYTES_IN_WORD;
@@ -1475,9 +1479,9 @@ sunos_scan_ext_relocs (struct bfd_link_info *info,
              if (! sunos_create_dynamic_sections (abfd, info, FALSE))
                return FALSE;
              dynobj = sunos_hash_table (info)->dynobj;
-             splt = bfd_get_section_by_name (dynobj, ".plt");
-             sgot = bfd_get_section_by_name (dynobj, ".got");
-             srel = bfd_get_section_by_name (dynobj, ".dynrel");
+             splt = bfd_get_linker_section (dynobj, ".plt");
+             sgot = bfd_get_linker_section (dynobj, ".got");
+             srel = bfd_get_linker_section (dynobj, ".dynrel");
              BFD_ASSERT (splt != NULL && sgot != NULL && srel != NULL);
 
              /* Make sure we have an initial entry in the .got table.  */
@@ -1543,9 +1547,9 @@ sunos_scan_ext_relocs (struct bfd_link_info *info,
                  if (! sunos_create_dynamic_sections (abfd, info, TRUE))
                    return FALSE;
                  dynobj = sunos_hash_table (info)->dynobj;
-                 splt = bfd_get_section_by_name (dynobj, ".plt");
-                 sgot = bfd_get_section_by_name (dynobj, ".got");
-                 srel = bfd_get_section_by_name (dynobj, ".dynrel");
+                 splt = bfd_get_linker_section (dynobj, ".plt");
+                 sgot = bfd_get_linker_section (dynobj, ".got");
+                 srel = bfd_get_linker_section (dynobj, ".dynrel");
                  BFD_ASSERT (splt != NULL && sgot != NULL && srel != NULL);
                }
 
@@ -1590,9 +1594,9 @@ sunos_scan_ext_relocs (struct bfd_link_info *info,
          if (! sunos_create_dynamic_sections (abfd, info, FALSE))
            return FALSE;
          dynobj = sunos_hash_table (info)->dynobj;
-         splt = bfd_get_section_by_name (dynobj, ".plt");
-         sgot = bfd_get_section_by_name (dynobj, ".got");
-         srel = bfd_get_section_by_name (dynobj, ".dynrel");
+         splt = bfd_get_linker_section (dynobj, ".plt");
+         sgot = bfd_get_linker_section (dynobj, ".got");
+         srel = bfd_get_linker_section (dynobj, ".dynrel");
          BFD_ASSERT (splt != NULL && sgot != NULL && srel != NULL);
 
          /* Make sure we have an initial entry in the .got table.  */
@@ -1815,7 +1819,7 @@ sunos_scan_dynamic_symbol (struct sunos_link_hash_entry *h, void * data)
         regular symbols includes the debugging symbols, which have
         long names and are often duplicated in several object files.
         There are no debugging symbols in the dynamic symbols.  */
-      s = bfd_get_section_by_name (dynobj, ".dynstr");
+      s = bfd_get_linker_section (dynobj, ".dynstr");
       BFD_ASSERT (s != NULL);
       contents = bfd_realloc (s->contents, s->size + len + 1);
       if (contents == NULL)
@@ -1834,7 +1838,7 @@ sunos_scan_dynamic_symbol (struct sunos_link_hash_entry *h, void * data)
       hash &= 0x7fffffff;
       hash %= sunos_hash_table (info)->bucketcount;
 
-      s = bfd_get_section_by_name (dynobj, ".hash");
+      s = bfd_get_linker_section (dynobj, ".hash");
       BFD_ASSERT (s != NULL);
 
       if (GET_SWORD (dynobj, s->contents + hash * HASH_ENTRY_SIZE) == -1)
@@ -1931,14 +1935,14 @@ bfd_sunos_size_dynamic_sections (bfd *output_bfd,
          ++sunos_hash_table (info)->dynsymcount;
          h->dynindx = -2;
        }
+      s = bfd_get_linker_section (dynobj, ".got");
+      BFD_ASSERT (s != NULL);
       h->root.root.type = bfd_link_hash_defined;
-      h->root.root.u.def.section = bfd_get_section_by_name (dynobj, ".got");
+      h->root.root.u.def.section = s;
 
       /* If the .got section is more than 0x1000 bytes, we set
         __GLOBAL_OFFSET_TABLE_ to be 0x1000 bytes into the section,
         so that 13 bit relocations have a greater chance of working.  */
-      s = bfd_get_section_by_name (dynobj, ".got");
-      BFD_ASSERT (s != NULL);
       if (s->size >= 0x1000)
        h->root.root.u.def.value = 0x1000;
       else
@@ -1951,7 +1955,7 @@ bfd_sunos_size_dynamic_sections (bfd *output_bfd,
      up the dynamic linking information.  */
   if (sunos_hash_table (info)->dynamic_sections_needed)
     {
-      *sdynptr = bfd_get_section_by_name (dynobj, ".dynamic");
+      *sdynptr = bfd_get_linker_section (dynobj, ".dynamic");
 
       /* The .dynamic section is always the same size.  */
       s = *sdynptr;
@@ -1968,7 +1972,7 @@ bfd_sunos_size_dynamic_sections (bfd *output_bfd,
         symbols.  We build the dynamic symbol string table (.dynstr)
         in a traversal of the symbol table using
         sunos_scan_dynamic_symbol.  */
-      s = bfd_get_section_by_name (dynobj, ".dynsym");
+      s = bfd_get_linker_section (dynobj, ".dynsym");
       BFD_ASSERT (s != NULL);
       s->size = dynsymcount * sizeof (struct external_nlist);
       s->contents = bfd_alloc (output_bfd, s->size);
@@ -1989,7 +1993,7 @@ bfd_sunos_size_dynamic_sections (bfd *output_bfd,
        bucketcount = dynsymcount;
       else
        bucketcount = 1;
-      s = bfd_get_section_by_name (dynobj, ".hash");
+      s = bfd_get_linker_section (dynobj, ".hash");
       BFD_ASSERT (s != NULL);
       hashalloc = (dynsymcount + bucketcount - 1) * HASH_ENTRY_SIZE;
       s->contents = bfd_zalloc (dynobj, hashalloc);
@@ -2013,7 +2017,7 @@ bfd_sunos_size_dynamic_sections (bfd *output_bfd,
       /* The SunOS native linker seems to align the total size of the
         symbol strings to a multiple of 8.  I don't know if this is
         important, but it can't hurt much.  */
-      s = bfd_get_section_by_name (dynobj, ".dynstr");
+      s = bfd_get_linker_section (dynobj, ".dynstr");
       BFD_ASSERT (s != NULL);
       if ((s->size & 7) != 0)
        {
@@ -2032,7 +2036,7 @@ bfd_sunos_size_dynamic_sections (bfd *output_bfd,
 
   /* Now that we have worked out the sizes of the procedure linkage
      table and the dynamic relocs, allocate storage for them.  */
-  s = bfd_get_section_by_name (dynobj, ".plt");
+  s = bfd_get_linker_section (dynobj, ".plt");
   BFD_ASSERT (s != NULL);
   if (s->size != 0)
     {
@@ -2056,7 +2060,7 @@ bfd_sunos_size_dynamic_sections (bfd *output_bfd,
        }
     }
 
-  s = bfd_get_section_by_name (dynobj, ".dynrel");
+  s = bfd_get_linker_section (dynobj, ".dynrel");
   if (s->size != 0)
     {
       s->contents = bfd_alloc (dynobj, s->size);
@@ -2068,7 +2072,7 @@ bfd_sunos_size_dynamic_sections (bfd *output_bfd,
   s->reloc_count = 0;
 
   /* Make space for the global offset table.  */
-  s = bfd_get_section_by_name (dynobj, ".got");
+  s = bfd_get_linker_section (dynobj, ".got");
   s->contents = bfd_alloc (dynobj, s->size);
   if (s->contents == NULL)
     return FALSE;
@@ -2114,10 +2118,10 @@ sunos_write_dynamic_symbol (bfd *output_bfd,
       bfd_vma r_address;
 
       dynobj = sunos_hash_table (info)->dynobj;
-      splt = bfd_get_section_by_name (dynobj, ".plt");
+      splt = bfd_get_linker_section (dynobj, ".plt");
       p = splt->contents + h->plt_offset;
 
-      s = bfd_get_section_by_name (dynobj, ".dynrel");
+      s = bfd_get_linker_section (dynobj, ".dynrel");
 
       r_address = (splt->output_section->vma
                   + splt->output_offset
@@ -2301,7 +2305,7 @@ sunos_write_dynamic_symbol (bfd *output_bfd,
       return TRUE;
     }
 
-  s = bfd_get_section_by_name (sunos_hash_table (info)->dynobj, ".dynsym");
+  s = bfd_get_linker_section (sunos_hash_table (info)->dynobj, ".dynsym");
   BFD_ASSERT (s != NULL);
   outsym = ((struct external_nlist *)
            (s->contents + h->dynindx * EXTERNAL_NLIST_SIZE));
@@ -2356,7 +2360,7 @@ sunos_check_dynamic_reloc (struct bfd_link_info *info,
       asection *splt;
 
       /* Redirect the relocation to the PLT entry.  */
-      splt = bfd_get_section_by_name (dynobj, ".plt");
+      splt = bfd_get_linker_section (dynobj, ".plt");
       *relocationp = (splt->output_section->vma
                      + splt->output_offset
                      + h->plt_offset);
@@ -2451,7 +2455,7 @@ sunos_check_dynamic_reloc (struct bfd_link_info *info,
 
       BFD_ASSERT (got_offsetp != NULL && *got_offsetp != 0);
 
-      sgot = bfd_get_section_by_name (dynobj, ".got");
+      sgot = bfd_get_linker_section (dynobj, ".got");
 
       /* We set the least significant bit to indicate whether we have
         already initialized the GOT entry.  */
@@ -2473,7 +2477,7 @@ sunos_check_dynamic_reloc (struct bfd_link_info *info,
              /* We need to create a GLOB_DAT or 32 reloc to tell the
                 dynamic linker to fill in this entry in the table.  */
 
-             s = bfd_get_section_by_name (dynobj, ".dynrel");
+             s = bfd_get_linker_section (dynobj, ".dynrel");
              BFD_ASSERT (s != NULL);
              BFD_ASSERT (s->reloc_count * obj_reloc_entry_size (dynobj)
                          < s->size);
@@ -2603,7 +2607,7 @@ sunos_check_dynamic_reloc (struct bfd_link_info *info,
 
   /* It looks like this is a reloc we are supposed to copy.  */
 
-  s = bfd_get_section_by_name (dynobj, ".dynrel");
+  s = bfd_get_linker_section (dynobj, ".dynrel");
   BFD_ASSERT (s != NULL);
   BFD_ASSERT (s->reloc_count * obj_reloc_entry_size (dynobj) < s->size);
 
@@ -2701,7 +2705,7 @@ sunos_finish_dynamic_link (bfd *abfd, struct bfd_link_info *info)
 
   dynobj = sunos_hash_table (info)->dynobj;
 
-  sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
+  sdyn = bfd_get_linker_section (dynobj, ".dynamic");
   BFD_ASSERT (sdyn != NULL);
 
   /* Finish up the .need section.  The linker emulation code filled it
@@ -2731,7 +2735,7 @@ sunos_finish_dynamic_link (bfd *abfd, struct bfd_link_info *info)
 
   /* The first entry in the .got section is the address of the
      dynamic information, unless this is a shared library.  */
-  s = bfd_get_section_by_name (dynobj, ".got");
+  s = bfd_get_linker_section (dynobj, ".got");
   BFD_ASSERT (s != NULL);
   if (info->shared || sdyn->size == 0)
     PUT_WORD (dynobj, 0, s->contents);
@@ -2793,30 +2797,30 @@ sunos_finish_dynamic_link (bfd *abfd, struct bfd_link_info *info)
        PUT_WORD (dynobj, s->output_section->filepos + s->output_offset,
                  esdl.ld_rules);
 
-      s = bfd_get_section_by_name (dynobj, ".got");
+      s = bfd_get_linker_section (dynobj, ".got");
       BFD_ASSERT (s != NULL);
       PUT_WORD (dynobj, s->output_section->vma + s->output_offset,
                esdl.ld_got);
 
-      s = bfd_get_section_by_name (dynobj, ".plt");
+      s = bfd_get_linker_section (dynobj, ".plt");
       BFD_ASSERT (s != NULL);
       PUT_WORD (dynobj, s->output_section->vma + s->output_offset,
                esdl.ld_plt);
       PUT_WORD (dynobj, s->size, esdl.ld_plt_sz);
 
-      s = bfd_get_section_by_name (dynobj, ".dynrel");
+      s = bfd_get_linker_section (dynobj, ".dynrel");
       BFD_ASSERT (s != NULL);
       BFD_ASSERT (s->reloc_count * obj_reloc_entry_size (dynobj)
                  == s->size);
       PUT_WORD (dynobj, s->output_section->filepos + s->output_offset,
                esdl.ld_rel);
 
-      s = bfd_get_section_by_name (dynobj, ".hash");
+      s = bfd_get_linker_section (dynobj, ".hash");
       BFD_ASSERT (s != NULL);
       PUT_WORD (dynobj, s->output_section->filepos + s->output_offset,
                esdl.ld_hash);
 
-      s = bfd_get_section_by_name (dynobj, ".dynsym");
+      s = bfd_get_linker_section (dynobj, ".dynsym");
       BFD_ASSERT (s != NULL);
       PUT_WORD (dynobj, s->output_section->filepos + s->output_offset,
                esdl.ld_stab);
@@ -2826,7 +2830,7 @@ sunos_finish_dynamic_link (bfd *abfd, struct bfd_link_info *info)
       PUT_WORD (dynobj, (bfd_vma) sunos_hash_table (info)->bucketcount,
                esdl.ld_buckets);
 
-      s = bfd_get_section_by_name (dynobj, ".dynstr");
+      s = bfd_get_linker_section (dynobj, ".dynstr");
       BFD_ASSERT (s != NULL);
       PUT_WORD (dynobj, s->output_section->filepos + s->output_offset,
                esdl.ld_symbols);