* elf32-sh.c (sh_elf_create_dynamic_sections): Don't call
[deliverable/binutils-gdb.git] / bfd / elf32-sh.c
index 0c27a759df6f82802cdcacb9c3d7e7b202a72199..2d1698cc559f50563a865fee0a649cd71a4470a0 100644 (file)
@@ -3768,12 +3768,16 @@ sh_elf_create_dynamic_sections (abfd, info)
   if (bed->plt_readonly)
     pltflags |= SEC_READONLY;
 
-  s = bfd_make_section (abfd, ".plt");
-  htab->splt = s;
-  if (s == NULL
-      || ! bfd_set_section_flags (abfd, s, pltflags)
-      || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment))
-    return FALSE;
+  s = htab->splt;
+  if (s == NULL)
+    {
+      s = bfd_make_section (abfd, ".plt");
+      htab->splt = s;
+      if (s == NULL
+         || ! bfd_set_section_flags (abfd, s, pltflags)
+         || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment))
+       return FALSE;
+    }
 
   if (bed->want_plt_sym)
     {
@@ -3797,13 +3801,17 @@ sh_elf_create_dynamic_sections (abfd, info)
        return FALSE;
     }
 
-  s = bfd_make_section (abfd,
-                       bed->default_use_rela_p ? ".rela.plt" : ".rel.plt");
-  htab->srelplt = s;
-  if (s == NULL
-      || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
-      || ! bfd_set_section_alignment (abfd, s, ptralign))
-    return FALSE;
+  if (htab->srelplt == NULL)
+    {
+      s = bfd_make_section (abfd,
+                           (bed->default_use_rela_p ?
+                            ".rela.plt" : ".rel.plt"));
+      htab->srelplt = s;
+      if (s == NULL
+         || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
+         || ! bfd_set_section_alignment (abfd, s, ptralign))
+       return FALSE;
+    }
 
   if (htab->sgot == NULL
       && !create_got_section (abfd, info))
@@ -3825,6 +3833,8 @@ sh_elf_create_dynamic_sections (abfd, info)
        relname = (char *) bfd_malloc ((bfd_size_type) strlen (secname) + 6);
        strcpy (relname, ".rela");
        strcat (relname, secname);
+       if (bfd_get_section_by_name (abfd, secname))
+         continue;
        s = bfd_make_section (abfd, relname);
        if (s == NULL
            || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
@@ -3841,11 +3851,14 @@ sh_elf_create_dynamic_sections (abfd, info)
         image and use a R_*_COPY reloc to tell the dynamic linker to
         initialize them at run time.  The linker script puts the .dynbss
         section into the .bss section of the final image.  */
-      s = bfd_make_section (abfd, ".dynbss");
-      htab->sdynbss = s;
-      if (s == NULL
-         || ! bfd_set_section_flags (abfd, s, SEC_ALLOC))
-       return FALSE;
+      if (htab->sdynbss == NULL)
+       {
+         s = bfd_make_section (abfd, ".dynbss");
+         htab->sdynbss = s;
+         if (s == NULL
+             || ! bfd_set_section_flags (abfd, s, SEC_ALLOC))
+           return FALSE;
+       }
 
       /* The .rel[a].bss section holds copy relocs.  This section is not
         normally needed.  We need to create it here, though, so that the
@@ -3858,7 +3871,7 @@ sh_elf_create_dynamic_sections (abfd, info)
         be needed, we can discard it later.  We will never need this
         section when generating a shared object, since they do not use
         copy relocs.  */
-      if (! info->shared)
+      if (! info->shared && htab->srelbss == NULL)
        {
          s = bfd_make_section (abfd,
                                (bed->default_use_rela_p
This page took 0.028405 seconds and 4 git commands to generate.