[ARC] Dynamic relocs verification for dynindx == -1.
authorClaudiu Zissulescu <claziss@synopsys.com>
Tue, 5 Apr 2016 14:34:12 +0000 (16:34 +0200)
committerClaudiu Zissulescu <claziss@synopsys.com>
Tue, 5 Apr 2016 14:47:58 +0000 (16:47 +0200)
bfd/
2016-04-05  Cupertino Miranda  <cmiranda@synopsys.com>

* elf32-arc.c (name_for_global_symbol): Added assert to check for
symbol index.
(elf_arc_relocate_section): Added and changed asserts, validating
the synamic symbol index.
(elf_arc_finish_dynamic_symbol): Do not fill the dynamic
relocation if symbol has dynindx set to -1.

bfd/ChangeLog
bfd/elf32-arc.c

index 626e68a6aeda9f86e9c7b45aff96779a182d6aea..80539b8d125398c574758c6e197815273a73cb44 100644 (file)
@@ -1,3 +1,12 @@
+2016-04-05  Cupertino Miranda  <cmiranda@synopsys.com>
+
+       * elf32-arc.c (name_for_global_symbol): Added assert to check for
+       symbol index.
+       (elf_arc_relocate_section): Added and changed asserts, validating
+       the synamic symbol index.
+       (elf_arc_finish_dynamic_symbol): Do not fill the dynamic
+       relocation if symbol has dynindx set to -1.
+
 2016-04-05  Maciej W. Rozycki  <macro@imgtec.com>
 
        * elflink.c (elf_link_add_object_symbols): Always turn hidden
index 488b86fccc01ff2ac79c5c765adb14a773a4b503..a7c0330450197acc4da10cf477ef7455fa0c18d0 100644 (file)
@@ -64,6 +64,7 @@ name_for_global_symbol (struct elf_link_hash_entry *h)
     _rel.r_addend = ADDEND;                                            \
     _rel.r_offset = (_htab->s##SECTION)->output_section->vma           \
       + (_htab->s##SECTION)->output_offset + OFFSET;                   \
+    BFD_ASSERT ((long) SYM_IDX != -1);                                 \
     _rel.r_info = ELF32_R_INFO (SYM_IDX, TYPE);                                \
     bfd_elf32_swap_reloca_out (BFD, &_rel, _loc);                      \
   }
@@ -1495,11 +1496,13 @@ elf_arc_relocate_section (bfd *            output_bfd,
                else if (r_type == R_ARC_PC32
                         || r_type == R_ARC_32_PCREL)
                  {
-                   BFD_ASSERT (h != NULL && h->dynindx != -1);
+                   BFD_ASSERT (h != NULL);
                    if ((input_section->flags & SEC_ALLOC) != 0)
                      relocate = FALSE;
                    else
                      relocate = TRUE;
+
+                   BFD_ASSERT (h->dynindx != -1);
                    outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
                  }
                else
@@ -1535,6 +1538,8 @@ elf_arc_relocate_section (bfd *              output_bfd,
                          relocate = FALSE;
                        else
                          relocate = TRUE;
+
+                       BFD_ASSERT (h->dynindx != -1);
                        outrel.r_info = ELF32_R_INFO (h->dynindx, R_ARC_32);
                      }
                  }
@@ -2001,6 +2006,8 @@ GOT_ENTRY_OFFSET = 0x%x, GOT_ENTRY_VMA = 0x%x, for symbol %s\n",
                    + htab->sgotplt->output_offset
                    + got_offset);
     rel.r_addend = 0;
+
+    BFD_ASSERT (h->dynindx != -1);
     rel.r_info = ELF32_R_INFO (h->dynindx, R_ARC_JMP_SLOT);
 
     loc = htab->srelplt->contents;
@@ -2199,7 +2206,10 @@ elf_arc_finish_dynamic_symbol (bfd * output_bfd,
                {
                  ADD_RELA (output_bfd, got, got_offset, 0, R_ARC_RELATIVE, 0);
                }
-             else
+             /* Do not fully understand the side effects of this condition.
+                The relocation space might still being reserved.  Perhaps
+                I should clear its value.  */
+             else if (h->dynindx != -1)
                {
                  ADD_RELA (output_bfd, got, got_offset, h->dynindx,
                          R_ARC_GLOB_DAT, 0);
@@ -2274,6 +2284,8 @@ GOT_OFFSET = 0x%x, GOT_VMA = 0x%x, INDEX = %d, ADDEND = 0x%x\n",
       Elf_Internal_Rela rel;
       rel.r_addend = 0;
       rel.r_offset = rel_offset;
+
+      BFD_ASSERT (h->dynindx != -1);
       rel.r_info = ELF32_R_INFO (h->dynindx, R_ARC_COPY);
 
       bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);