diff options
author | Alan Modra <amodra@gmail.com> | 2019-07-24 09:43:30 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2019-07-24 16:12:02 +0930 |
commit | cc364be6ff45669150077387f22723de33d5f1b1 (patch) | |
tree | 927f4388426d20c907ba4ada7efb51b5cf27ea29 /bfd/elf.c | |
parent | c5e20471be97e2dcd3498ac284487e2546715f66 (diff) | |
download | fsf-binutils-gdb-cc364be6ff45669150077387f22723de33d5f1b1.zip fsf-binutils-gdb-cc364be6ff45669150077387f22723de33d5f1b1.tar.gz fsf-binutils-gdb-cc364be6ff45669150077387f22723de33d5f1b1.tar.bz2 |
Complain about mbind, ifunc, and unique in final_write
It's not as good as complaining in gas/config/obj-elf.c since you lose
any reference to the source file.
bfd/
* elf-bfd.h (struct elf_backend_data): Return bfd_boolean from
elf_backend_final_write_processing, don't pass linker arg.
(_bfd_elf_final_write_processing): Update prototype.
* elf.c (_bfd_elf_write_object_contents): Adjust call.
(_bfd_elf_final_write_processing): Return error on incompatible
OSABI and has_gnu_osabi. Remove linker arg.
* elf-nacl.h (nacl_final_write_processing): Update prototype.
* elf-vxworks.h (elf_vxworks_final_write_processing): Likewise.
* elfxx-mips.h (_bfd_mips_final_write_processing): Likewise.
(_bfd_mips_elf_final_write_processing): Likewise.
* elf-hppa.h (elf_hppa_final_write_processing): Return status
and remove linker arg.
* 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-arm.c (arm_final_write_processing): Likewise.
(elf32_arm_final_write_processing): Likewise.
(elf32_arm_nacl_final_write_processing): Likewise.
(elf32_arm_vxworks_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-mips.c (mips_vxworks_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-ppc.c (ppc_final_write_processing): Likewise.
(ppc_elf_final_write_processing): Likewise.
(ppc_elf_vxworks_final_write_processing): Likewise.
* elf32-sparc.c (sparc_final_write_processing): Likewise.
(elf32_sparc_final_write_processing): Likewise.
(elf32_sparc_vxworks_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.
* elfxx-mips.c (_bfd_mips_final_write_processing): Likewise.
(_bfd_mips_elf_final_write_processing): Likewise.
gas/
* config/obj-elf.c (obj_elf_section, obj_elf_type): Set has_gnu_osabi.
* testsuite/gas/elf/section12a.d: Update xfails.
* testsuite/gas/elf/section12b.d: Likewise.
Diffstat (limited to 'bfd/elf.c')
-rw-r--r-- | bfd/elf.c | 29 |
1 files changed, 22 insertions, 7 deletions
@@ -6568,7 +6568,8 @@ _bfd_elf_write_object_contents (bfd *abfd) || !_bfd_elf_strtab_emit (abfd, elf_shstrtab (abfd)))) return FALSE; - (*bed->elf_backend_final_write_processing) (abfd, elf_linker (abfd)); + if (!(*bed->elf_backend_final_write_processing) (abfd)) + return FALSE; if (!bed->s->write_shdrs_and_ehdr (abfd)) return FALSE; @@ -12123,9 +12124,8 @@ _bfd_elf_post_process_headers (bfd *abfd ATTRIBUTE_UNUSED, { } -void -_bfd_elf_final_write_processing (bfd *abfd, - bfd_boolean linker ATTRIBUTE_UNUSED) +bfd_boolean +_bfd_elf_final_write_processing (bfd *abfd) { Elf_Internal_Ehdr *i_ehdrp; /* ELF file header, internal form. */ @@ -12137,9 +12137,24 @@ _bfd_elf_final_write_processing (bfd *abfd, /* Set the osabi field to ELFOSABI_GNU if the binary contains SHF_GNU_MBIND sections or symbols of STT_GNU_IFUNC type or STB_GNU_UNIQUE binding. */ - if (i_ehdrp->e_ident[EI_OSABI] == ELFOSABI_NONE - && elf_tdata (abfd)->has_gnu_osabi) - i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_GNU; + if (elf_tdata (abfd)->has_gnu_osabi != 0) + { + if (i_ehdrp->e_ident[EI_OSABI] == ELFOSABI_NONE) + i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_GNU; + else if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_GNU + && i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_FREEBSD) + { + if (elf_tdata (abfd)->has_gnu_osabi & elf_gnu_osabi_mbind) + _bfd_error_handler (_("GNU_MBIND section is unsupported")); + if (elf_tdata (abfd)->has_gnu_osabi & elf_gnu_osabi_ifunc) + _bfd_error_handler (_("symbol type STT_GNU_IFUNC is unsupported")); + if (elf_tdata (abfd)->has_gnu_osabi & elf_gnu_osabi_unique) + _bfd_error_handler (_("symbol binding STB_GNU_UNIQUE is unsupported")); + bfd_set_error (bfd_error_bad_value); + return FALSE; + } + } + return TRUE; } |