[binutils-gdb] elflink.c: _bfd_elf_make_dynamic_reloc_section sanity checks
Alan Modra
amodra@sourceware.org
Mon Aug 17 01:24:35 GMT 2026
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=53fd57102aa8f37fa604ef40a1f58bd86315832f
commit 53fd57102aa8f37fa604ef40a1f58bd86315832f
Author: Alan Modra <amodra@gmail.com>
Date: Thu Aug 6 11:15:41 2026 +0930
elflink.c: _bfd_elf_make_dynamic_reloc_section sanity checks
Add a check that the byte order for an input object needing dynamic
relocs matches the byte order of the output. Also free up a little
memory if the string created by get_dynamic_reloc_section_name is
unused. The change in get_dynamic_reloc_section_name return value
is to avoid a cast when calling bfd_release.
* elflink.c (get_dynamic_reloc_section_name): Return char*.
(_bfd_elf_make_dynamic_reloc_section): Sanity check that
dynobj exists, and that relocs and byte order are as expected.
Release name if section already exists.
Diff:
---
bfd/elflink.c | 26 ++++++++++++++++++++------
1 file changed, 20 insertions(+), 6 deletions(-)
diff --git a/bfd/elflink.c b/bfd/elflink.c
index e60df0475c0..5a3ee89142b 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -15522,9 +15522,9 @@ _bfd_elf_default_got_elt_size (struct bfd_link_info *info,
/* Returns the name of the dynamic reloc section associated with SEC. */
-static const char *
-get_dynamic_reloc_section_name (bfd * abfd,
- asection * sec,
+static char *
+get_dynamic_reloc_section_name (bfd *abfd,
+ asection *sec,
bool is_rela)
{
const char *prefix = is_rela ? ".rela" : ".rel";
@@ -15561,14 +15561,28 @@ _bfd_elf_make_dynamic_reloc_section (asection *sec,
if (reloc_sec == NULL)
{
- const char * name = get_dynamic_reloc_section_name (abfd, sec, is_rela);
+ bool known = (dynobj != NULL
+ && (get_elf_backend_data (dynobj)
+ ->relocs_compatible (dynobj->xvec, abfd->xvec)));
+ BFD_ASSERT (known);
+ if (!known
+ || dynobj->xvec->byteorder != abfd->xvec->byteorder)
+ {
+ _bfd_error_handler (_("%s dynamic relocs incompatible with%s%s output"),
+ bfd_get_target (abfd),
+ dynobj ? " " : "",
+ dynobj ? bfd_get_target (dynobj) : "");
+ return NULL;
+ }
+ char *name = get_dynamic_reloc_section_name (dynobj, sec, is_rela);
if (name == NULL)
return NULL;
reloc_sec = bfd_get_linker_section (dynobj, name);
-
- if (reloc_sec == NULL)
+ if (reloc_sec != NULL)
+ bfd_release (dynobj, name);
+ else
{
flagword flags = (SEC_HAS_CONTENTS | SEC_READONLY
| SEC_IN_MEMORY | SEC_LINKER_CREATED);
More information about the Binutils-cvs
mailing list