[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