[ARC] Corrected conditions for dynamic sections creation.
authorCupertino Miranda <cmiranda@synopsys.com>
Tue, 23 May 2017 11:36:33 +0000 (13:36 +0200)
committerCupertino Miranda <cmiranda@synopsys.com>
Thu, 8 Jun 2017 17:00:37 +0000 (19:00 +0200)
Fixed conditions to create the dynamic sections.
Previously there would be times where the dynamic sections would not be created
although they were actually required for linking to work.

Issue found through OpenADK build, more precisely the ublicb testsuite package.

bfd/ChangeLog:

    Cupertino Miranda  <cmiranda@synopsys.com>

elf32-arc.c (elf_arc_check_relocs): Fixed conditions to generate
dynamic sections.

bfd/ChangeLog
bfd/elf32-arc.c

index 6c4baf800cbe6d9b0c77f68c243b37c3d65c64c9..e99ca85b1e447607c83c12e94156d5e7b0363edf 100644 (file)
@@ -1,3 +1,8 @@
+2017-06-08  Cupertino Miranda  <cmiranda@synopsys.com>
+
+       * elf32-arc.c (elf_arc_check_relocs): Fixed conditions to generate
+       dynamic sections.
+
 2017-06-08  Cupertino Miranda  <cmiranda@synopsys.com>
 
        * elf32-arc.c (elf_arc_size_dynamic_sections): Changed condition to
index 03c00c38a6514bef3bd55aa939d829798c6cc0bd..6903ad745b9cd23243e8b70d168a335c461f7f77 100644 (file)
@@ -1904,10 +1904,14 @@ elf_arc_check_relocs (bfd *                      abfd,
   const Elf_Internal_Rela *    rel_end;
   bfd *                                dynobj;
   asection *                   sreloc = NULL;
+  struct elf_link_hash_table * htab = elf_hash_table (info);
 
   if (bfd_link_relocatable (info))
     return TRUE;
 
+  if (htab->dynobj == NULL)
+    htab->dynobj = abfd;
+
   dynobj = (elf_hash_table (info))->dynobj;
   symtab_hdr = &((elf_tdata (abfd))->symtab_hdr);
   sym_hashes = elf_sym_hashes (abfd);
@@ -1929,15 +1933,6 @@ elf_arc_check_relocs (bfd *                       abfd,
        }
       howto = arc_elf_howto (r_type);
 
-      if (dynobj == NULL
-         && (is_reloc_for_GOT (howto)
-             || is_reloc_for_TLS (howto)))
-       {
-         dynobj = elf_hash_table (info)->dynobj = abfd;
-         if (! _bfd_elf_create_got_section (abfd, info))
-           return FALSE;
-       }
-
       /* Load symbol information.  */
       r_symndx = ELF32_R_SYM (rel->r_info);
       if (r_symndx < symtab_hdr->sh_info) /* Is a local symbol.  */
@@ -1994,6 +1989,10 @@ elf_arc_check_relocs (bfd *                       abfd,
              {
                if (sreloc == NULL)
                  {
+                   if (info->dynamic
+                       && ! htab->dynamic_sections_created
+                       && ! _bfd_elf_link_create_dynamic_sections (abfd, info))
+                     return FALSE;
                    sreloc = _bfd_elf_make_dynamic_reloc_section (sec, dynobj,
                                                                  2, abfd,
                                                                  /*rela*/
@@ -2021,6 +2020,9 @@ elf_arc_check_relocs (bfd *                        abfd,
       if (is_reloc_for_GOT (howto)
          || is_reloc_for_TLS (howto))
        {
+         if (! _bfd_elf_create_got_section (dynobj, info))
+           return FALSE;
+
          arc_fill_got_info_for_reloc (
                  arc_got_entry_type_for_reloc (howto),
                  get_got_entry_list_for_symbol (abfd, r_symndx, h),