x86: Set GOT refcount to 1
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 10 Oct 2017 22:52:39 +0000 (15:52 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 10 Oct 2017 22:52:39 +0000 (15:52 -0700)
Since x86 check_relocs is called after opening all inputs and garbage
collection, they never see the removed sections.  There is no need
for incrementing GOT refcount.  But since PLT refcount is also used in

  /* Don't create the PLT entry if there are only function pointer
     relocations which can be resolved at run-time.  */
  else if (htab->elf.dynamic_sections_created
           && (h->plt.refcount > eh->func_pointer_refcount
               || eh->plt_got.refcount > 0))
    {

we must increment it.

* elf32-i386.c (elf_i386_check_relocs): Set GOT refcount to 1
instead of incrementing it.
* elf64-x86-64.c (elf_x86_64_check_relocs): Likewise.

bfd/ChangeLog
bfd/elf32-i386.c
bfd/elf64-x86-64.c

index bf400a93512df0b93c9394eacf8307c027e73cf2..52ff64752220d1cbd8f5e5ecf2e78f6c66fa9082 100644 (file)
@@ -1,3 +1,9 @@
+2017-10-10  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * elf32-i386.c (elf_i386_check_relocs): Set GOT refcount to 1
+       instead of incrementing it.
+       * elf64-x86-64.c (elf_x86_64_check_relocs): Likewise.
+
 2017-10-10  Renlin Li  <renlin.li@arm.com>
 
        PR ld/21402
index f752de6063b33a8b073aa8f48fb95a668a36a5f7..ade1e7d9cecf431955b60bfee8f98ae5c7acdc15 100644 (file)
@@ -1603,7 +1603,7 @@ elf_i386_check_relocs (bfd *abfd,
       switch (r_type)
        {
        case R_386_TLS_LDM:
-         htab->tls_ld_or_ldm_got.refcount += 1;
+         htab->tls_ld_or_ldm_got.refcount = 1;
          goto create_got;
 
        case R_386_PLT32:
@@ -1670,7 +1670,7 @@ elf_i386_check_relocs (bfd *abfd,
 
            if (h != NULL)
              {
-               h->got.refcount += 1;
+               h->got.refcount = 1;
                old_tls_type = elf_x86_hash_entry (h)->tls_type;
              }
            else
@@ -1696,7 +1696,7 @@ elf_i386_check_relocs (bfd *abfd,
                    elf_x86_local_got_tls_type (abfd)
                      = (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info);
                  }
-               local_got_refcounts[r_symndx] += 1;
+               local_got_refcounts[r_symndx] = 1;
                old_tls_type = elf_x86_local_got_tls_type (abfd) [r_symndx];
              }
 
index 0b0aa6cb4de419ce7f5c711d3591a12e145a5dc1..7d65dca298d26f38fc55c7154d7b401514ea76c6 100644 (file)
@@ -1950,7 +1950,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
       switch (r_type)
        {
        case R_X86_64_TLSLD:
-         htab->tls_ld_or_ldm_got.refcount += 1;
+         htab->tls_ld_or_ldm_got.refcount = 1;
          goto create_got;
 
        case R_X86_64_TPOFF32:
@@ -1992,7 +1992,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
 
            if (h != NULL)
              {
-               h->got.refcount += 1;
+               h->got.refcount = 1;
                old_tls_type = eh->tls_type;
              }
            else
@@ -2018,7 +2018,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
                    elf_x86_local_got_tls_type (abfd)
                      = (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info);
                  }
-               local_got_refcounts[r_symndx] += 1;
+               local_got_refcounts[r_symndx] = 1;
                old_tls_type
                  = elf_x86_local_got_tls_type (abfd) [r_symndx];
              }