[binutils-gdb] x86: traverse loc_hash_table only if used

H.J. Lu hjl@sourceware.org
Tue Dec 2 01:13:20 GMT 2025


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=8b3c7936b0bd48b7122cf940bef9e41343e3345e

commit 8b3c7936b0bd48b7122cf940bef9e41343e3345e
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Sat Nov 29 08:47:46 2025 +0800

    x86: traverse loc_hash_table only if used
    
    Traverse x86 loc_hash_table only if it is used.
    
            * elf32-i386.c (elf_i386_output_arch_local_syms): Traverse
            loc_hash_table only if has_loc_hash_table is set.
            * elf64-x86-64.c (elf_x86_64_output_arch_local_syms): Likewise.
            * elfxx-x86.c (_bfd_elf_x86_get_local_sym_hash): Set
            has_loc_hash_table.
            (_bfd_x86_elf_late_size_sections): Traverse loc_hash_table only
            if has_loc_hash_table is set.
            * elfxx-x86.h (elf_x86_link_hash_table): Move plt0_pad_byte and
            add has_loc_hash_table.
    
    Signed-off-by: H.J. Lu <hjl.tools@gmail.com>

Diff:
---
 bfd/elf32-i386.c   | 10 ++++++----
 bfd/elf64-x86-64.c | 10 ++++++----
 bfd/elfxx-x86.c    |  9 ++++++---
 bfd/elfxx-x86.h    |  9 ++++++---
 4 files changed, 24 insertions(+), 14 deletions(-)

diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c
index abb361be993..755c2176fd2 100644
--- a/bfd/elf32-i386.c
+++ b/bfd/elf32-i386.c
@@ -4271,10 +4271,12 @@ elf_i386_output_arch_local_syms
   if (htab == NULL)
     return false;
 
-  /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols.  */
-  htab_traverse (htab->loc_hash_table,
-		 elf_i386_finish_local_dynamic_symbol,
-		 info);
+  /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols if
+     needed.  */
+  if (htab->has_loc_hash_table)
+    htab_traverse (htab->loc_hash_table,
+		   elf_i386_finish_local_dynamic_symbol,
+		   info);
 
   return true;
 }
diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
index 337394fc478..1bffced9a30 100644
--- a/bfd/elf64-x86-64.c
+++ b/bfd/elf64-x86-64.c
@@ -5777,10 +5777,12 @@ elf_x86_64_output_arch_local_syms
   if (htab == NULL)
     return false;
 
-  /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols.  */
-  htab_traverse (htab->loc_hash_table,
-		 elf_x86_64_finish_local_dynamic_symbol,
-		 info);
+  /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols if
+     needed.  */
+  if (htab->has_loc_hash_table)
+    htab_traverse (htab->loc_hash_table,
+		   elf_x86_64_finish_local_dynamic_symbol,
+		   info);
 
   return true;
 }
diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c
index 24894193c86..e5a24c4ac1d 100644
--- a/bfd/elfxx-x86.c
+++ b/bfd/elfxx-x86.c
@@ -613,6 +613,7 @@ _bfd_elf_x86_get_local_sym_hash (struct elf_x86_link_hash_table *htab,
       ret->elf.dynindx = -1;
       ret->plt_got.offset = (bfd_vma) -1;
       *slot = ret;
+      htab->has_loc_hash_table = 1;
     }
   return &ret->elf;
 }
@@ -2425,9 +2426,11 @@ _bfd_x86_elf_late_size_sections (bfd *output_bfd,
   elf_link_hash_traverse (&htab->elf, elf_x86_allocate_dynrelocs,
 			  info);
 
-  /* Allocate .plt and .got entries, and space for local symbols.  */
-  htab_traverse (htab->loc_hash_table, elf_x86_allocate_local_dynreloc,
-		 info);
+  /* Allocate .plt and .got entries, and space for local symbols if
+     needed.  */
+  if (htab->has_loc_hash_table)
+    htab_traverse (htab->loc_hash_table, elf_x86_allocate_local_dynreloc,
+		   info);
 
   /* For every jump slot reserved in the sgotplt, reloc_count is
      incremented.  However, when we reserve space for TLS descriptors,
diff --git a/bfd/elfxx-x86.h b/bfd/elfxx-x86.h
index 7e196cd0475..99ef9341563 100644
--- a/bfd/elfxx-x86.h
+++ b/bfd/elfxx-x86.h
@@ -673,9 +673,8 @@ struct elf_x86_link_hash_table
   /* TRUE if inputs call ___tls_get_addr.  This is only used for i386.  */
   unsigned int has_tls_get_addr_call : 1;
 
-   /* Value used to fill the unused bytes of the first PLT entry.  This
-      is only used for i386.  */
-  bfd_byte plt0_pad_byte;
+  /* TRUE if loc_hash_table is used.  */
+  unsigned int has_loc_hash_table : 1;
 
   /* TRUE if GOT is referenced.  */
   unsigned int got_referenced : 1;
@@ -688,6 +687,10 @@ struct elf_x86_link_hash_table
      function address.  */
   unsigned int pcrel_plt : 1;
 
+   /* Value used to fill the unused bytes of the first PLT entry.  This
+      is only used for i386.  */
+  bfd_byte plt0_pad_byte;
+
   bfd_vma (*r_info) (bfd_vma, bfd_vma);
   bfd_vma (*r_sym) (bfd_vma);
   bool (*is_reloc_section) (const char *);


More information about the Binutils-cvs mailing list