PR binutils/14567
[deliverable/binutils-gdb.git] / bfd / elf32-i386.c
index c9bc6944c4f3cc36c781baae49ce6abda3c694a3..1b04a6ef1f156d9ae9d815987eb15d37e2cbc787 100644 (file)
@@ -2559,9 +2559,10 @@ elf_i386_convert_mov_to_lea (bfd *abfd, asection *sec,
   if (!is_elf_hash_table (link_info->hash))
     return FALSE;
 
-  /* Nothing to do if there are no codes or no relocations.  */
+  /* Nothing to do if there are no codes, no relocations or no output.  */
   if ((sec->flags & (SEC_CODE | SEC_RELOC)) != (SEC_CODE | SEC_RELOC)
-      || sec->reloc_count == 0)
+      || sec->reloc_count == 0
+      || discarded_section (sec))
     return TRUE;
 
   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
@@ -2631,9 +2632,11 @@ elf_i386_convert_mov_to_lea (bfd *abfd, asection *sec,
             || h->root.type == bfd_link_hash_warning)
        h = (struct elf_link_hash_entry *) h->root.u.i.link;
 
-      /* STT_GNU_IFUNC must keep R_386_GOT32 relocation.  */
+      /* STT_GNU_IFUNC must keep R_386_GOT32 relocation.  We also avoid
+        optimizing _DYNAMIC since ld.so may use its link-time address.  */
       if (h->def_regular
          && h->type != STT_GNU_IFUNC
+         && h != htab->elf.hdynamic
          && SYMBOL_REFERENCES_LOCAL (link_info, h)
          && bfd_get_8 (input_bfd,
                        contents + irel->r_offset - 2) == 0x8b)
@@ -2860,15 +2863,10 @@ elf_i386_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
 
   if (htab->elf.sgotplt)
     {
-      struct elf_link_hash_entry *got;
-      got = elf_link_hash_lookup (elf_hash_table (info),
-                                 "_GLOBAL_OFFSET_TABLE_",
-                                 FALSE, FALSE, FALSE);
-
       /* Don't allocate .got.plt section if there are no GOT nor PLT
          entries and there is no reference to _GLOBAL_OFFSET_TABLE_.  */
-      if ((got == NULL
-          || !got->ref_regular_nonweak)
+      if ((htab->elf.hgot == NULL
+          || !htab->elf.hgot->ref_regular_nonweak)
          && (htab->elf.sgotplt->size
              == get_elf_backend_data (output_bfd)->got_header_size)
          && (htab->elf.splt == NULL
@@ -4518,7 +4516,7 @@ elf_i386_finish_dynamic_symbol (bfd *output_bfd,
          || plt == NULL
          || gotplt == NULL
          || relplt == NULL)
-       return FALSE;
+       abort ();
 
       /* Get the index in the procedure linkage table which
         corresponds to this symbol.  This is the index of this symbol
This page took 0.024063 seconds and 4 git commands to generate.