[PATCH] elf: Cache ".interp" section pointer in elf_link_hash_table
H.J. Lu
hjl.tools@gmail.com
Sun Sep 14 21:54:11 GMT 2025
If there is no interpreter (no ".interp" sectio), weak undefined symbols
will always be zero at run-time. Cache ".interp" section pointer in
elf_link_hash_table so that a backend can use it to check if weak
undefined symbols should be resolved to zero at link-time.
PR ld/33427
* elf-bfd.h (elf_link_hash_table): Add interp.
* elflink.c (_bfd_elf_link_create_dynamic_sections): Cache the
pointer to ".interp" section in interp.
* elfxx-x86.c (_bfd_x86_elf_link_symbol_references_local): Check
htab->elf.interp instead of htab->interp.
(_bfd_x86_elf_link_setup_gnu_properties): Use htab->elf.interp.
* elfxx-x86.h (elf_x86_link_hash_table): Remove interp.
Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
---
bfd/elf-bfd.h | 1 +
bfd/elflink.c | 1 +
bfd/elfxx-x86.c | 7 ++-----
bfd/elfxx-x86.h | 1 -
4 files changed, 4 insertions(+), 6 deletions(-)
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index de7cc410a99..51e6ae7bb78 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -774,6 +774,7 @@ struct elf_link_hash_table
asection *dynsym;
asection *srelrdyn;
asection *dynamic;
+ asection *interp;
};
/* Returns TRUE if the hash table is a struct elf_link_hash_table. */
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 53ec792852c..b8ffcab419c 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -354,6 +354,7 @@ _bfd_elf_link_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
flags | SEC_READONLY);
if (s == NULL)
return false;
+ elf_hash_table (info)->interp = s;
}
/* Create sections to hold version informations. These are removed
diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c
index 06265ee4e15..4ca4c3a3948 100644
--- a/bfd/elfxx-x86.c
+++ b/bfd/elfxx-x86.c
@@ -3665,7 +3665,7 @@ _bfd_x86_elf_link_symbol_references_local (struct bfd_link_info *info,
|| (h->root.type == bfd_link_hash_undefweak
&& (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
|| (bfd_link_executable (info)
- && htab->interp == NULL)
+ && htab->elf.interp == NULL)
|| info->dynamic_undefined_weak == 0))
|| ((h->def_regular || ELF_COMMON_DEF_P (h))
&& info->version_info != NULL
@@ -4704,13 +4704,10 @@ _bfd_x86_elf_link_setup_gnu_properties
section to the interpreter. */
if (bfd_link_executable (info) && !info->nointerp)
{
- asection *s = bfd_get_linker_section (dynobj, ".interp");
- if (s == NULL)
- abort ();
+ asection *s = htab->elf.interp;
s->size = htab->dynamic_interpreter_size;
s->contents = (unsigned char *) htab->dynamic_interpreter;
s->alloced = 1;
- htab->interp = s;
}
if (normal_target)
diff --git a/bfd/elfxx-x86.h b/bfd/elfxx-x86.h
index 5593203f9ec..1ebc9d2f2e5 100644
--- a/bfd/elfxx-x86.h
+++ b/bfd/elfxx-x86.h
@@ -602,7 +602,6 @@ struct elf_x86_link_hash_table
struct elf_link_hash_table elf;
/* Short-cuts to get to dynamic linker sections. */
- asection *interp;
asection *plt_eh_frame;
asection *plt_second;
asection *plt_second_eh_frame;
--
2.51.0
More information about the Binutils
mailing list