[binutils-gdb] elflink.c: split _bfd_elf_link_create_dynstrtab
Alan Modra
amodra@sourceware.org
Mon Aug 17 01:24:30 GMT 2026
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=6bbbbf52e4dee104e82c3bd2d40ba5894bca33a4
commit 6bbbbf52e4dee104e82c3bd2d40ba5894bca33a4
Author: Alan Modra <amodra@gmail.com>
Date: Thu Aug 6 11:15:22 2026 +0930
elflink.c: split _bfd_elf_link_create_dynstrtab
_bfd_elf_link_create_dynstrtab doesn't just create dynstrtab, it also
sets dynobj. This patch splits it into two separate functions,
_bfd_elf_link_dynobj and _bfd_elf_link_dynstr.
There should be no linker behaviour changes due to this patch.
* elflink.c (_bfd_elf_link_create_dynstrtab): Split into..
(_bfd_elf_link_dynobj): ..this new function..
(_bfd_elf_link_dynstr): ..and this new function.
(bfd_elf_link_create_dynamic_sections): Replace call to
_bfd_elf_link_create_dynstrtab with calls to new functions.
(bfd_elf_link_record_dynamic_symbol): Use _bfd_elf_link_dynstr.
(bfd_elf_link_record_local_dynamic_symbol): Likewise.
(bfd_elf_add_dt_needed_tag): Don't call
_bfd_elf_link_create_dynstrtab, instead call
_bfd_elf_link_dynstr and move call to
bfd_elf_link_create_dynamic_sections earlier in order to set
dynobj.
Diff:
---
bfd/elflink.c | 76 +++++++++++++++++++++++++++++------------------------------
1 file changed, 38 insertions(+), 38 deletions(-)
diff --git a/bfd/elflink.c b/bfd/elflink.c
index bee57bcdff4..e60df0475c0 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -300,9 +300,10 @@ compatible_format (struct bfd_link_info *info, bfd *ibfd)
->relocs_compatible (ibfd->xvec, info->output_bfd->xvec)));
}
-/* Create a strtab to hold the dynamic symbol names. */
-static bool
-_bfd_elf_link_create_dynstrtab (bfd *abfd, struct bfd_link_info *info)
+/* Find a suitable object for attaching dynamic sections. */
+
+static bfd *
+_bfd_elf_link_dynobj (bfd *abfd, struct bfd_link_info *info)
{
struct elf_link_hash_table *hash_table;
@@ -325,16 +326,24 @@ _bfd_elf_link_create_dynstrtab (bfd *abfd, struct bfd_link_info *info)
break;
}
}
+ /* ??? Accept abfd anyway, if the loop doesn't find anything? */
hash_table->dynobj = abfd;
}
- if (hash_table->dynstr == NULL)
- {
- hash_table->dynstr = _bfd_elf_strtab_init ();
- if (hash_table->dynstr == NULL)
- return false;
- }
- return true;
+ return hash_table->dynobj;
+}
+
+/* Return the strtab for dynamic symbol names. Create it if
+ necessary. */
+
+static struct elf_strtab_hash *
+_bfd_elf_link_dynstr (struct bfd_link_info *info)
+{
+ struct elf_link_hash_table *htab = elf_hash_table (info);
+
+ if (htab->dynstr == NULL)
+ htab->dynstr = _bfd_elf_strtab_init ();
+ return htab->dynstr;
}
/* Create some sections which will be filled in with dynamic linking
@@ -359,10 +368,12 @@ bfd_elf_link_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
if (elf_hash_table (info)->dynamic_sections_created)
return true;
- if (!_bfd_elf_link_create_dynstrtab (abfd, info))
+ if (!_bfd_elf_link_dynstr (info))
return false;
- dynobj = elf_hash_table (info)->dynobj;
+ dynobj = _bfd_elf_link_dynobj (abfd, info);
+ if (dynobj == NULL)
+ return false;
obed = get_elf_backend_data (dynobj);
flags = obed->dynamic_sec_flags;
@@ -648,14 +659,9 @@ bfd_elf_link_record_dynamic_symbol (struct bfd_link_info *info,
elf_hash_table (info)->has_local_dynsyms = true;
++elf_hash_table (info)->dynsymcount;
- dynstr = elf_hash_table (info)->dynstr;
+ dynstr = _bfd_elf_link_dynstr (info);
if (dynstr == NULL)
- {
- /* Create a strtab to hold the dynamic symbol names. */
- elf_hash_table (info)->dynstr = dynstr = _bfd_elf_strtab_init ();
- if (dynstr == NULL)
- return false;
- }
+ return false;
char *unversioned_name = NULL;
@@ -916,14 +922,9 @@ bfd_elf_link_record_local_dynamic_symbol (struct bfd_link_info *info,
(input_bfd, elf_symtab_hdr (input_bfd).sh_link,
entry->isym.st_name));
- dynstr = elf_hash_table (info)->dynstr;
+ dynstr = _bfd_elf_link_dynstr (info);
if (dynstr == NULL)
- {
- /* Create a strtab to hold the dynamic symbol names. */
- elf_hash_table (info)->dynstr = dynstr = _bfd_elf_strtab_init ();
- if (dynstr == NULL)
- return 0;
- }
+ return 0;
dynstr_index = _bfd_elf_strtab_add (dynstr, name, false);
if (dynstr_index == (size_t) -1)
@@ -3955,27 +3956,29 @@ _bfd_elf_strip_zero_sized_dynamic_sections (struct bfd_link_info *info)
int
bfd_elf_add_dt_needed_tag (bfd *abfd, struct bfd_link_info *info)
{
- struct elf_link_hash_table *hash_table;
+ struct elf_strtab_hash *dynstr;
size_t strindex;
const char *soname;
- if (!_bfd_elf_link_create_dynstrtab (abfd, info))
+ dynstr = _bfd_elf_link_dynstr (info);
+ if (dynstr == NULL)
return -1;
- hash_table = elf_hash_table (info);
soname = elf_dt_name (abfd);
- strindex = _bfd_elf_strtab_add (hash_table->dynstr, soname, false);
+ strindex = _bfd_elf_strtab_add (dynstr, soname, false);
if (strindex == (size_t) -1)
return -1;
- if (_bfd_elf_strtab_refcount (hash_table->dynstr, strindex) != 1)
+ if (!bfd_elf_link_create_dynamic_sections (abfd, info))
+ return -1;
+
+ if (_bfd_elf_strtab_refcount (dynstr, strindex) != 1)
{
- asection *sdyn;
- elf_backend_data *obed;
+ struct elf_link_hash_table *hash_table = elf_hash_table (info);
+ elf_backend_data *obed = get_elf_backend_data (hash_table->dynobj);
+ asection *sdyn = hash_table->dynamic;
bfd_byte *extdyn;
- obed = get_elf_backend_data (hash_table->dynobj);
- sdyn = hash_table->dynamic;
if (sdyn != NULL && sdyn->size != 0)
for (extdyn = sdyn->contents;
extdyn < sdyn->contents + sdyn->size;
@@ -3993,9 +3996,6 @@ bfd_elf_add_dt_needed_tag (bfd *abfd, struct bfd_link_info *info)
}
}
- if (!bfd_elf_link_create_dynamic_sections (hash_table->dynobj, info))
- return -1;
-
if (!_bfd_elf_add_dynamic_entry (info, DT_NEEDED, strindex))
return -1;
More information about the Binutils-cvs
mailing list