From 80fccad2d4ce82a2ed9a5d8d081eb2daefa09f9d Mon Sep 17 00:00:00 2001 From: Bob Wilson Date: Mon, 17 May 2004 16:40:01 +0000 Subject: [PATCH] binutils ChangeLog: 2004-05-17 David Heine * objcopy.c (setup_bfd_headers): New function. (copy_object): Call setup_bfd_headers. bfd ChangeLog: 2004-05-17 David Heine * aout-target.h (MY_bfd_copy_private_header_data): Define. * aout-tic30.c (MY_bfd_copy_private_header_data): Define. * bfd.c (bfd_copy_private_header_data): Define. * coff-rs6000.c (rs6000coff_vec, pmac_xcoff_vec): Add entries for new interface. * coff64-rs6000.c (rs6000coff64_vec, aix5coff64_vec): Likewise. * coffcode.h (coff_bfd_copy_private_header_data): Define. * elf-bfd.h (_bfd_elf_copy_private_header_data): Declare. * elf.c (_bfd_elf_copy_private_section_data): Remove code to set up segments by calling copy_private_bfd_data. (_bfd_elf_copy_private_header_data): Define. * elfxx-target.h (bfd_elfNN_bfd_copy_private_header_data): Define. * libbfd-in.h (_bfd_generic_bfd_copy_private_header_data): Define. * libecoff.h (_bfd_ecoff_bfd_copy_private_header_data): Define. * mach-o.c (bfd_mach_o_bfd_copy_private_header_data): Define. * mmo.c (mmo_bfd_copy_private_header_data): Define. * ppcboot.c (ppcboot_bfd_copy_private_header_data): Define. * som.c (som_bfd_copy_private_header_data): Define. * targets.c (BFD_JUMP_TABLE_COPY): Add _bfd_copy_private_header_data. * vms.c (vms_bfd_copy_private_header_data): Define. * bfd-in2.h: Regenerate. * libbfd.h: Regenerate. --- bfd/ChangeLog | 25 +++++++++++++++++++++++++ bfd/aout-target.h | 4 ++++ bfd/aout-tic30.c | 4 ++++ bfd/bfd-in2.h | 10 ++++++++++ bfd/bfd.c | 23 +++++++++++++++++++++++ bfd/coff-rs6000.c | 2 ++ bfd/coff64-rs6000.c | 2 ++ bfd/coffcode.h | 4 ++++ bfd/elf-bfd.h | 2 ++ bfd/elf.c | 41 +++++++++++++++++++++++------------------ bfd/elfxx-target.h | 4 ++++ bfd/libbfd-in.h | 2 ++ bfd/libbfd.h | 8 +++++--- bfd/libecoff.h | 5 ++++- bfd/mach-o.c | 1 + bfd/mmo.c | 1 + bfd/ppcboot.c | 1 + bfd/som.c | 2 ++ bfd/targets.c | 5 +++++ bfd/vms.c | 2 ++ binutils/ChangeLog | 5 +++++ binutils/objcopy.c | 29 +++++++++++++++++++++++++++++ 22 files changed, 160 insertions(+), 22 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index b4b1d91aed..b5364ed2ba 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,28 @@ +2004-05-17 David Heine + + * aout-target.h (MY_bfd_copy_private_header_data): Define. + * aout-tic30.c (MY_bfd_copy_private_header_data): Define. + * bfd.c (bfd_copy_private_header_data): Define. + * coff-rs6000.c (rs6000coff_vec, pmac_xcoff_vec): Add entries for new + interface. + * coff64-rs6000.c (rs6000coff64_vec, aix5coff64_vec): Likewise. + * coffcode.h (coff_bfd_copy_private_header_data): Define. + * elf-bfd.h (_bfd_elf_copy_private_header_data): Declare. + * elf.c (_bfd_elf_copy_private_section_data): Remove code to set up + segments by calling copy_private_bfd_data. + (_bfd_elf_copy_private_header_data): Define. + * elfxx-target.h (bfd_elfNN_bfd_copy_private_header_data): Define. + * libbfd-in.h (_bfd_generic_bfd_copy_private_header_data): Define. + * libecoff.h (_bfd_ecoff_bfd_copy_private_header_data): Define. + * mach-o.c (bfd_mach_o_bfd_copy_private_header_data): Define. + * mmo.c (mmo_bfd_copy_private_header_data): Define. + * ppcboot.c (ppcboot_bfd_copy_private_header_data): Define. + * som.c (som_bfd_copy_private_header_data): Define. + * targets.c (BFD_JUMP_TABLE_COPY): Add _bfd_copy_private_header_data. + * vms.c (vms_bfd_copy_private_header_data): Define. + * bfd-in2.h: Regenerate. + * libbfd.h: Regenerate. + 2004-05-15 Thiemo Seufer * elfxx-mips.c (MINUS_TWO): Define. diff --git a/bfd/aout-target.h b/bfd/aout-target.h index 80513c7c73..fd344a45d5 100644 --- a/bfd/aout-target.h +++ b/bfd/aout-target.h @@ -559,6 +559,10 @@ MY_bfd_final_link (abfd, info) #define MY_bfd_copy_private_symbol_data _bfd_generic_bfd_copy_private_symbol_data #endif +#ifndef MY_bfd_copy_private_header_data +#define MY_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data +#endif + #ifndef MY_bfd_print_private_bfd_data #define MY_bfd_print_private_bfd_data _bfd_generic_bfd_print_private_bfd_data #endif diff --git a/bfd/aout-tic30.c b/bfd/aout-tic30.c index 1ae0ebfdab..af99c4bde9 100644 --- a/bfd/aout-tic30.c +++ b/bfd/aout-tic30.c @@ -1016,6 +1016,10 @@ tic30_aout_set_arch_mach (abfd, arch, machine) #define MY_bfd_copy_private_symbol_data _bfd_generic_bfd_copy_private_symbol_data #endif +#ifndef MY_bfd_copy_private_header_data +#define MY_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data +#endif + #ifndef MY_bfd_print_private_bfd_data #define MY_bfd_print_private_bfd_data _bfd_generic_bfd_print_private_bfd_data #endif diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index ee194f986c..3f38b6a5b4 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -3945,6 +3945,11 @@ void bfd_set_gp_size (bfd *abfd, unsigned int i); bfd_vma bfd_scan_vma (const char *string, const char **end, int base); +bfd_boolean bfd_copy_private_header_data (bfd *ibfd, bfd *obfd); + +#define bfd_copy_private_header_data(ibfd, obfd) \ + BFD_SEND (obfd, _bfd_copy_private_header_data, \ + (ibfd, obfd)) bfd_boolean bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd); #define bfd_copy_private_bfd_data(ibfd, obfd) \ @@ -4225,6 +4230,7 @@ typedef struct bfd_target NAME##_bfd_merge_private_bfd_data, \ NAME##_bfd_copy_private_section_data, \ NAME##_bfd_copy_private_symbol_data, \ + NAME##_bfd_copy_private_header_data, \ NAME##_bfd_set_private_flags, \ NAME##_bfd_print_private_bfd_data @@ -4242,6 +4248,10 @@ typedef struct bfd_target to another. */ bfd_boolean (*_bfd_copy_private_symbol_data) (bfd *, asymbol *, bfd *, asymbol *); + /* Called to copy BFD private header data from one object file + to another. */ + bfd_boolean (*_bfd_copy_private_header_data) + (bfd *, bfd *); /* Called to set private backend flags. */ bfd_boolean (*_bfd_set_private_flags) (bfd *, flagword); diff --git a/bfd/bfd.c b/bfd/bfd.c index e184781f5f..3ead0ee5b5 100644 --- a/bfd/bfd.c +++ b/bfd/bfd.c @@ -980,6 +980,29 @@ bfd_scan_vma (const char *string, const char **end, int base) return value; } +/* +FUNCTION + bfd_copy_private_header_data + +SYNOPSIS + bfd_boolean bfd_copy_private_header_data (bfd *ibfd, bfd *obfd); + +DESCRIPTION + Copy private BFD header information from the BFD @var{ibfd} to the + the BFD @var{obfd}. This copies information that may require + sections to exist, but does not require symbol tables. Return + <> on success, <> on error. + Possible error returns are: + + o <> - + Not enough memory exists to create private data for @var{obfd}. + +.#define bfd_copy_private_header_data(ibfd, obfd) \ +. BFD_SEND (obfd, _bfd_copy_private_header_data, \ +. (ibfd, obfd)) + +*/ + /* FUNCTION bfd_copy_private_bfd_data diff --git a/bfd/coff-rs6000.c b/bfd/coff-rs6000.c index 22d47c561b..cbd3a914c3 100644 --- a/bfd/coff-rs6000.c +++ b/bfd/coff-rs6000.c @@ -4142,6 +4142,7 @@ const bfd_target rs6000coff_vec = ((bfd_boolean (*) (bfd *, bfd *)) bfd_true), ((bfd_boolean (*) (bfd *, asection *, bfd *, asection *)) bfd_true), ((bfd_boolean (*) (bfd *, asymbol *, bfd *, asymbol *)) bfd_true), + ((bfd_boolean (*) (bfd *, bfd *)) bfd_true), ((bfd_boolean (*) (bfd *, flagword)) bfd_true), ((bfd_boolean (*) (bfd *, void * )) bfd_true), @@ -4386,6 +4387,7 @@ const bfd_target pmac_xcoff_vec = ((bfd_boolean (*) (bfd *, bfd *)) bfd_true), ((bfd_boolean (*) (bfd *, asection *, bfd *, asection *)) bfd_true), ((bfd_boolean (*) (bfd *, asymbol *, bfd *, asymbol *)) bfd_true), + ((bfd_boolean (*) (bfd *, bfd *)) bfd_true), ((bfd_boolean (*) (bfd *, flagword)) bfd_true), ((bfd_boolean (*) (bfd *, void * )) bfd_true), diff --git a/bfd/coff64-rs6000.c b/bfd/coff64-rs6000.c index 857a4b45c3..678ba9380b 100644 --- a/bfd/coff64-rs6000.c +++ b/bfd/coff64-rs6000.c @@ -2683,6 +2683,7 @@ const bfd_target rs6000coff64_vec = ((bfd_boolean (*) (bfd *, bfd *)) bfd_true), ((bfd_boolean (*) (bfd *, asection *, bfd *, asection *)) bfd_true), ((bfd_boolean (*) (bfd *, asymbol *, bfd *, asymbol *)) bfd_true), + ((bfd_boolean (*) (bfd *, bfd *)) bfd_true), ((bfd_boolean (*) (bfd *, flagword)) bfd_true), ((bfd_boolean (*) (bfd *, void * )) bfd_true), @@ -2928,6 +2929,7 @@ const bfd_target aix5coff64_vec = ((bfd_boolean (*) (bfd *, bfd *)) bfd_true), ((bfd_boolean (*) (bfd *, asection *, bfd *, asection *)) bfd_true), ((bfd_boolean (*) (bfd *, asymbol *, bfd *, asymbol *)) bfd_true), + ((bfd_boolean (*) (bfd *, bfd *)) bfd_true), ((bfd_boolean (*) (bfd *, flagword)) bfd_true), ((bfd_boolean (*) (bfd *, void * )) bfd_true), diff --git a/bfd/coffcode.h b/bfd/coffcode.h index 35da7c9054..d50744695f 100644 --- a/bfd/coffcode.h +++ b/bfd/coffcode.h @@ -5511,6 +5511,10 @@ static const bfd_coff_backend_data ticoff1_swap_table = #define coff_bfd_copy_private_symbol_data _bfd_generic_bfd_copy_private_symbol_data #endif +#ifndef coff_bfd_copy_private_header_data +#define coff_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data +#endif + #ifndef coff_bfd_copy_private_section_data #define coff_bfd_copy_private_section_data _bfd_generic_bfd_copy_private_section_data #endif diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 750cc1c675..82da5bb2ba 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -1379,6 +1379,8 @@ extern void bfd_elf_set_group_contents (bfd *, asection *, void *); extern void _bfd_elf_link_just_syms (asection *, struct bfd_link_info *); +extern bfd_boolean _bfd_elf_copy_private_header_data + (bfd *, bfd *); extern bfd_boolean _bfd_elf_copy_private_symbol_data (bfd *, asymbol *, bfd *, asymbol *); extern bfd_boolean _bfd_elf_copy_private_section_data diff --git a/bfd/elf.c b/bfd/elf.c index 8e208c22e6..0317e354a7 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -5290,24 +5290,6 @@ _bfd_elf_copy_private_section_data (bfd *ibfd, || obfd->xvec->flavour != bfd_target_elf_flavour) return TRUE; - if (elf_tdata (obfd)->segment_map == NULL && elf_tdata (ibfd)->phdr != NULL) - { - asection *s; - - /* Only set up the segments if there are no more SEC_ALLOC - sections. FIXME: This won't do the right thing if objcopy is - used to remove the last SEC_ALLOC section, since objcopy - won't call this routine in that case. */ - for (s = isec->next; s != NULL; s = s->next) - if ((s->flags & SEC_ALLOC) != 0) - break; - if (s == NULL) - { - if (! copy_private_bfd_data (ibfd, obfd)) - return FALSE; - } - } - ihdr = &elf_section_data (isec)->this_hdr; ohdr = &elf_section_data (osec)->this_hdr; @@ -5330,6 +5312,29 @@ _bfd_elf_copy_private_section_data (bfd *ibfd, return TRUE; } +/* Copy private header information. */ + +bfd_boolean +_bfd_elf_copy_private_header_data (bfd *ibfd, bfd *obfd) +{ + if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour + || bfd_get_flavour (obfd) != bfd_target_elf_flavour) + return TRUE; + + /* Copy over private BFD data if it has not already been copied. + This must be done here, rather than in the copy_private_bfd_data + entry point, because the latter is called after the section + contents have been set, which means that the program headers have + already been worked out. */ + if (elf_tdata (obfd)->segment_map == NULL && elf_tdata (ibfd)->phdr != NULL) + { + if (! copy_private_bfd_data (ibfd, obfd)) + return FALSE; + } + + return TRUE; +} + /* Copy private symbol information. If this symbol is in a section which we did not map into a BFD section, try to map the section index correctly. We use special macro definitions for the mapped diff --git a/bfd/elfxx-target.h b/bfd/elfxx-target.h index 61ed19788f..d0773e57bc 100644 --- a/bfd/elfxx-target.h +++ b/bfd/elfxx-target.h @@ -158,6 +158,10 @@ #define bfd_elfNN_bfd_copy_private_section_data \ _bfd_elf_copy_private_section_data #endif +#ifndef bfd_elfNN_bfd_copy_private_header_data +#define bfd_elfNN_bfd_copy_private_header_data \ + _bfd_elf_copy_private_header_data +#endif #ifndef bfd_elfNN_bfd_copy_private_bfd_data #define bfd_elfNN_bfd_copy_private_bfd_data \ _bfd_elf_copy_private_bfd_data diff --git a/bfd/libbfd-in.h b/bfd/libbfd-in.h index fb021d3b03..6d3a335eaf 100644 --- a/bfd/libbfd-in.h +++ b/bfd/libbfd-in.h @@ -212,6 +212,8 @@ extern bfd_boolean _bfd_generic_get_section_contents_in_window ((bfd_boolean (*) (bfd *, asection *, bfd *, asection *)) bfd_true) #define _bfd_generic_bfd_copy_private_symbol_data \ ((bfd_boolean (*) (bfd *, asymbol *, bfd *, asymbol *)) bfd_true) +#define _bfd_generic_bfd_copy_private_header_data \ + ((bfd_boolean (*) (bfd *, bfd *)) bfd_true) #define _bfd_generic_bfd_print_private_bfd_data \ ((bfd_boolean (*) (bfd *, void *)) bfd_true) diff --git a/bfd/libbfd.h b/bfd/libbfd.h index 6841e29b8e..86819ff03e 100644 --- a/bfd/libbfd.h +++ b/bfd/libbfd.h @@ -217,6 +217,8 @@ extern bfd_boolean _bfd_generic_get_section_contents_in_window ((bfd_boolean (*) (bfd *, asection *, bfd *, asection *)) bfd_true) #define _bfd_generic_bfd_copy_private_symbol_data \ ((bfd_boolean (*) (bfd *, asymbol *, bfd *, asymbol *)) bfd_true) +#define _bfd_generic_bfd_copy_private_header_data \ + ((bfd_boolean (*) (bfd *, bfd *)) bfd_true) #define _bfd_generic_bfd_print_private_bfd_data \ ((bfd_boolean (*) (bfd *, void *)) bfd_true) @@ -696,9 +698,9 @@ struct _bfd_window_internal { extern bfd *bfd_last_cache; #define bfd_cache_lookup(x) \ - ((x)==bfd_last_cache? \ - (FILE*) (bfd_last_cache->iostream): \ - bfd_cache_lookup_worker(x)) + ((x) == bfd_last_cache ? \ + (FILE *) (bfd_last_cache->iostream): \ + bfd_cache_lookup_worker (x)) bfd_boolean bfd_cache_init (bfd *abfd); bfd_boolean bfd_cache_close (bfd *abfd); diff --git a/bfd/libecoff.h b/bfd/libecoff.h index 7d4006a951..b809f3a066 100644 --- a/bfd/libecoff.h +++ b/bfd/libecoff.h @@ -1,5 +1,5 @@ /* BFD ECOFF object file private structure. - Copyright 1993, 1994, 1995, 1996, 1999, 2001, 2002, 2003 + Copyright 1993, 1994, 1995, 1996, 1999, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. Written by Ian Lance Taylor, Cygnus Support. @@ -249,6 +249,9 @@ extern bfd_boolean _bfd_ecoff_bfd_copy_private_bfd_data #define _bfd_ecoff_bfd_copy_private_symbol_data \ _bfd_generic_bfd_copy_private_symbol_data +#define _bfd_ecoff_bfd_copy_private_header_data \ + _bfd_generic_bfd_copy_private_header_data + #define _bfd_ecoff_bfd_print_private_bfd_data \ _bfd_generic_bfd_print_private_bfd_data diff --git a/bfd/mach-o.c b/bfd/mach-o.c index eaa7aba88a..b2401c4359 100644 --- a/bfd/mach-o.c +++ b/bfd/mach-o.c @@ -70,6 +70,7 @@ #define bfd_mach_o_bfd_merge_sections bfd_generic_merge_sections #define bfd_mach_o_bfd_is_group_section bfd_generic_is_group_section #define bfd_mach_o_bfd_discard_group bfd_generic_discard_group +#define bfd_mach_o_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data static bfd_boolean bfd_mach_o_bfd_copy_private_symbol_data PARAMS ((bfd *, asymbol *, bfd *, asymbol *)); diff --git a/bfd/mmo.c b/bfd/mmo.c index d791062ecc..fc6c21330f 100644 --- a/bfd/mmo.c +++ b/bfd/mmo.c @@ -3306,6 +3306,7 @@ mmo_canonicalize_reloc (abfd, section, relptr, symbols) #define mmo_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data #define mmo_bfd_copy_private_section_data _bfd_generic_bfd_copy_private_section_data #define mmo_bfd_copy_private_symbol_data _bfd_generic_bfd_copy_private_symbol_data +#define mmo_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data #define mmo_bfd_set_private_flags _bfd_generic_bfd_set_private_flags #define mmo_bfd_print_private_bfd_data _bfd_generic_bfd_print_private_bfd_data diff --git a/bfd/ppcboot.c b/bfd/ppcboot.c index d34f1a2777..cc4dc27741 100644 --- a/bfd/ppcboot.c +++ b/bfd/ppcboot.c @@ -484,6 +484,7 @@ ppcboot_bfd_print_private_bfd_data (abfd, farg) #define ppcboot_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data #define ppcboot_bfd_copy_private_section_data _bfd_generic_bfd_copy_private_section_data #define ppcboot_bfd_copy_private_symbol_data _bfd_generic_bfd_copy_private_symbol_data +#define ppcboot_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data #define ppcboot_bfd_set_private_flags _bfd_generic_bfd_set_private_flags #define ppcboot_bfd_print_private_bfd_dat ppcboot_bfd_print_private_bfd_data diff --git a/bfd/som.c b/bfd/som.c index 899a8a293d..e05d4af81b 100644 --- a/bfd/som.c +++ b/bfd/som.c @@ -192,6 +192,8 @@ static bfd_boolean som_bfd_copy_private_section_data PARAMS ((bfd *, asection *, bfd *, asection *)); static bfd_boolean som_bfd_copy_private_bfd_data PARAMS ((bfd *, bfd *)); +#define som_bfd_copy_private_header_data \ + _bfd_generic_bfd_copy_private_header_data #define som_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data #define som_bfd_set_private_flags _bfd_generic_bfd_set_private_flags static bfd_boolean som_bfd_is_local_label_name diff --git a/bfd/targets.c b/bfd/targets.c index ad6362abfc..bceb724e22 100644 --- a/bfd/targets.c +++ b/bfd/targets.c @@ -265,6 +265,7 @@ BFD_JUMP_TABLE macros. . NAME##_bfd_merge_private_bfd_data, \ . NAME##_bfd_copy_private_section_data, \ . NAME##_bfd_copy_private_symbol_data, \ +. NAME##_bfd_copy_private_header_data, \ . NAME##_bfd_set_private_flags, \ . NAME##_bfd_print_private_bfd_data . @@ -282,6 +283,10 @@ BFD_JUMP_TABLE macros. . to another. *} . bfd_boolean (*_bfd_copy_private_symbol_data) . (bfd *, asymbol *, bfd *, asymbol *); +. {* Called to copy BFD private header data from one object file +. to another. *} +. bfd_boolean (*_bfd_copy_private_header_data) +. (bfd *, bfd *); . {* Called to set private backend flags. *} . bfd_boolean (*_bfd_set_private_flags) (bfd *, flagword); . diff --git a/bfd/vms.c b/bfd/vms.c index 329b0564ad..f6d3c1a7f5 100644 --- a/bfd/vms.c +++ b/bfd/vms.c @@ -168,6 +168,8 @@ static bfd_boolean vms_bfd_set_private_flags #define vms_bfd_link_just_syms _bfd_generic_link_just_syms #define vms_bfd_is_group_section bfd_generic_is_group_section #define vms_bfd_discard_group bfd_generic_discard_group +#define vms_bfd_copy_private_header_data \ + _bfd_generic_bfd_copy_private_header_data /*===========================================================================*/ diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 0cbdf4ba28..2dab43f08b 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,8 @@ +2004-05-17 David Heine + + * objcopy.c (setup_bfd_headers): New function. + (copy_object): Call setup_bfd_headers. + 2004-05-13 Paul Brook * readelf.c (display_debug_frames): Handle dwarf3 format CIE diff --git a/binutils/objcopy.c b/binutils/objcopy.c index aad68ad7df..839d27bc17 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -377,6 +377,7 @@ extern unsigned long bfd_external_machine; /* Forward declarations. */ static void setup_section (bfd *, asection *, void *); +static void setup_bfd_headers (bfd *, bfd *); static void copy_section (bfd *, asection *, void *); static void get_sections (bfd *, asection *, void *); static int compare_section_lma (const void *, const void *); @@ -1178,6 +1179,8 @@ copy_object (bfd *ibfd, bfd *obfd) any output is done. Thus, we traverse all sections multiple times. */ bfd_map_over_sections (ibfd, setup_section, obfd); + setup_bfd_headers (ibfd, obfd); + if (add_sections != NULL) { struct section_add *padd; @@ -1808,6 +1811,32 @@ find_section_rename (bfd * ibfd ATTRIBUTE_UNUSED, sec_ptr isection, return old_name; } +/* Once each of the sections is copied, we may still need to do some + finalization work for private section headers. Do that here. */ + +static void +setup_bfd_headers (bfd *ibfd, bfd *obfd) +{ + const char *err; + + /* Allow the BFD backend to copy any private data it understands + from the input section to the output section. */ + if (! bfd_copy_private_header_data (ibfd, obfd)) + { + err = _("private header data"); + goto loser; + } + + /* All went well. */ + return; + +loser: + non_fatal (_("%s: error in %s: %s"), + bfd_get_filename (ibfd), + err, bfd_errmsg (bfd_get_error ())); + status = 1; +} + /* Create a section in OBFD with the same name and attributes as ISECTION in IBFD. */ -- 2.34.1