Fix excessive memory allocation attempts and possible integer overfloaws when attempt...
[deliverable/binutils-gdb.git] / bfd / elf32-microblaze.c
index 94ef09ed4a7cfa32fcc871da11a39a997060e139..a54044fdb3c45327ddb4792223bb37a689c8f11b 100644 (file)
@@ -1002,6 +1002,7 @@ microblaze_elf_relocate_section (bfd *output_bfd,
       else
        {
          bfd_vma relocation;
+         bfd_boolean resolved_to_zero;
 
          /* This is a final link.  */
          sym = NULL;
@@ -1041,6 +1042,9 @@ microblaze_elf_relocate_section (bfd *output_bfd,
              goto check_reloc;
            }
 
+         resolved_to_zero = (h != NULL
+                             && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
+
          switch ((int) r_type)
            {
            case (int) R_MICROBLAZE_SRO32 :
@@ -1257,7 +1261,8 @@ microblaze_elf_relocate_section (bfd *output_bfd,
                /* Need to generate relocs ? */
                if ((bfd_link_pic (info) || indx != 0)
                    && (h == NULL
-                   || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
+                   || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
+                       && !resolved_to_zero)
                    || h->root.type != bfd_link_hash_undefweak))
                  need_relocs = TRUE;
 
@@ -1432,7 +1437,8 @@ microblaze_elf_relocate_section (bfd *output_bfd,
 
                if ((bfd_link_pic (info)
                     && (h == NULL
-                        || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
+                        || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
+                            && !resolved_to_zero)
                         || h->root.type != bfd_link_hash_undefweak)
                     && (!howto->pc_relative
                         || (h != NULL
@@ -2218,17 +2224,6 @@ microblaze_elf_gc_mark_hook (asection *sec,
   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
 }
 
-/* Update the got entry reference counts for the section being removed.  */
-
-static bfd_boolean
-microblaze_elf_gc_sweep_hook (bfd * abfd ATTRIBUTE_UNUSED,
-                             struct bfd_link_info * info ATTRIBUTE_UNUSED,
-                             asection * sec ATTRIBUTE_UNUSED,
-                             const Elf_Internal_Rela * relocs ATTRIBUTE_UNUSED)
-{
-  return TRUE;
-}
-
 /* PIC support.  */
 
 #define PLT_ENTRY_SIZE 16
@@ -2312,6 +2307,9 @@ microblaze_elf_check_relocs (bfd * abfd,
       else
        {
          h = sym_hashes [r_symndx - symtab_hdr->sh_info];
+         while (h->root.type == bfd_link_hash_indirect
+                || h->root.type == bfd_link_hash_warning)
+           h = (struct elf_link_hash_entry *) h->root.u.i.link;
 
          /* PR15323, ref flags aren't set for references in the same
             object.  */
@@ -2861,6 +2859,8 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * dat)
                pp = &p->next;
            }
        }
+      else if (UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
+       eh->dyn_relocs = NULL;
     }
   else
     {
@@ -3457,7 +3457,6 @@ microblaze_elf_add_symbol_hook (bfd *abfd,
 #define bfd_elf32_bfd_reloc_name_lookup                microblaze_elf_reloc_name_lookup
 
 #define elf_backend_gc_mark_hook               microblaze_elf_gc_mark_hook
-#define elf_backend_gc_sweep_hook              microblaze_elf_gc_sweep_hook
 #define elf_backend_check_relocs                microblaze_elf_check_relocs
 #define elf_backend_copy_indirect_symbol        microblaze_elf_copy_indirect_symbol
 #define bfd_elf32_bfd_link_hash_table_create    microblaze_elf_link_hash_table_create
This page took 0.042525 seconds and 4 git commands to generate.