From: Alan Modra Date: Fri, 21 Nov 2025 22:43:26 +0000 (+1030) Subject: bfd_copy_private_symbol_data X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f5336048aea45baa72c15ca684a62965495cc155;p=thirdparty%2Fbinutils-gdb.git bfd_copy_private_symbol_data 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);