bfd_copy_private_symbol_data
Alan Modra
amodra@gmail.com
Fri Nov 21 23:30:59 GMT 2025
Allow copy_private_symbol_data to replace osym if a target desires.
Change isym similarly for symmetry. The idea is to make it possible
to give the asymbol an output target specific extension. Some
targets, eg. som, use such an extension when outputting symbols,
behaving badly if the input object is not som. There are no
functional changes in this patch; It just changes the signatures.
bfd/
* elf-bfd.h (_bfd_elf_copy_private_symbol_data): Replace
asymbol* params with asymbol**.
* elf.c (_bfd_elf_copy_private_symbol_data): Likewise.
* libbfd-in.h (_bfd_bool_bfd_asymbol_bfd_asymbol_true): Likewise.
* libbfd.c (_bfd_bool_bfd_asymbol_bfd_asymbol_true): Likewise.
* mach-o.c (bfd_mach_o_bfd_copy_private_symbol_data): Likewise.
* mach-o.h (bfd_mach_o_bfd_copy_private_symbol_data): Likewise.
* plugin.c (bfd_plugin_bfd_copy_private_symbol_data): Likewise.
* som.c (som_bfd_copy_private_symbol_data): Likewise.
* targets.c (bfd_target <_bfd_copy_private_symbol_data>): Likewise.
* bfd-in2.h: Regenerate.
* libbfd.h: Regenerate.
binutils/
* objcopy.c (copy_object): Adjust bfd_copy_private_symbol_data call.
gas/
* symbols.c symbol_clone): Adjust bfd_copy_private_symbol_data call.
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index 645c884bdb8..6c05c21a0da 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -7665,8 +7665,8 @@ typedef struct bfd_target
struct bfd_link_info *);
/* Called to copy BFD private symbol data from one symbol
to another. */
- bool (*_bfd_copy_private_symbol_data) (bfd *, asymbol *,
- bfd *, asymbol *);
+ bool (*_bfd_copy_private_symbol_data) (bfd *, asymbol **,
+ bfd *, asymbol **);
/* Called to copy BFD private header data from one object file
to another. */
bool (*_bfd_copy_private_header_data) (bfd *, bfd *);
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index 418b4e91b8b..73c5a5a0ec6 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -2406,7 +2406,7 @@ extern bool _bfd_elf_fixup_group_sections
extern bool _bfd_elf_copy_private_header_data
(bfd *, bfd *) ATTRIBUTE_HIDDEN;
extern bool _bfd_elf_copy_private_symbol_data
- (bfd *, asymbol *, bfd *, asymbol *) ATTRIBUTE_HIDDEN;
+ (bfd *, asymbol **, bfd *, asymbol **) ATTRIBUTE_HIDDEN;
extern bool _bfd_elf_copy_private_section_data
(bfd *, asection *, bfd *, asection *, struct bfd_link_info *)
ATTRIBUTE_HIDDEN;
diff --git a/bfd/elf.c b/bfd/elf.c
index fff7e83fd34..d51552e2a2d 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -8685,15 +8685,15 @@ _bfd_elf_copy_private_header_data (bfd *ibfd, bfd *obfd)
bool
_bfd_elf_copy_private_symbol_data (bfd *ibfd,
- asymbol *isymarg,
+ asymbol **isymarg,
bfd *obfd ATTRIBUTE_UNUSED,
- asymbol *osymarg)
+ asymbol **osymarg)
{
if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
return true;
- elf_symbol_type *isym = elf_symbol_from (isymarg);
- elf_symbol_type *osym = elf_symbol_from (osymarg);
+ elf_symbol_type *isym = elf_symbol_from (*isymarg);
+ elf_symbol_type *osym = elf_symbol_from (*osymarg);
if (isym != NULL
&& isym->internal_elf_sym.st_shndx != 0
&& osym != NULL
diff --git a/bfd/libbfd-in.h b/bfd/libbfd-in.h
index 93e49b8b3d5..254597a2271 100644
--- a/bfd/libbfd-in.h
+++ b/bfd/libbfd-in.h
@@ -179,7 +179,7 @@ extern bool _bfd_bool_bfd_uint_true
extern bool _bfd_bool_bfd_asection_bfd_asection_true
(bfd *, asection *, bfd *, asection *) ATTRIBUTE_HIDDEN;
extern bool _bfd_bool_bfd_asymbol_bfd_asymbol_true
- (bfd *, asymbol *, bfd *, asymbol *) ATTRIBUTE_HIDDEN;
+ (bfd *, asymbol **, bfd *, asymbol **) ATTRIBUTE_HIDDEN;
extern bool _bfd_bool_bfd_ptr_true
(bfd *, void *) ATTRIBUTE_HIDDEN;
extern void *_bfd_ptr_bfd_null_error
diff --git a/bfd/libbfd.c b/bfd/libbfd.c
index cb9862c399d..49e5b177500 100644
--- a/bfd/libbfd.c
+++ b/bfd/libbfd.c
@@ -113,9 +113,9 @@ _bfd_bool_bfd_asection_bfd_asection_true (bfd *ibfd ATTRIBUTE_UNUSED,
bool
_bfd_bool_bfd_asymbol_bfd_asymbol_true (bfd *ibfd ATTRIBUTE_UNUSED,
- asymbol *isym ATTRIBUTE_UNUSED,
+ asymbol **isym ATTRIBUTE_UNUSED,
bfd *obfd ATTRIBUTE_UNUSED,
- asymbol *osym ATTRIBUTE_UNUSED)
+ asymbol **osym ATTRIBUTE_UNUSED)
{
return true;
}
diff --git a/bfd/libbfd.h b/bfd/libbfd.h
index 3e522dd4ab4..2ae9b368c97 100644
--- a/bfd/libbfd.h
+++ b/bfd/libbfd.h
@@ -185,7 +185,7 @@ extern bool _bfd_bool_bfd_uint_true
extern bool _bfd_bool_bfd_asection_bfd_asection_true
(bfd *, asection *, bfd *, asection *) ATTRIBUTE_HIDDEN;
extern bool _bfd_bool_bfd_asymbol_bfd_asymbol_true
- (bfd *, asymbol *, bfd *, asymbol *) ATTRIBUTE_HIDDEN;
+ (bfd *, asymbol **, bfd *, asymbol **) ATTRIBUTE_HIDDEN;
extern bool _bfd_bool_bfd_ptr_true
(bfd *, void *) ATTRIBUTE_HIDDEN;
extern void *_bfd_ptr_bfd_null_error
diff --git a/bfd/mach-o.c b/bfd/mach-o.c
index e184ba7b5df..c05a1c20728 100644
--- a/bfd/mach-o.c
+++ b/bfd/mach-o.c
@@ -562,15 +562,15 @@ bfd_mach_o_append_command (bfd *abfd, bfd_mach_o_load_command *cmd)
bool
bfd_mach_o_bfd_copy_private_symbol_data (bfd *ibfd,
- asymbol *isymbol,
+ asymbol **isymbol,
bfd *obfd ATTRIBUTE_UNUSED,
- asymbol *osymbol)
+ asymbol **osymbol)
{
if (ibfd->xvec->flavour != bfd_target_mach_o_flavour)
return true;
- bfd_mach_o_asymbol *os = (bfd_mach_o_asymbol *) osymbol;
- bfd_mach_o_asymbol *is = (bfd_mach_o_asymbol *) isymbol;
+ bfd_mach_o_asymbol *os = (bfd_mach_o_asymbol *) *osymbol;
+ bfd_mach_o_asymbol *is = (bfd_mach_o_asymbol *) *isymbol;
os->n_type = is->n_type;
os->n_sect = is->n_sect;
os->n_desc = is->n_desc;
diff --git a/bfd/mach-o.h b/bfd/mach-o.h
index 1cda07226e5..3f2a7c1d3fd 100644
--- a/bfd/mach-o.h
+++ b/bfd/mach-o.h
@@ -688,8 +688,8 @@ int bfd_mach_o_lookup_command (bfd *, bfd_mach_o_load_command_type,
bfd_mach_o_load_command **);
bool bfd_mach_o_new_section_hook (bfd *, asection *);
bool bfd_mach_o_write_contents (bfd *);
-bool bfd_mach_o_bfd_copy_private_symbol_data (bfd *, asymbol *,
- bfd *, asymbol *);
+bool bfd_mach_o_bfd_copy_private_symbol_data (bfd *, asymbol **,
+ bfd *, asymbol **);
bool bfd_mach_o_bfd_copy_private_section_data (bfd *, asection *,
bfd *, asection *,
struct bfd_link_info *);
diff --git a/bfd/plugin.c b/bfd/plugin.c
index 45f17fee25a..c0421307b81 100644
--- a/bfd/plugin.c
+++ b/bfd/plugin.c
@@ -796,9 +796,9 @@ bfd_plugin_bfd_copy_private_section_data (bfd *ibfd ATTRIBUTE_UNUSED,
static bool
bfd_plugin_bfd_copy_private_symbol_data (bfd *ibfd ATTRIBUTE_UNUSED,
- asymbol *isymbol ATTRIBUTE_UNUSED,
+ asymbol **isymbol ATTRIBUTE_UNUSED,
bfd *obfd ATTRIBUTE_UNUSED,
- asymbol *osymbol ATTRIBUTE_UNUSED)
+ asymbol **osymbol ATTRIBUTE_UNUSED)
{
BFD_ASSERT (0);
return true;
diff --git a/bfd/som.c b/bfd/som.c
index 3d1cd0e828c..adc9c55bd17 100644
--- a/bfd/som.c
+++ b/bfd/som.c
@@ -5345,9 +5345,9 @@ som_new_section_hook (bfd *abfd, asection *newsect)
static bool
som_bfd_copy_private_symbol_data (bfd *ibfd,
- asymbol *isymbol,
+ asymbol **isymbol,
bfd *obfd ATTRIBUTE_UNUSED,
- asymbol *osymbol)
+ asymbol **osymbol)
{
/* One day we may try to grok other private data. */
if (ibfd->xvec->flavour != bfd_target_som_flavour)
@@ -5355,8 +5355,8 @@ som_bfd_copy_private_symbol_data (bfd *ibfd,
/* The only private information we need to copy is the argument relocation
bits. */
- struct som_symbol *input_symbol = (struct som_symbol *) isymbol;
- struct som_symbol *output_symbol = (struct som_symbol *) osymbol;
+ struct som_symbol *input_symbol = (struct som_symbol *) *isymbol;
+ struct som_symbol *output_symbol = (struct som_symbol *) *osymbol;
output_symbol->tc_data.ap.hppa_arg_reloc =
input_symbol->tc_data.ap.hppa_arg_reloc;
diff --git a/bfd/targets.c b/bfd/targets.c
index 89557a060e8..4ac70921c35 100644
--- a/bfd/targets.c
+++ b/bfd/targets.c
@@ -308,8 +308,8 @@ BFD_JUMP_TABLE macros.
. struct bfd_link_info *);
. {* Called to copy BFD private symbol data from one symbol
. to another. *}
-. bool (*_bfd_copy_private_symbol_data) (bfd *, asymbol *,
-. bfd *, asymbol *);
+. bool (*_bfd_copy_private_symbol_data) (bfd *, asymbol **,
+. bfd *, asymbol **);
. {* Called to copy BFD private header data from one object file
. to another. *}
. bool (*_bfd_copy_private_header_data) (bfd *, bfd *);
diff --git a/binutils/objcopy.c b/binutils/objcopy.c
index 4e1db46faaa..782fd469165 100644
--- a/binutils/objcopy.c
+++ b/binutils/objcopy.c
@@ -3392,7 +3392,7 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch)
}
for (long s = 0; s < symcount; s++)
- if (!bfd_copy_private_symbol_data (ibfd, osympp[s], obfd, osympp[s]))
+ if (!bfd_copy_private_symbol_data (ibfd, osympp + s, obfd, osympp + s))
goto fail;
if (dhandle != NULL)
diff --git a/gas/symbols.c b/gas/symbols.c
index 275d056cd42..e6f7826abd0 100644
--- a/gas/symbols.c
+++ b/gas/symbols.c
@@ -791,8 +791,8 @@ symbol_clone (symbolS *orgsymP, int replace)
bsymnew->name = bsymorg->name;
bsymnew->flags = bsymorg->flags & ~BSF_SECTION_SYM;
bsymnew->section = bsymorg->section;
- bfd_copy_private_symbol_data (bfd_asymbol_bfd (bsymorg), bsymorg,
- bfd_asymbol_bfd (bsymnew), bsymnew);
+ bfd_copy_private_symbol_data (bfd_asymbol_bfd (bsymorg), &orgsymP->bsym,
+ bfd_asymbol_bfd (bsymnew), &newsymP->bsym);
#ifdef obj_symbol_clone_hook
obj_symbol_clone_hook (newsymP, orgsymP);
--
Alan Modra
More information about the Binutils
mailing list