[PATCH] ld: Add scan_relocs to ELF linker

Alan Modra amodra@gmail.com
Fri Jan 7 03:16:33 GMT 2022


On Thu, Jan 06, 2022 at 03:22:22PM -0800, H.J. Lu wrote:
> elf_backend_always_size_sections is called too late to scan input
> relocation.  elf_backend_always_size_sections works for me when
> it is called at the beginning of bfd_elf_size_dynamic_sections, like

I think that should be OK, with the init_{got,plt}_refcount moved too.

	* elflink.c (bfd_elf_size_dynamic_sections): Move plt/got init
	earlier and call elf_backend_always_size_sections at the start
	of this function.

diff --git a/bfd/elflink.c b/bfd/elflink.c
index 553efa26232..08c161713cc 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -6506,6 +6506,21 @@ bfd_elf_size_dynamic_sections (bfd *output_bfd,
   if (!is_elf_hash_table (info->hash))
     return true;
 
+  /* Any syms created from now on start with -1 in
+     got.refcount/offset and plt.refcount/offset.  */
+  elf_hash_table (info)->init_got_refcount
+    = elf_hash_table (info)->init_got_offset;
+  elf_hash_table (info)->init_plt_refcount
+    = elf_hash_table (info)->init_plt_offset;
+
+  bed = get_elf_backend_data (output_bfd);
+
+  /* The backend may have to create some sections regardless of whether
+     we're dynamic or not.  */
+  if (bed->elf_backend_always_size_sections
+      && ! (*bed->elf_backend_always_size_sections) (output_bfd, info))
+    return false;
+
   dynobj = elf_hash_table (info)->dynobj;
 
   if (dynobj != NULL && elf_hash_table (info)->dynamic_sections_created)
@@ -6864,8 +6879,6 @@ bfd_elf_size_dynamic_sections (bfd *output_bfd,
 	}
     }
 
-  bed = get_elf_backend_data (output_bfd);
-
   if (info->gc_sections && bed->can_gc_sections)
     {
       struct elf_gc_sweep_symbol_info sweep_info;
@@ -6987,23 +7000,10 @@ bfd_elf_size_dynamic_sections (bfd *output_bfd,
 	}
     }
 
-  /* Any syms created from now on start with -1 in
-     got.refcount/offset and plt.refcount/offset.  */
-  elf_hash_table (info)->init_got_refcount
-    = elf_hash_table (info)->init_got_offset;
-  elf_hash_table (info)->init_plt_refcount
-    = elf_hash_table (info)->init_plt_offset;
-
   if (bfd_link_relocatable (info)
       && !_bfd_elf_size_group_sections (info))
     return false;
 
-  /* The backend may have to create some sections regardless of whether
-     we're dynamic or not.  */
-  if (bed->elf_backend_always_size_sections
-      && ! (*bed->elf_backend_always_size_sections) (output_bfd, info))
-    return false;
-
   /* Determine any GNU_STACK segment requirements, after the backend
      has had a chance to set a default segment size.  */
   if (info->execstack)

-- 
Alan Modra
Australia Development Lab, IBM


More information about the Binutils mailing list