From 06f44071ccbeca33fff70b928b71d95a15982740 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 23 Jul 2019 17:46:38 +0930 Subject: [PATCH] ELF final_write_processing Move setting of OSABI to final_write_processing, after symbols are written. This allows OSABI to be set based on symbols actually written to the output rather than assuming input symbols will be output. Corrects object files such as the one generated on powerpc64le-linux by ld-powerpc/pr23927.s which has a local STT_GNU_IFUNC symbol but prior to this patch the file was marked ELFOSABI_NONE. * elf-bfd.h (enum elf_gnu_osabi): Rename from elf_gnu_symbols. Remove none, any, all enums. (struct elf_obj_tdata): Rename has_gnu_symbols field to has_gnu_osabi. (_bfd_elf_final_write_processing): Declare. * elf.c (_bfd_elf_write_object_contents): Unconditionally call elf_backend_final_write_processing. (_bfd_elf_post_process_headers): Move body of function to.. (_bfd_elf_final_write_processing): ..here, but set EI_OSABI byte only when not already set. Adjust for rename. * elfxx-target.h (elf_backend_final_write_processing): Default to _bfd_elf_final_write_processing. * elf-hppa.h (elf_hppa_final_write_processing): Call _bfd_elf_final_write_processing. * elf-m10300.c (_bfd_mn10300_elf_final_write_processing): Likewise. * elf-nacl.c (nacl_final_write_processing): Likewise. * elf-vxworks.c (elf_vxworks_final_write_processing): Likewise. * elf32-arc.c (arc_elf_final_write_processing): Likewise. * elf32-avr.c (bfd_elf_avr_final_write_processing): Likewise. * elf32-bfin.c (elf32_bfin_final_write_processing): Likewise. * elf32-cr16.c (_bfd_cr16_elf_final_write_processing): Likewise. * elf32-cris.c (cris_elf_final_write_processing): Likewise. * elf32-h8300.c (elf32_h8_final_write_processing): Likewise. * elf32-lm32.c (lm32_elf_final_write_processing): Likewise. * elf32-m32r.c (m32r_elf_final_write_processing): Likewise. * elf32-m68k.c (elf_m68k_final_write_processing): Likewise. * elf32-msp430.c (bfd_elf_msp430_final_write_processing): Likewise. * elf32-nds32.c (nds32_elf_final_write_processing): Likewise. * elf32-or1k.c (or1k_elf_final_write_processing): Likewise. * elf32-pj.c (pj_elf_final_write_processing): Likewise. * elf32-v850.c (v850_elf_final_write_processing): Likewise. * elf32-xc16x.c (elf32_xc16x_final_write_processing): Likewise. * elf32-xtensa.c (elf_xtensa_final_write_processing): Likewise. * elf64-ia64-vms.c (elf64_vms_final_write_processing): Likewise. * elfnn-ia64.c (elfNN_ia64_final_write_processing): Likewise. * elf32-arm.c (arm_final_write_processing): Split out from.. (elf32_arm_final_write_processing): ..here. Call _bfd_elf_final_write_processing. (elf32_arm_nacl_final_write_processing): Adjust. * elfxx-mips.c (_bfd_mips_final_write_processing): Split out from.. (_bfd_mips_elf_final_write_processing): ..here. Call _bfd_elf_final_write_processing. * elfxx-mips.h (_bfd_mips_final_write_processing): Declare. * elf32-mips.c (mips_vxworks_final_write_processing): Adjust. * elf32-ppc.c (ppc_final_write_processing): Split out from.. (ppc_elf_final_write_processing): ..here. Call _bfd_elf_final_write_processing. (ppc_elf_vxworks_final_write_processing): Adjust. * elf32-sparc.c (sparc_final_write_processing): Split out from.. (elf32_sparc_final_write_processing): ..here. Call _bfd_elf_final_write_processing. (elf32_sparc_vxworks_final_write_processing): Adjust. * elf32-d10v.c (elf_backend_final_write_processing): Don't define. * elf32-d30v.c (elf_backend_final_write_processing): Don't define. * elf32-m68hc11.c (elf_backend_final_write_processing): Don't define. * elf32-m68hc12.c (elf_backend_final_write_processing): Don't define. * elf32-s12z.c (elf_backend_final_write_processing): Don't define. * elf32-i386.c (elf_i386_check_relocs): Don't set has_gnu_symbols. * elf64-x86-64.c (elf_x86_64_check_relocs): Likewise. * elflink.c (elf_link_add_object_symbols): Likewise. (elf_link_output_symstrtab): Set has_gnu_osabi for symbols here instead. --- bfd/ChangeLog | 64 ++++++++++++++++++++++++++++++++++++++++++++ bfd/elf-bfd.h | 18 ++++++------- bfd/elf-hppa.h | 4 +-- bfd/elf-m10300.c | 4 +-- bfd/elf-nacl.c | 3 ++- bfd/elf-vxworks.c | 4 +-- bfd/elf.c | 20 +++++++++----- bfd/elf32-arc.c | 4 +-- bfd/elf32-arm.c | 13 ++++++--- bfd/elf32-avr.c | 4 +-- bfd/elf32-bfin.c | 4 +-- bfd/elf32-cr16.c | 6 ++--- bfd/elf32-cris.c | 4 +-- bfd/elf32-d10v.c | 1 - bfd/elf32-d30v.c | 1 - bfd/elf32-h8300.c | 5 ++-- bfd/elf32-i386.c | 4 --- bfd/elf32-lm32.c | 3 ++- bfd/elf32-m32r.c | 4 +-- bfd/elf32-m68hc11.c | 1 - bfd/elf32-m68hc12.c | 1 - bfd/elf32-m68k.c | 4 +-- bfd/elf32-mips.c | 2 +- bfd/elf32-msp430.c | 4 +-- bfd/elf32-nds32.c | 4 +-- bfd/elf32-or1k.c | 4 +-- bfd/elf32-pj.c | 4 +-- bfd/elf32-ppc.c | 11 ++++++-- bfd/elf32-s12z.c | 1 - bfd/elf32-sparc.c | 12 ++++++--- bfd/elf32-v850.c | 4 +-- bfd/elf32-xc16x.c | 4 +-- bfd/elf32-xtensa.c | 4 +-- bfd/elf64-ia64-vms.c | 4 +-- bfd/elf64-x86-64.c | 4 --- bfd/elflink.c | 17 ++++-------- bfd/elfnn-ia64.c | 4 +-- bfd/elfxx-mips.c | 11 ++++++-- bfd/elfxx-mips.h | 2 ++ bfd/elfxx-target.h | 2 +- 40 files changed, 175 insertions(+), 99 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 2beeb3dfe19..3a19099b6f7 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,67 @@ +2019-07-23 Alan Modra + + * elf-bfd.h (enum elf_gnu_osabi): Rename from elf_gnu_symbols. + Remove none, any, all enums. + (struct elf_obj_tdata): Rename has_gnu_symbols field to has_gnu_osabi. + (_bfd_elf_final_write_processing): Declare. + * elf.c (_bfd_elf_write_object_contents): Unconditionally call + elf_backend_final_write_processing. + (_bfd_elf_post_process_headers): Move body of function to.. + (_bfd_elf_final_write_processing): ..here, but set EI_OSABI byte + only when not already set. Adjust for rename. + * elfxx-target.h (elf_backend_final_write_processing): Default to + _bfd_elf_final_write_processing. + * elf-hppa.h (elf_hppa_final_write_processing): Call + _bfd_elf_final_write_processing. + * elf-m10300.c (_bfd_mn10300_elf_final_write_processing): Likewise. + * elf-nacl.c (nacl_final_write_processing): Likewise. + * elf-vxworks.c (elf_vxworks_final_write_processing): Likewise. + * elf32-arc.c (arc_elf_final_write_processing): Likewise. + * elf32-avr.c (bfd_elf_avr_final_write_processing): Likewise. + * elf32-bfin.c (elf32_bfin_final_write_processing): Likewise. + * elf32-cr16.c (_bfd_cr16_elf_final_write_processing): Likewise. + * elf32-cris.c (cris_elf_final_write_processing): Likewise. + * elf32-h8300.c (elf32_h8_final_write_processing): Likewise. + * elf32-lm32.c (lm32_elf_final_write_processing): Likewise. + * elf32-m32r.c (m32r_elf_final_write_processing): Likewise. + * elf32-m68k.c (elf_m68k_final_write_processing): Likewise. + * elf32-msp430.c (bfd_elf_msp430_final_write_processing): Likewise. + * elf32-nds32.c (nds32_elf_final_write_processing): Likewise. + * elf32-or1k.c (or1k_elf_final_write_processing): Likewise. + * elf32-pj.c (pj_elf_final_write_processing): Likewise. + * elf32-v850.c (v850_elf_final_write_processing): Likewise. + * elf32-xc16x.c (elf32_xc16x_final_write_processing): Likewise. + * elf32-xtensa.c (elf_xtensa_final_write_processing): Likewise. + * elf64-ia64-vms.c (elf64_vms_final_write_processing): Likewise. + * elfnn-ia64.c (elfNN_ia64_final_write_processing): Likewise. + * elf32-arm.c (arm_final_write_processing): Split out from.. + (elf32_arm_final_write_processing): ..here. Call + _bfd_elf_final_write_processing. + (elf32_arm_nacl_final_write_processing): Adjust. + * elfxx-mips.c (_bfd_mips_final_write_processing): Split out from.. + (_bfd_mips_elf_final_write_processing): ..here. Call + _bfd_elf_final_write_processing. + * elfxx-mips.h (_bfd_mips_final_write_processing): Declare. + * elf32-mips.c (mips_vxworks_final_write_processing): Adjust. + * elf32-ppc.c (ppc_final_write_processing): Split out from.. + (ppc_elf_final_write_processing): ..here. Call + _bfd_elf_final_write_processing. + (ppc_elf_vxworks_final_write_processing): Adjust. + * elf32-sparc.c (sparc_final_write_processing): Split out from.. + (elf32_sparc_final_write_processing): ..here. Call + _bfd_elf_final_write_processing. + (elf32_sparc_vxworks_final_write_processing): Adjust. + * elf32-d10v.c (elf_backend_final_write_processing): Don't define. + * elf32-d30v.c (elf_backend_final_write_processing): Don't define. + * elf32-m68hc11.c (elf_backend_final_write_processing): Don't define. + * elf32-m68hc12.c (elf_backend_final_write_processing): Don't define. + * elf32-s12z.c (elf_backend_final_write_processing): Don't define. + * elf32-i386.c (elf_i386_check_relocs): Don't set has_gnu_symbols. + * elf64-x86-64.c (elf_x86_64_check_relocs): Likewise. + * elflink.c (elf_link_add_object_symbols): Likewise. + (elf_link_output_symstrtab): Set has_gnu_osabi for symbols here + instead. + 2019-07-23 Omar Majid * coffcode.h (coff_set_arch_mach_hook): Handle I386_APPLE_MAGIC, diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index a6a831b206b..134496ed271 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -1812,13 +1812,10 @@ struct output_elf_obj_tdata /* Indicate if the bfd contains symbols that have the STT_GNU_IFUNC symbol type or STB_GNU_UNIQUE binding. Used to set the osabi field in the ELF header structure. */ -enum elf_gnu_symbols +enum elf_gnu_osabi { - elf_gnu_symbol_none = 0, - elf_gnu_symbol_any = 1 << 0, - elf_gnu_symbol_ifunc = (elf_gnu_symbol_any | 1 << 1), - elf_gnu_symbol_unique = (elf_gnu_symbol_any | 1 << 2), - elf_gnu_symbol_all = (elf_gnu_symbol_ifunc | elf_gnu_symbol_unique) + elf_gnu_osabi_ifunc = 1 << 1, + elf_gnu_osabi_unique = 1 << 2, }; typedef struct elf_section_list @@ -1939,9 +1936,8 @@ struct elf_obj_tdata or was found via a DT_NEEDED entry. */ ENUM_BITFIELD (dynamic_lib_link_class) dyn_lib_class : 4; - /* Whether if the bfd contains symbols that have the STT_GNU_IFUNC - symbol type or STB_GNU_UNIQUE binding. */ - ENUM_BITFIELD (elf_gnu_symbols) has_gnu_symbols : 3; + /* Whether the bfd uses OS specific bits that require ELFOSABI_GNU. */ + ENUM_BITFIELD (elf_gnu_osabi) has_gnu_osabi : 3; /* Whether if the bfd contains the GNU_PROPERTY_NO_COPY_ON_PROTECTED property. */ @@ -2336,7 +2332,9 @@ extern bfd_boolean _bfd_elf_setup_sections extern struct bfd_link_hash_entry *bfd_elf_define_start_stop (struct bfd_link_info *, const char *, asection *); -extern void _bfd_elf_post_process_headers (bfd * , struct bfd_link_info *); +extern void _bfd_elf_post_process_headers (bfd *, struct bfd_link_info *); + +extern void _bfd_elf_final_write_processing (bfd *, bfd_boolean); extern const bfd_target *bfd_elf32_object_p (bfd *); diff --git a/bfd/elf-hppa.h b/bfd/elf-hppa.h index 10138138622..45b432ee62e 100644 --- a/bfd/elf-hppa.h +++ b/bfd/elf-hppa.h @@ -924,8 +924,7 @@ elf_hppa_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr, asection *sec) } static void -elf_hppa_final_write_processing (bfd *abfd, - bfd_boolean linker ATTRIBUTE_UNUSED) +elf_hppa_final_write_processing (bfd *abfd, bfd_boolean linker) { int mach = bfd_get_mach (abfd); @@ -948,6 +947,7 @@ elf_hppa_final_write_processing (bfd *abfd, a step backwards with the ELF based toolchains. */ | EF_PARISC_TRAPNIL); + _bfd_elf_final_write_processing (abfd, linker); } /* Comparison function for qsort to sort unwind section during a diff --git a/bfd/elf-m10300.c b/bfd/elf-m10300.c index f0ef8eb0bed..e497e02b0dd 100644 --- a/bfd/elf-m10300.c +++ b/bfd/elf-m10300.c @@ -4668,8 +4668,7 @@ elf_mn10300_mach (flagword flags) number. */ static void -_bfd_mn10300_elf_final_write_processing (bfd *abfd, - bfd_boolean linker ATTRIBUTE_UNUSED) +_bfd_mn10300_elf_final_write_processing (bfd *abfd, bfd_boolean linker) { unsigned long val; @@ -4691,6 +4690,7 @@ _bfd_mn10300_elf_final_write_processing (bfd *abfd, elf_elfheader (abfd)->e_flags &= ~ (EF_MN10300_MACH); elf_elfheader (abfd)->e_flags |= val; + _bfd_elf_final_write_processing (abfd, linker); } static bfd_boolean diff --git a/bfd/elf-nacl.c b/bfd/elf-nacl.c index 3f0c813dbee..5f808066913 100644 --- a/bfd/elf-nacl.c +++ b/bfd/elf-nacl.c @@ -321,7 +321,7 @@ nacl_modify_program_headers (bfd *abfd, struct bfd_link_info *info) } void -nacl_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED) +nacl_final_write_processing (bfd *abfd, bfd_boolean linker) { struct elf_segment_map *seg; for (seg = elf_seg_map (abfd); seg != NULL; seg = seg->next) @@ -354,4 +354,5 @@ nacl_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED) free (fill); } + _bfd_elf_final_write_processing (abfd, linker); } diff --git a/bfd/elf-vxworks.c b/bfd/elf-vxworks.c index 08c4b161554..32eb5a9ccfb 100644 --- a/bfd/elf-vxworks.c +++ b/bfd/elf-vxworks.c @@ -213,8 +213,7 @@ elf_vxworks_emit_relocs (bfd *output_bfd, /* Set the sh_link and sh_info fields on the static plt relocation secton. */ void -elf_vxworks_final_write_processing (bfd *abfd, - bfd_boolean linker ATTRIBUTE_UNUSED) +elf_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker) { asection * sec; struct bfd_elf_section_data *d; @@ -229,6 +228,7 @@ elf_vxworks_final_write_processing (bfd *abfd, sec = bfd_get_section_by_name (abfd, ".plt"); if (sec) d->this_hdr.sh_info = elf_section_data (sec)->this_idx; + _bfd_elf_final_write_processing (abfd, linker); } /* Add the dynamic entries required by VxWorks. These point to the diff --git a/bfd/elf.c b/bfd/elf.c index 265150d5114..55bb0916ee7 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -6553,8 +6553,7 @@ _bfd_elf_write_object_contents (bfd *abfd) || !_bfd_elf_strtab_emit (abfd, elf_shstrtab (abfd)))) return FALSE; - if (bed->elf_backend_final_write_processing) - (*bed->elf_backend_final_write_processing) (abfd, elf_linker (abfd)); + (*bed->elf_backend_final_write_processing) (abfd, elf_linker (abfd)); if (!bed->s->write_shdrs_and_ehdr (abfd)) return FALSE; @@ -12103,20 +12102,27 @@ asection _bfd_elf_large_com_section "LARGE_COMMON", 0, SEC_IS_COMMON); void -_bfd_elf_post_process_headers (bfd * abfd, - struct bfd_link_info * link_info ATTRIBUTE_UNUSED) +_bfd_elf_post_process_headers (bfd *abfd ATTRIBUTE_UNUSED, + struct bfd_link_info *info ATTRIBUTE_UNUSED) { - Elf_Internal_Ehdr * i_ehdrp; /* ELF file header, internal form. */ +} + +void +_bfd_elf_final_write_processing (bfd *abfd, + bfd_boolean linker ATTRIBUTE_UNUSED) +{ + Elf_Internal_Ehdr *i_ehdrp; /* ELF file header, internal form. */ i_ehdrp = elf_elfheader (abfd); - i_ehdrp->e_ident[EI_OSABI] = get_elf_backend_data (abfd)->elf_osabi; + if (i_ehdrp->e_ident[EI_OSABI] == ELFOSABI_NONE) + i_ehdrp->e_ident[EI_OSABI] = get_elf_backend_data (abfd)->elf_osabi; /* To make things simpler for the loader on Linux systems we set the osabi field to ELFOSABI_GNU if the binary contains symbols of the STT_GNU_IFUNC type or STB_GNU_UNIQUE binding. */ if (i_ehdrp->e_ident[EI_OSABI] == ELFOSABI_NONE - && elf_tdata (abfd)->has_gnu_symbols) + && elf_tdata (abfd)->has_gnu_osabi) i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_GNU; } diff --git a/bfd/elf32-arc.c b/bfd/elf32-arc.c index b86dd59a3bd..ad5757acc94 100644 --- a/bfd/elf32-arc.c +++ b/bfd/elf32-arc.c @@ -1017,8 +1017,7 @@ arc_elf_object_p (bfd * abfd) This gets the ARC architecture right based on the machine number. */ static void -arc_elf_final_write_processing (bfd * abfd, - bfd_boolean linker ATTRIBUTE_UNUSED) +arc_elf_final_write_processing (bfd *abfd, bfd_boolean linker) { unsigned long emf; int osver = bfd_elf_get_obj_attr_int (abfd, OBJ_ATTR_PROC, @@ -1052,6 +1051,7 @@ arc_elf_final_write_processing (bfd * abfd, e_flags |= E_ARC_OSABI_V3; elf_elfheader (abfd)->e_flags |= e_flags; + _bfd_elf_final_write_processing (abfd, linker); } #ifdef ARC_ENABLE_DEBUG diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index 6b6897692d2..631394916b7 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -17915,11 +17915,18 @@ elf32_arm_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED, } static void -elf32_arm_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED) +arm_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED) { bfd_arm_update_notes (abfd, ARM_NOTE_SECTION); } +static void +elf32_arm_final_write_processing (bfd *abfd, bfd_boolean linker) +{ + arm_final_write_processing (abfd, linker); + _bfd_elf_final_write_processing (abfd, linker); +} + /* Return TRUE if this is an unwinding table entry. */ static bfd_boolean @@ -20596,7 +20603,7 @@ elf32_arm_nacl_modify_segment_map (bfd *abfd, struct bfd_link_info *info) static void elf32_arm_nacl_final_write_processing (bfd *abfd, bfd_boolean linker) { - elf32_arm_final_write_processing (abfd, linker); + arm_final_write_processing (abfd, linker); nacl_final_write_processing (abfd, linker); } @@ -20751,7 +20758,7 @@ elf32_arm_vxworks_link_hash_table_create (bfd *abfd) static void elf32_arm_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker) { - elf32_arm_final_write_processing (abfd, linker); + arm_final_write_processing (abfd, linker); elf_vxworks_final_write_processing (abfd, linker); } diff --git a/bfd/elf32-avr.c b/bfd/elf32-avr.c index 34ad42300dd..135030b3aad 100644 --- a/bfd/elf32-avr.c +++ b/bfd/elf32-avr.c @@ -1537,8 +1537,7 @@ elf32_avr_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, number. */ static void -bfd_elf_avr_final_write_processing (bfd *abfd, - bfd_boolean linker ATTRIBUTE_UNUSED) +bfd_elf_avr_final_write_processing (bfd *abfd, bfd_boolean linker) { unsigned long val; @@ -1621,6 +1620,7 @@ bfd_elf_avr_final_write_processing (bfd *abfd, elf_elfheader (abfd)->e_machine = EM_AVR; elf_elfheader (abfd)->e_flags &= ~ EF_AVR_MACH; elf_elfheader (abfd)->e_flags |= val; + _bfd_elf_final_write_processing (abfd, linker); } /* Set the right machine number. */ diff --git a/bfd/elf32-bfin.c b/bfd/elf32-bfin.c index db052a1ff28..5b8f5b92642 100644 --- a/bfd/elf32-bfin.c +++ b/bfd/elf32-bfin.c @@ -1134,13 +1134,13 @@ bfd_boolean elf32_bfin_code_in_l1 = 0; bfd_boolean elf32_bfin_data_in_l1 = 0; static void -elf32_bfin_final_write_processing (bfd *abfd, - bfd_boolean linker ATTRIBUTE_UNUSED) +elf32_bfin_final_write_processing (bfd *abfd, bfd_boolean linker) { if (elf32_bfin_code_in_l1) elf_elfheader (abfd)->e_flags |= EF_BFIN_CODE_IN_L1; if (elf32_bfin_data_in_l1) elf_elfheader (abfd)->e_flags |= EF_BFIN_DATA_IN_L1; + _bfd_elf_final_write_processing (abfd, linker); } /* Return TRUE if the name is a local label. diff --git a/bfd/elf32-cr16.c b/bfd/elf32-cr16.c index a3fbb4f81b3..3569c81e0ab 100644 --- a/bfd/elf32-cr16.c +++ b/bfd/elf32-cr16.c @@ -1674,8 +1674,7 @@ elf_cr16_mach (flagword flags) number. */ static void -_bfd_cr16_elf_final_write_processing (bfd *abfd, - bfd_boolean linker ATTRIBUTE_UNUSED) +_bfd_cr16_elf_final_write_processing (bfd *abfd, bfd_boolean linker) { unsigned long val; switch (bfd_get_mach (abfd)) @@ -1685,9 +1684,8 @@ _bfd_cr16_elf_final_write_processing (bfd *abfd, val = EM_CR16; break; } - - elf_elfheader (abfd)->e_flags |= val; + _bfd_elf_final_write_processing (abfd, linker); } diff --git a/bfd/elf32-cris.c b/bfd/elf32-cris.c index 595c36be1fa..0fc1eb38cec 100644 --- a/bfd/elf32-cris.c +++ b/bfd/elf32-cris.c @@ -3830,8 +3830,7 @@ cris_elf_object_p (bfd *abfd) flags from mach type. */ static void -cris_elf_final_write_processing (bfd *abfd, - bfd_boolean linker ATTRIBUTE_UNUSED) +cris_elf_final_write_processing (bfd *abfd, bfd_boolean linker) { unsigned long e_flags = elf_elfheader (abfd)->e_flags; @@ -3859,6 +3858,7 @@ cris_elf_final_write_processing (bfd *abfd, } elf_elfheader (abfd)->e_flags = e_flags; + _bfd_elf_final_write_processing (abfd, linker); } /* Set the mach type from e_flags value. */ diff --git a/bfd/elf32-d10v.c b/bfd/elf32-d10v.c index 4cd0aec106d..a03ce632868 100644 --- a/bfd/elf32-d10v.c +++ b/bfd/elf32-d10v.c @@ -543,7 +543,6 @@ elf32_d10v_relocate_section (bfd *output_bfd, #define elf_info_to_howto NULL #define elf_info_to_howto_rel d10v_info_to_howto_rel #define elf_backend_object_p 0 -#define elf_backend_final_write_processing 0 #define elf_backend_gc_mark_hook elf32_d10v_gc_mark_hook #define elf_backend_check_relocs elf32_d10v_check_relocs #define elf_backend_relocate_section elf32_d10v_relocate_section diff --git a/bfd/elf32-d30v.c b/bfd/elf32-d30v.c index 975dbc481d7..f006b669fae 100644 --- a/bfd/elf32-d30v.c +++ b/bfd/elf32-d30v.c @@ -561,6 +561,5 @@ d30v_info_to_howto_rela (bfd *abfd, #define elf_info_to_howto d30v_info_to_howto_rela #define elf_info_to_howto_rel d30v_info_to_howto_rel #define elf_backend_object_p 0 -#define elf_backend_final_write_processing 0 #include "elf32-target.h" diff --git a/bfd/elf32-h8300.c b/bfd/elf32-h8300.c index fe1de986350..40680fa3f59 100644 --- a/bfd/elf32-h8300.c +++ b/bfd/elf32-h8300.c @@ -31,7 +31,6 @@ static bfd_boolean elf32_h8_info_to_howto static bfd_boolean elf32_h8_info_to_howto_rel (bfd *, arelent *, Elf_Internal_Rela *); static unsigned long elf32_h8_mach (flagword); -static void elf32_h8_final_write_processing (bfd *, bfd_boolean); static bfd_boolean elf32_h8_object_p (bfd *); static bfd_boolean elf32_h8_merge_private_bfd_data (bfd *, struct bfd_link_info *); @@ -585,8 +584,7 @@ elf32_h8_mach (flagword flags) into the flags field in the object file. */ static void -elf32_h8_final_write_processing (bfd *abfd, - bfd_boolean linker ATTRIBUTE_UNUSED) +elf32_h8_final_write_processing (bfd *abfd, bfd_boolean linker) { unsigned long val; @@ -624,6 +622,7 @@ elf32_h8_final_write_processing (bfd *abfd, elf_elfheader (abfd)->e_flags &= ~ (EF_H8_MACH); elf_elfheader (abfd)->e_flags |= val; + _bfd_elf_final_write_processing (abfd, linker); } /* Return nonzero if ABFD represents a valid H8 ELF object file; also diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index d2ea5a729e2..d7a61d7a481 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -1575,10 +1575,6 @@ elf_i386_check_relocs (bfd *abfd, /* It is referenced by a non-shared object. */ h->ref_regular = 1; - - if (h->type == STT_GNU_IFUNC) - elf_tdata (info->output_bfd)->has_gnu_symbols - |= elf_gnu_symbol_ifunc; } if (r_type == R_386_GOT32X diff --git a/bfd/elf32-lm32.c b/bfd/elf32-lm32.c index 242876489fa..255dc4e2c0c 100644 --- a/bfd/elf32-lm32.c +++ b/bfd/elf32-lm32.c @@ -556,7 +556,7 @@ lm32_elf_object_p (bfd *abfd) /* Set machine type flags just before file is written out. */ static void -lm32_elf_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED) +lm32_elf_final_write_processing (bfd *abfd, bfd_boolean linker) { elf_elfheader (abfd)->e_machine = EM_LATTICEMICO32; elf_elfheader (abfd)->e_flags &=~ EF_LM32_MACH; @@ -568,6 +568,7 @@ lm32_elf_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED) default: abort (); } + _bfd_elf_final_write_processing (abfd, linker); } /* Set the GP value for OUTPUT_BFD. Returns FALSE if this is a diff --git a/bfd/elf32-m32r.c b/bfd/elf32-m32r.c index 8f05a5e4d6e..3fcde4a6141 100644 --- a/bfd/elf32-m32r.c +++ b/bfd/elf32-m32r.c @@ -3404,8 +3404,7 @@ m32r_elf_object_p (bfd *abfd) /* Store the machine number in the flags field. */ static void -m32r_elf_final_write_processing (bfd *abfd, - bfd_boolean linker ATTRIBUTE_UNUSED) +m32r_elf_final_write_processing (bfd *abfd, bfd_boolean linker) { unsigned long val; @@ -3419,6 +3418,7 @@ m32r_elf_final_write_processing (bfd *abfd, elf_elfheader (abfd)->e_flags &=~ EF_M32R_ARCH; elf_elfheader (abfd)->e_flags |= val; + _bfd_elf_final_write_processing (abfd, linker); } /* Function to keep M32R specific file flags. */ diff --git a/bfd/elf32-m68hc11.c b/bfd/elf32-m68hc11.c index fe5d8baffbd..828a43299ad 100644 --- a/bfd/elf32-m68hc11.c +++ b/bfd/elf32-m68hc11.c @@ -1306,7 +1306,6 @@ static const struct bfd_elf_special_section elf32_m68hc11_special_sections[] = #define elf_backend_relocate_section elf32_m68hc11_relocate_section #define elf_backend_add_symbol_hook elf32_m68hc11_add_symbol_hook #define elf_backend_object_p 0 -#define elf_backend_final_write_processing 0 #define elf_backend_can_gc_sections 1 #define elf_backend_special_sections elf32_m68hc11_special_sections #define elf_backend_merge_symbol_attribute elf32_m68hc11_merge_symbol_attribute diff --git a/bfd/elf32-m68hc12.c b/bfd/elf32-m68hc12.c index 2247edcc607..97c513258d7 100644 --- a/bfd/elf32-m68hc12.c +++ b/bfd/elf32-m68hc12.c @@ -654,7 +654,6 @@ static const struct bfd_elf_special_section elf32_m68hc12_special_sections[] = #define elf_backend_check_relocs elf32_m68hc11_check_relocs #define elf_backend_relocate_section elf32_m68hc11_relocate_section #define elf_backend_object_p m68hc12_elf_set_mach_from_flags -#define elf_backend_final_write_processing 0 #define elf_backend_can_gc_sections 1 #define elf_backend_special_sections elf32_m68hc12_special_sections #define elf_backend_post_process_headers elf32_m68hc11_post_process_headers diff --git a/bfd/elf32-m68k.c b/bfd/elf32-m68k.c index 4efac790d69..3840b136de4 100644 --- a/bfd/elf32-m68k.c +++ b/bfd/elf32-m68k.c @@ -1054,8 +1054,7 @@ elf32_m68k_object_p (bfd *abfd) field based on the machine number. */ static void -elf_m68k_final_write_processing (bfd *abfd, - bfd_boolean linker ATTRIBUTE_UNUSED) +elf_m68k_final_write_processing (bfd *abfd, bfd_boolean linker) { int mach = bfd_get_mach (abfd); unsigned long e_flags = elf_elfheader (abfd)->e_flags; @@ -1108,6 +1107,7 @@ elf_m68k_final_write_processing (bfd *abfd, } elf_elfheader (abfd)->e_flags = e_flags; } + _bfd_elf_final_write_processing (abfd, linker); } /* Keep m68k-specific flags in the ELF header. */ diff --git a/bfd/elf32-mips.c b/bfd/elf32-mips.c index 69268b38074..370dc90914f 100644 --- a/bfd/elf32-mips.c +++ b/bfd/elf32-mips.c @@ -2646,7 +2646,7 @@ static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = { static void mips_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker) { - _bfd_mips_elf_final_write_processing (abfd, linker); + _bfd_mips_final_write_processing (abfd, linker); elf_vxworks_final_write_processing (abfd, linker); } diff --git a/bfd/elf32-msp430.c b/bfd/elf32-msp430.c index c0c626e2b1d..aecc122c004 100644 --- a/bfd/elf32-msp430.c +++ b/bfd/elf32-msp430.c @@ -1386,8 +1386,7 @@ elf32_msp430_relocate_section (bfd * output_bfd ATTRIBUTE_UNUSED, number. */ static void -bfd_elf_msp430_final_write_processing (bfd * abfd, - bfd_boolean linker ATTRIBUTE_UNUSED) +bfd_elf_msp430_final_write_processing (bfd *abfd, bfd_boolean linker) { unsigned long val; @@ -1422,6 +1421,7 @@ bfd_elf_msp430_final_write_processing (bfd * abfd, elf_elfheader (abfd)->e_machine = EM_MSP430; elf_elfheader (abfd)->e_flags &= ~EF_MSP430_MACH; elf_elfheader (abfd)->e_flags |= val; + _bfd_elf_final_write_processing (abfd, linker); } /* Set the right machine number. */ diff --git a/bfd/elf32-nds32.c b/bfd/elf32-nds32.c index d9a429dcd50..9959cbe5e7a 100644 --- a/bfd/elf32-nds32.c +++ b/bfd/elf32-nds32.c @@ -6673,8 +6673,7 @@ nds32_elf_object_p (bfd *abfd) /* Store the machine number in the flags field. */ static void -nds32_elf_final_write_processing (bfd *abfd, - bfd_boolean linker ATTRIBUTE_UNUSED) +nds32_elf_final_write_processing (bfd *abfd, bfd_boolean linker) { unsigned long val; static unsigned int cur_mach = 0; @@ -6711,6 +6710,7 @@ nds32_elf_final_write_processing (bfd *abfd, elf_elfheader (abfd)->e_flags &= ~EF_NDS_ARCH; elf_elfheader (abfd)->e_flags |= val; + _bfd_elf_final_write_processing (abfd, linker); } /* Function to keep NDS32 specific file flags. */ diff --git a/bfd/elf32-or1k.c b/bfd/elf32-or1k.c index c1bbac98fb0..9b795fb06ed 100644 --- a/bfd/elf32-or1k.c +++ b/bfd/elf32-or1k.c @@ -3157,8 +3157,7 @@ or1k_elf_object_p (bfd *abfd) /* Store the machine number in the flags field. */ static void -or1k_elf_final_write_processing (bfd *abfd, - bfd_boolean linker ATTRIBUTE_UNUSED) +or1k_elf_final_write_processing (bfd *abfd, bfd_boolean linker) { switch (bfd_get_mach (abfd)) { @@ -3169,6 +3168,7 @@ or1k_elf_final_write_processing (bfd *abfd, elf_elfheader (abfd)->e_flags |= EF_OR1K_NODELAY; break; } + _bfd_elf_final_write_processing (abfd, linker); } static bfd_boolean diff --git a/bfd/elf32-pj.c b/bfd/elf32-pj.c index c97d620c509..d4fcebc0f22 100644 --- a/bfd/elf32-pj.c +++ b/bfd/elf32-pj.c @@ -337,11 +337,11 @@ pj_elf_info_to_howto (bfd *abfd, e_flags field. */ static void -pj_elf_final_write_processing (bfd *abfd, - bfd_boolean linker ATTRIBUTE_UNUSED) +pj_elf_final_write_processing (bfd *abfd, bfd_boolean linker) { elf_elfheader (abfd)->e_flags |= EF_PICOJAVA_ARCH; elf_elfheader (abfd)->e_flags |= EF_PICOJAVA_GNUCALLS; + _bfd_elf_final_write_processing (abfd, linker); } #define TARGET_BIG_SYM pj_elf32_vec diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 8dfeca3e3a5..b1ae0de4e5b 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -1705,7 +1705,7 @@ ppc_elf_write_section (bfd *abfd ATTRIBUTE_UNUSED, /* Finally we can generate the output section. */ static void -ppc_elf_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED) +ppc_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED) { bfd_byte *buffer; asection *asec; @@ -1756,6 +1756,13 @@ ppc_elf_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED) apuinfo_list_finish (); } + +static void +ppc_elf_final_write_processing (bfd *abfd, bfd_boolean linker) +{ + ppc_final_write_processing (abfd, linker); + _bfd_elf_final_write_processing (abfd, linker); +} static bfd_boolean is_nonpic_glink_stub (bfd *abfd, asection *glink, bfd_vma off) @@ -10490,7 +10497,7 @@ ppc_elf_vxworks_add_symbol_hook (bfd *abfd, static void ppc_elf_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker) { - ppc_elf_final_write_processing (abfd, linker); + ppc_final_write_processing (abfd, linker); elf_vxworks_final_write_processing (abfd, linker); } diff --git a/bfd/elf32-s12z.c b/bfd/elf32-s12z.c index 60f163b9f33..ba6498505a2 100644 --- a/bfd/elf32-s12z.c +++ b/bfd/elf32-s12z.c @@ -317,6 +317,5 @@ s12z_elf_set_mach_from_flags (bfd *abfd) #define elf_info_to_howto NULL #define elf_info_to_howto_rel s12z_info_to_howto_rel #define elf_backend_object_p s12z_elf_set_mach_from_flags -#define elf_backend_final_write_processing NULL #include "elf32-target.h" diff --git a/bfd/elf32-sparc.c b/bfd/elf32-sparc.c index f5c58630686..e6d18d377c7 100644 --- a/bfd/elf32-sparc.c +++ b/bfd/elf32-sparc.c @@ -117,8 +117,7 @@ elf32_sparc_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) We need to set the e_machine field appropriately. */ static void -elf32_sparc_final_write_processing (bfd *abfd, - bfd_boolean linker ATTRIBUTE_UNUSED) +sparc_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED) { switch (bfd_get_mach (abfd)) { @@ -157,6 +156,13 @@ elf32_sparc_final_write_processing (bfd *abfd, } } +static void +elf32_sparc_final_write_processing (bfd *abfd, bfd_boolean linker) +{ + sparc_final_write_processing (abfd, linker); + _bfd_elf_final_write_processing (abfd, linker); +} + /* Used to decide how to sort relocs in an optimal manner for the dynamic linker, before writing them out. */ @@ -324,7 +330,7 @@ elf32_sparc_vxworks_link_hash_table_create (bfd *abfd) static void elf32_sparc_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker) { - elf32_sparc_final_write_processing (abfd, linker); + sparc_final_write_processing (abfd, linker); elf_vxworks_final_write_processing (abfd, linker); } diff --git a/bfd/elf32-v850.c b/bfd/elf32-v850.c index 90a18d3a8d0..14bffc27aa2 100644 --- a/bfd/elf32-v850.c +++ b/bfd/elf32-v850.c @@ -2719,8 +2719,7 @@ v850_elf_object_p (bfd *abfd) /* Store the machine number in the flags field. */ static void -v850_elf_final_write_processing (bfd *abfd, - bfd_boolean linker ATTRIBUTE_UNUSED) +v850_elf_final_write_processing (bfd *abfd, bfd_boolean linker) { unsigned long val; @@ -2750,6 +2749,7 @@ v850_elf_final_write_processing (bfd *abfd, default: break; } + _bfd_elf_final_write_processing (abfd, linker); } /* Function to keep V850 specific file flags. */ diff --git a/bfd/elf32-xc16x.c b/bfd/elf32-xc16x.c index dc45c57557f..ef2a5feba2a 100644 --- a/bfd/elf32-xc16x.c +++ b/bfd/elf32-xc16x.c @@ -417,8 +417,7 @@ elf32_xc16x_relocate_section (bfd *output_bfd, static void -elf32_xc16x_final_write_processing (bfd *abfd, - bfd_boolean linker ATTRIBUTE_UNUSED) +elf32_xc16x_final_write_processing (bfd *abfd, bfd_boolean linker) { unsigned long val; @@ -439,6 +438,7 @@ elf32_xc16x_final_write_processing (bfd *abfd, } elf_elfheader (abfd)->e_flags |= val; + _bfd_elf_final_write_processing (abfd, linker); } static unsigned long diff --git a/bfd/elf32-xtensa.c b/bfd/elf32-xtensa.c index 09625e60873..66d23a8d63d 100644 --- a/bfd/elf32-xtensa.c +++ b/bfd/elf32-xtensa.c @@ -3463,8 +3463,7 @@ elf_xtensa_object_p (bfd *abfd) number. */ static void -elf_xtensa_final_write_processing (bfd *abfd, - bfd_boolean linker ATTRIBUTE_UNUSED) +elf_xtensa_final_write_processing (bfd *abfd, bfd_boolean linker) { int mach; unsigned long val; @@ -3480,6 +3479,7 @@ elf_xtensa_final_write_processing (bfd *abfd, elf_elfheader (abfd)->e_flags &= (~ EF_XTENSA_MACH); elf_elfheader (abfd)->e_flags |= val; + _bfd_elf_final_write_processing (abfd, linker); } diff --git a/bfd/elf64-ia64-vms.c b/bfd/elf64-ia64-vms.c index 792b1cc6bd4..0c7144a6f76 100644 --- a/bfd/elf64-ia64-vms.c +++ b/bfd/elf64-ia64-vms.c @@ -4660,8 +4660,7 @@ elf64_vms_section_processing (bfd *abfd ATTRIBUTE_UNUSED, object file. */ static void -elf64_vms_final_write_processing (bfd *abfd, - bfd_boolean linker ATTRIBUTE_UNUSED) +elf64_vms_final_write_processing (bfd *abfd, bfd_boolean linker) { Elf_Internal_Shdr *hdr; asection *s; @@ -4696,6 +4695,7 @@ elf64_vms_final_write_processing (bfd *abfd, elf_elfheader (abfd)->e_flags = flags; elf_flags_init (abfd) = TRUE; } + _bfd_elf_final_write_processing (abfd, linker); } static bfd_boolean diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 2f6923927f9..34180c7552a 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -1951,10 +1951,6 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info, { /* It is referenced by a non-shared object. */ h->ref_regular = 1; - - if (h->type == STT_GNU_IFUNC) - elf_tdata (info->output_bfd)->has_gnu_symbols - |= elf_gnu_symbol_ifunc; } converted_reloc = FALSE; diff --git a/bfd/elflink.c b/bfd/elflink.c index 9175d3fa20e..2830ee31b98 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -4739,18 +4739,6 @@ error_free_dyn: (struct bfd_link_hash_entry **) sym_hash))) goto error_free_vers; - if ((abfd->flags & DYNAMIC) == 0 - && (bfd_get_flavour (info->output_bfd) - == bfd_target_elf_flavour)) - { - if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC) - elf_tdata (info->output_bfd)->has_gnu_symbols - |= elf_gnu_symbol_ifunc; - if ((flags & BSF_GNU_UNIQUE)) - elf_tdata (info->output_bfd)->has_gnu_symbols - |= elf_gnu_symbol_unique; - } - h = *sym_hash; /* We need to make sure that indirect symbol dynamic flags are updated. */ @@ -9411,6 +9399,11 @@ elf_link_output_symstrtab (struct elf_final_link_info *flinfo, return ret; } + if (ELF_ST_TYPE (elfsym->st_info) == STT_GNU_IFUNC) + elf_tdata (flinfo->output_bfd)->has_gnu_osabi |= elf_gnu_osabi_ifunc; + if (ELF_ST_BIND (elfsym->st_info) == STB_GNU_UNIQUE) + elf_tdata (flinfo->output_bfd)->has_gnu_osabi |= elf_gnu_osabi_unique; + if (name == NULL || *name == '\0' || (input_sec->flags & SEC_EXCLUDE)) diff --git a/bfd/elfnn-ia64.c b/bfd/elfnn-ia64.c index a80e5b8e2fd..1c9a9042072 100644 --- a/bfd/elfnn-ia64.c +++ b/bfd/elfnn-ia64.c @@ -1003,8 +1003,7 @@ elfNN_ia64_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr, object file. */ static void -elfNN_ia64_final_write_processing (bfd *abfd, - bfd_boolean linker ATTRIBUTE_UNUSED) +elfNN_ia64_final_write_processing (bfd *abfd, bfd_boolean linker) { Elf_Internal_Shdr *hdr; asection *s; @@ -1036,6 +1035,7 @@ elfNN_ia64_final_write_processing (bfd *abfd, elf_elfheader(abfd)->e_flags = flags; elf_flags_init (abfd) = TRUE; } + _bfd_elf_final_write_processing (abfd, linker); } /* Hook called by the linker routine which adds symbols from an object diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index 55f891d7be7..f0c092c0f90 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -12358,8 +12358,8 @@ _bfd_mips_elf_sort_relocs_p (asection *sec) number. This is used by both the 32-bit and the 64-bit ABI. */ void -_bfd_mips_elf_final_write_processing (bfd *abfd, - bfd_boolean linker ATTRIBUTE_UNUSED) +_bfd_mips_final_write_processing (bfd *abfd, + bfd_boolean linker ATTRIBUTE_UNUSED) { unsigned int i; Elf_Internal_Shdr **hdrpp; @@ -12438,6 +12438,13 @@ _bfd_mips_elf_final_write_processing (bfd *abfd, } } } + +void +_bfd_mips_elf_final_write_processing (bfd *abfd, bfd_boolean linker) +{ + _bfd_mips_final_write_processing (abfd, linker); + _bfd_elf_final_write_processing (abfd, linker); +} /* When creating an IRIX5 executable, we need REGINFO and RTPROC segments. */ diff --git a/bfd/elfxx-mips.h b/bfd/elfxx-mips.h index acd9d7913fa..a76680a917d 100644 --- a/bfd/elfxx-mips.h +++ b/bfd/elfxx-mips.h @@ -69,6 +69,8 @@ extern bfd_boolean _bfd_mips_elf_finish_dynamic_sections (bfd *, struct bfd_link_info *); extern bfd_boolean _bfd_mips_elf_sort_relocs_p (asection *); +extern void _bfd_mips_final_write_processing + (bfd *, bfd_boolean); extern void _bfd_mips_elf_final_write_processing (bfd *, bfd_boolean); extern int _bfd_mips_elf_additional_program_headers diff --git a/bfd/elfxx-target.h b/bfd/elfxx-target.h index e4e75462433..aecc60f08b0 100644 --- a/bfd/elfxx-target.h +++ b/bfd/elfxx-target.h @@ -497,7 +497,7 @@ #define elf_backend_begin_write_processing 0 #endif #ifndef elf_backend_final_write_processing -#define elf_backend_final_write_processing 0 +#define elf_backend_final_write_processing _bfd_elf_final_write_processing #endif #ifndef elf_backend_additional_program_headers #define elf_backend_additional_program_headers 0 -- 2.39.5