From 3596d8ceb2cdc35b4fd702ee9daace5a2d880174 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Wed, 18 Apr 2018 15:39:34 +0930 Subject: [PATCH] Remove mips aout, coff, and pe support include/coff/mips.h needs to stay for ecoff debug support. include/ * coff/mipspe.h: Delete. bfd/ * Makefile.am: Remove mips aout, coff, and pe support. * config.bfd: Likewise. * configure.ac: Likewise. * targets.c: Likewise. * coff-mips.c: Delete * mipsbsd.c: Delete * pe-mips.c: Delete * pei-mips.c: Delete * Makefile.in: Regenerate. * configure: Regenerate. * po/SRC-POTFILES.in: Regenerate. --- bfd/ChangeLog | 14 + bfd/Makefile.am | 8 - bfd/Makefile.in | 12 - bfd/coff-mips.c | 1597 ---------------------------------------- bfd/config.bfd | 84 +-- bfd/configure | 14 - bfd/configure.ac | 14 - bfd/mipsbsd.c | 511 ------------- bfd/pe-mips.c | 936 ----------------------- bfd/pei-mips.c | 32 - bfd/po/SRC-POTFILES.in | 4 - bfd/targets.c | 17 - include/ChangeLog | 4 + include/coff/mipspe.h | 67 -- 14 files changed, 37 insertions(+), 3277 deletions(-) delete mode 100644 bfd/coff-mips.c delete mode 100644 bfd/mipsbsd.c delete mode 100644 bfd/pe-mips.c delete mode 100644 bfd/pei-mips.c delete mode 100644 include/coff/mipspe.h diff --git a/bfd/ChangeLog b/bfd/ChangeLog index b377bd3ead..e72a2f675c 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,17 @@ +2018-04-18 Alan Modra + + * Makefile.am: Remove mips aout and coff support. + * config.bfd: Likewise. + * configure.ac: Likewise. + * targets.c: Likewise. + * coff-mips.c: Delete + * mipsbsd.c: Delete + * pe-mips.c: Delete + * pei-mips.c: Delete + * Makefile.in: Regenerate. + * configure: Regenerate. + * po/SRC-POTFILES.in: Regenerate. + 2018-04-17 H.J. Lu * elf32-i386.c (elf32_bed): Define before including diff --git a/bfd/Makefile.am b/bfd/Makefile.am index 2008e12dcb..61bb0c0e10 100644 --- a/bfd/Makefile.am +++ b/bfd/Makefile.am @@ -267,7 +267,6 @@ BFD32_BACKENDS = \ coff-arm.lo \ coff-go32.lo \ coff-i386.lo \ - coff-mips.lo \ coff-rs6000.lo \ coff-sh.lo \ coff-stgo32.lo \ @@ -364,7 +363,6 @@ BFD32_BACKENDS = \ mach-o.lo \ mach-o-i386.lo \ mach-o-arm.lo \ - mipsbsd.lo \ ns32knetbsd.lo \ pc532-mach.lo \ pdp11.lo \ @@ -372,7 +370,6 @@ BFD32_BACKENDS = \ pe-arm.lo \ pe-i386.lo \ pe-mcore.lo \ - pe-mips.lo \ pe-ppc.lo \ pe-sh.lo \ pef.lo \ @@ -380,7 +377,6 @@ BFD32_BACKENDS = \ pei-arm.lo \ pei-i386.lo \ pei-mcore.lo \ - pei-mips.lo \ pei-ppc.lo \ pei-sh.lo \ peigen.lo \ @@ -410,7 +406,6 @@ BFD32_BACKENDS_CFILES = \ coff-arm.c \ coff-go32.c \ coff-i386.c \ - coff-mips.c \ coff-rs6000.c \ coff-sh.c \ coff-stgo32.c \ @@ -507,7 +502,6 @@ BFD32_BACKENDS_CFILES = \ mach-o.c \ mach-o-i386.c \ mach-o-arm.c \ - mipsbsd.c \ ns32knetbsd.c \ pc532-mach.c \ pdp11.c \ @@ -515,7 +509,6 @@ BFD32_BACKENDS_CFILES = \ pe-arm.c \ pe-i386.c \ pe-mcore.c \ - pe-mips.c \ pe-ppc.c \ pe-sh.c \ pef.c \ @@ -523,7 +516,6 @@ BFD32_BACKENDS_CFILES = \ pei-arm.c \ pei-i386.c \ pei-mcore.c \ - pei-mips.c \ pei-ppc.c \ pei-sh.c \ plugin.c \ diff --git a/bfd/Makefile.in b/bfd/Makefile.in index 6ac276e310..5c42ce5469 100644 --- a/bfd/Makefile.in +++ b/bfd/Makefile.in @@ -601,7 +601,6 @@ BFD32_BACKENDS = \ coff-arm.lo \ coff-go32.lo \ coff-i386.lo \ - coff-mips.lo \ coff-rs6000.lo \ coff-sh.lo \ coff-stgo32.lo \ @@ -698,7 +697,6 @@ BFD32_BACKENDS = \ mach-o.lo \ mach-o-i386.lo \ mach-o-arm.lo \ - mipsbsd.lo \ ns32knetbsd.lo \ pc532-mach.lo \ pdp11.lo \ @@ -706,7 +704,6 @@ BFD32_BACKENDS = \ pe-arm.lo \ pe-i386.lo \ pe-mcore.lo \ - pe-mips.lo \ pe-ppc.lo \ pe-sh.lo \ pef.lo \ @@ -714,7 +711,6 @@ BFD32_BACKENDS = \ pei-arm.lo \ pei-i386.lo \ pei-mcore.lo \ - pei-mips.lo \ pei-ppc.lo \ pei-sh.lo \ peigen.lo \ @@ -744,7 +740,6 @@ BFD32_BACKENDS_CFILES = \ coff-arm.c \ coff-go32.c \ coff-i386.c \ - coff-mips.c \ coff-rs6000.c \ coff-sh.c \ coff-stgo32.c \ @@ -841,7 +836,6 @@ BFD32_BACKENDS_CFILES = \ mach-o.c \ mach-o-i386.c \ mach-o-arm.c \ - mipsbsd.c \ ns32knetbsd.c \ pc532-mach.c \ pdp11.c \ @@ -849,7 +843,6 @@ BFD32_BACKENDS_CFILES = \ pe-arm.c \ pe-i386.c \ pe-mcore.c \ - pe-mips.c \ pe-ppc.c \ pe-sh.c \ pef.c \ @@ -857,7 +850,6 @@ BFD32_BACKENDS_CFILES = \ pei-arm.c \ pei-i386.c \ pei-mcore.c \ - pei-mips.c \ pei-ppc.c \ pei-sh.c \ plugin.c \ @@ -1214,7 +1206,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coff-bfd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coff-go32.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coff-i386.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coff-mips.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coff-rs6000.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coff-sh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coff-stgo32.Plo@am__quote@ @@ -1434,7 +1425,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mach-o-x86-64.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mach-o.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/merge.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mipsbsd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mmo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/netbsd-core.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ns32knetbsd.Plo@am__quote@ @@ -1446,7 +1436,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pe-arm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pe-i386.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pe-mcore.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pe-mips.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pe-ppc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pe-sh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pe-x86_64.Plo@am__quote@ @@ -1456,7 +1445,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pei-i386.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pei-ia64.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pei-mcore.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pei-mips.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pei-ppc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pei-sh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pei-x86_64.Plo@am__quote@ diff --git a/bfd/coff-mips.c b/bfd/coff-mips.c deleted file mode 100644 index 3a0163a256..0000000000 --- a/bfd/coff-mips.c +++ /dev/null @@ -1,1597 +0,0 @@ -/* BFD back-end for MIPS Extended-Coff files. - Copyright (C) 1990-2018 Free Software Foundation, Inc. - Original version by Per Bothner. - Full support added by Ian Lance Taylor, ian@cygnus.com. - - This file is part of BFD, the Binary File Descriptor library. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, - MA 02110-1301, USA. */ - -#include "sysdep.h" -#include "bfd.h" -#include "bfdlink.h" -#include "libbfd.h" -#include "coff/internal.h" -#include "coff/sym.h" -#include "coff/symconst.h" -#include "coff/ecoff.h" -#include "coff/mips.h" -#include "libcoff.h" -#include "libecoff.h" - -/* Prototypes for static functions. */ -static bfd_reloc_status_type -mips_generic_reloc - (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); -static bfd_reloc_status_type -mips_refhi_reloc - (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); -static bfd_reloc_status_type -mips_reflo_reloc - (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); -static bfd_reloc_status_type -mips_gprel_reloc - (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); - - -/* ECOFF has COFF sections, but the debugging information is stored in - a completely different format. ECOFF targets use some of the - swapping routines from coffswap.h, and some of the generic COFF - routines in coffgen.c, but, unlike the real COFF targets, do not - use coffcode.h itself. - - Get the generic COFF swapping routines, except for the reloc, - symbol, and lineno ones. Give them ECOFF names. */ -#define MIPSECOFF -#define NO_COFF_RELOCS -#define NO_COFF_SYMBOLS -#define NO_COFF_LINENOS -#define coff_swap_filehdr_in mips_ecoff_swap_filehdr_in -#define coff_swap_filehdr_out mips_ecoff_swap_filehdr_out -#define coff_swap_aouthdr_in mips_ecoff_swap_aouthdr_in -#define coff_swap_aouthdr_out mips_ecoff_swap_aouthdr_out -#define coff_swap_scnhdr_in mips_ecoff_swap_scnhdr_in -#define coff_swap_scnhdr_out mips_ecoff_swap_scnhdr_out - -#include "coffswap.h" - -/* Get the ECOFF swapping routines. */ -#define ECOFF_32 -#include "ecoffswap.h" - -/* How to process the various relocs types. */ - -static reloc_howto_type mips_howto_table[] = -{ - /* Reloc type 0 is ignored. The reloc reading code ensures that - this is a reference to the .abs section, which will cause - bfd_perform_relocation to do nothing. */ - HOWTO (MIPS_R_IGNORE, /* type */ - 0, /* rightshift */ - 0, /* size (0 = byte, 1 = short, 2 = long) */ - 8, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - 0, /* special_function */ - "IGNORE", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* A 16 bit reference to a symbol, normally from a data section. */ - HOWTO (MIPS_R_REFHALF, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - mips_generic_reloc, /* special_function */ - "REFHALF", /* name */ - TRUE, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* A 32 bit reference to a symbol, normally from a data section. */ - HOWTO (MIPS_R_REFWORD, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - mips_generic_reloc, /* special_function */ - "REFWORD", /* name */ - TRUE, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* A 26 bit absolute jump address. */ - HOWTO (MIPS_R_JMPADDR, /* type */ - 2, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 26, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - /* This needs complex overflow - detection, because the upper four - bits must match the PC. */ - mips_generic_reloc, /* special_function */ - "JMPADDR", /* name */ - TRUE, /* partial_inplace */ - 0x3ffffff, /* src_mask */ - 0x3ffffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* The high 16 bits of a symbol value. Handled by the function - mips_refhi_reloc. */ - HOWTO (MIPS_R_REFHI, /* type */ - 16, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - mips_refhi_reloc, /* special_function */ - "REFHI", /* name */ - TRUE, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* The low 16 bits of a symbol value. */ - HOWTO (MIPS_R_REFLO, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - mips_reflo_reloc, /* special_function */ - "REFLO", /* name */ - TRUE, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* A reference to an offset from the gp register. Handled by the - function mips_gprel_reloc. */ - HOWTO (MIPS_R_GPREL, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - mips_gprel_reloc, /* special_function */ - "GPREL", /* name */ - TRUE, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* A reference to a literal using an offset from the gp register. - Handled by the function mips_gprel_reloc. */ - HOWTO (MIPS_R_LITERAL, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - mips_gprel_reloc, /* special_function */ - "LITERAL", /* name */ - TRUE, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - - EMPTY_HOWTO (8), - EMPTY_HOWTO (9), - EMPTY_HOWTO (10), - EMPTY_HOWTO (11), - - /* FIXME: This relocation is used (internally only) to represent branches - when assembling. It should never appear in output files, and - be removed. (It used to be used for embedded-PIC support.) */ - HOWTO (MIPS_R_PCREL16, /* type */ - 2, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - TRUE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - mips_generic_reloc, /* special_function */ - "PCREL16", /* name */ - TRUE, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - TRUE), /* pcrel_offset */ -}; - -#define MIPS_HOWTO_COUNT \ - (sizeof mips_howto_table / sizeof mips_howto_table[0]) - -/* See whether the magic number matches. */ - -static bfd_boolean -mips_ecoff_bad_format_hook (bfd * abfd, void * filehdr) -{ - struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr; - - switch (internal_f->f_magic) - { - case MIPS_MAGIC_1: - /* I don't know what endianness this implies. */ - return TRUE; - - case MIPS_MAGIC_BIG: - case MIPS_MAGIC_BIG2: - case MIPS_MAGIC_BIG3: - return bfd_big_endian (abfd); - - case MIPS_MAGIC_LITTLE: - case MIPS_MAGIC_LITTLE2: - case MIPS_MAGIC_LITTLE3: - return bfd_little_endian (abfd); - - default: - return FALSE; - } -} - -/* Reloc handling. MIPS ECOFF relocs are packed into 8 bytes in - external form. They use a bit which indicates whether the symbol - is external. */ - -/* Swap a reloc in. */ - -static void -mips_ecoff_swap_reloc_in (bfd * abfd, - void * ext_ptr, - struct internal_reloc *intern) -{ - const RELOC *ext = (RELOC *) ext_ptr; - - intern->r_vaddr = H_GET_32 (abfd, ext->r_vaddr); - if (bfd_header_big_endian (abfd)) - { - intern->r_symndx = (((int) ext->r_bits[0] - << RELOC_BITS0_SYMNDX_SH_LEFT_BIG) - | ((int) ext->r_bits[1] - << RELOC_BITS1_SYMNDX_SH_LEFT_BIG) - | ((int) ext->r_bits[2] - << RELOC_BITS2_SYMNDX_SH_LEFT_BIG)); - intern->r_type = ((ext->r_bits[3] & RELOC_BITS3_TYPE_BIG) - >> RELOC_BITS3_TYPE_SH_BIG); - intern->r_extern = (ext->r_bits[3] & RELOC_BITS3_EXTERN_BIG) != 0; - } - else - { - intern->r_symndx = (((int) ext->r_bits[0] - << RELOC_BITS0_SYMNDX_SH_LEFT_LITTLE) - | ((int) ext->r_bits[1] - << RELOC_BITS1_SYMNDX_SH_LEFT_LITTLE) - | ((int) ext->r_bits[2] - << RELOC_BITS2_SYMNDX_SH_LEFT_LITTLE)); - intern->r_type = (((ext->r_bits[3] & RELOC_BITS3_TYPE_LITTLE) - >> RELOC_BITS3_TYPE_SH_LITTLE) - | ((ext->r_bits[3] & RELOC_BITS3_TYPEHI_LITTLE) - << RELOC_BITS3_TYPEHI_SH_LITTLE)); - intern->r_extern = (ext->r_bits[3] & RELOC_BITS3_EXTERN_LITTLE) != 0; - } -} - -/* Swap a reloc out. */ - -static void -mips_ecoff_swap_reloc_out (bfd * abfd, - const struct internal_reloc * intern, - void * dst) -{ - RELOC *ext = (RELOC *) dst; - long r_symndx; - - BFD_ASSERT (intern->r_extern - || (intern->r_symndx >= 0 && intern->r_symndx <= 12)); - - r_symndx = intern->r_symndx; - - H_PUT_32 (abfd, intern->r_vaddr, ext->r_vaddr); - if (bfd_header_big_endian (abfd)) - { - ext->r_bits[0] = r_symndx >> RELOC_BITS0_SYMNDX_SH_LEFT_BIG; - ext->r_bits[1] = r_symndx >> RELOC_BITS1_SYMNDX_SH_LEFT_BIG; - ext->r_bits[2] = r_symndx >> RELOC_BITS2_SYMNDX_SH_LEFT_BIG; - ext->r_bits[3] = (((intern->r_type << RELOC_BITS3_TYPE_SH_BIG) - & RELOC_BITS3_TYPE_BIG) - | (intern->r_extern ? RELOC_BITS3_EXTERN_BIG : 0)); - } - else - { - ext->r_bits[0] = r_symndx >> RELOC_BITS0_SYMNDX_SH_LEFT_LITTLE; - ext->r_bits[1] = r_symndx >> RELOC_BITS1_SYMNDX_SH_LEFT_LITTLE; - ext->r_bits[2] = r_symndx >> RELOC_BITS2_SYMNDX_SH_LEFT_LITTLE; - ext->r_bits[3] = (((intern->r_type << RELOC_BITS3_TYPE_SH_LITTLE) - & RELOC_BITS3_TYPE_LITTLE) - | ((intern->r_type >> RELOC_BITS3_TYPEHI_SH_LITTLE - & RELOC_BITS3_TYPEHI_LITTLE)) - | (intern->r_extern ? RELOC_BITS3_EXTERN_LITTLE : 0)); - } -} - -/* Finish canonicalizing a reloc. Part of this is generic to all - ECOFF targets, and that part is in ecoff.c. The rest is done in - this backend routine. It must fill in the howto field. */ - -static void -mips_adjust_reloc_in (bfd *abfd, - const struct internal_reloc *intern, - arelent *rptr) -{ - if (intern->r_type > MIPS_R_PCREL16) - abort (); - - if (! intern->r_extern - && (intern->r_type == MIPS_R_GPREL - || intern->r_type == MIPS_R_LITERAL)) - rptr->addend += ecoff_data (abfd)->gp; - - /* If the type is MIPS_R_IGNORE, make sure this is a reference to - the absolute section so that the reloc is ignored. */ - if (intern->r_type == MIPS_R_IGNORE) - rptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; - - rptr->howto = &mips_howto_table[intern->r_type]; -} - -/* Make any adjustments needed to a reloc before writing it out. None - are needed for MIPS. */ - -static void -mips_adjust_reloc_out (bfd *abfd ATTRIBUTE_UNUSED, - const arelent *rel ATTRIBUTE_UNUSED, - struct internal_reloc *intern ATTRIBUTE_UNUSED) -{ -} - -/* ECOFF relocs are either against external symbols, or against - sections. If we are producing relocatable output, and the reloc - is against an external symbol, and nothing has given us any - additional addend, the resulting reloc will also be against the - same symbol. In such a case, we don't want to change anything - about the way the reloc is handled, since it will all be done at - final link time. Rather than put special case code into - bfd_perform_relocation, all the reloc types use this howto - function. It just short circuits the reloc if producing - relocatable output against an external symbol. */ - -static bfd_reloc_status_type -mips_generic_reloc (bfd *abfd ATTRIBUTE_UNUSED, - arelent *reloc_entry, - asymbol *symbol, - void * data ATTRIBUTE_UNUSED, - asection *input_section, - bfd *output_bfd, - char **error_message ATTRIBUTE_UNUSED) -{ - if (output_bfd != (bfd *) NULL - && (symbol->flags & BSF_SECTION_SYM) == 0 - && reloc_entry->addend == 0) - { - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - - return bfd_reloc_continue; -} - -/* Do a REFHI relocation. This has to be done in combination with a - REFLO reloc, because there is a carry from the REFLO to the REFHI. - Here we just save the information we need; we do the actual - relocation when we see the REFLO. MIPS ECOFF requires that the - REFLO immediately follow the REFHI. As a GNU extension, we permit - an arbitrary number of HI relocs to be associated with a single LO - reloc. This extension permits gcc to output the HI and LO relocs - itself. */ - -struct mips_hi -{ - struct mips_hi *next; - bfd_byte *addr; - bfd_vma addend; -}; - -/* FIXME: This should not be a static variable. */ - -static struct mips_hi *mips_refhi_list; - -static bfd_reloc_status_type -mips_refhi_reloc (bfd *abfd ATTRIBUTE_UNUSED, - arelent *reloc_entry, - asymbol *symbol, - void * data, - asection *input_section, - bfd *output_bfd, - char **error_message ATTRIBUTE_UNUSED) -{ - bfd_reloc_status_type ret; - bfd_vma relocation; - struct mips_hi *n; - - /* If we're relocating, and this an external symbol, we don't want - to change anything. */ - if (output_bfd != (bfd *) NULL - && (symbol->flags & BSF_SECTION_SYM) == 0 - && reloc_entry->addend == 0) - { - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - - ret = bfd_reloc_ok; - if (bfd_is_und_section (symbol->section) - && output_bfd == (bfd *) NULL) - ret = bfd_reloc_undefined; - - if (bfd_is_com_section (symbol->section)) - relocation = 0; - else - relocation = symbol->value; - - relocation += symbol->section->output_section->vma; - relocation += symbol->section->output_offset; - relocation += reloc_entry->addend; - - if (reloc_entry->address > bfd_get_section_limit (abfd, input_section)) - return bfd_reloc_outofrange; - - /* Save the information, and let REFLO do the actual relocation. */ - n = (struct mips_hi *) bfd_malloc ((bfd_size_type) sizeof *n); - if (n == NULL) - return bfd_reloc_outofrange; - n->addr = (bfd_byte *) data + reloc_entry->address; - n->addend = relocation; - n->next = mips_refhi_list; - mips_refhi_list = n; - - if (output_bfd != (bfd *) NULL) - reloc_entry->address += input_section->output_offset; - - return ret; -} - -/* Do a REFLO relocation. This is a straightforward 16 bit inplace - relocation; this function exists in order to do the REFHI - relocation described above. */ - -static bfd_reloc_status_type -mips_reflo_reloc (bfd *abfd ATTRIBUTE_UNUSED, - arelent *reloc_entry, - asymbol *symbol, - void * data, - asection *input_section, - bfd *output_bfd, - char **error_message ATTRIBUTE_UNUSED) -{ - if (mips_refhi_list != NULL) - { - struct mips_hi *l; - - l = mips_refhi_list; - while (l != NULL) - { - unsigned long insn; - unsigned long val; - unsigned long vallo; - struct mips_hi *next; - - if (! bfd_reloc_offset_in_range (reloc_entry->howto, abfd, - input_section, - reloc_entry->address - * bfd_octets_per_byte (abfd))) - return bfd_reloc_outofrange; - - /* Do the REFHI relocation. Note that we actually don't - need to know anything about the REFLO itself, except - where to find the low 16 bits of the addend needed by the - REFHI. */ - insn = bfd_get_32 (abfd, l->addr); - vallo = (bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address) - & 0xffff); - val = ((insn & 0xffff) << 16) + vallo; - val += l->addend; - - /* The low order 16 bits are always treated as a signed - value. Therefore, a negative value in the low order bits - requires an adjustment in the high order bits. We need - to make this adjustment in two ways: once for the bits we - took from the data, and once for the bits we are putting - back in to the data. */ - if ((vallo & 0x8000) != 0) - val -= 0x10000; - if ((val & 0x8000) != 0) - val += 0x10000; - - insn = (insn &~ (unsigned) 0xffff) | ((val >> 16) & 0xffff); - bfd_put_32 (abfd, (bfd_vma) insn, l->addr); - - next = l->next; - free (l); - l = next; - } - - mips_refhi_list = NULL; - } - - /* Now do the REFLO reloc in the usual way. */ - return mips_generic_reloc (abfd, reloc_entry, symbol, data, - input_section, output_bfd, error_message); -} - -/* Do a GPREL relocation. This is a 16 bit value which must become - the offset from the gp register. */ - -static bfd_reloc_status_type -mips_gprel_reloc (bfd *abfd ATTRIBUTE_UNUSED, - arelent *reloc_entry, - asymbol *symbol, - void * data, - asection *input_section, - bfd *output_bfd, - char **error_message ATTRIBUTE_UNUSED) -{ - bfd_boolean relocatable; - bfd_vma gp; - bfd_vma relocation; - unsigned long val; - unsigned long insn; - - /* If we're relocating, and this is an external symbol with no - addend, we don't want to change anything. We will only have an - addend if this is a newly created reloc, not read from an ECOFF - file. */ - if (output_bfd != (bfd *) NULL - && (symbol->flags & BSF_SECTION_SYM) == 0 - && reloc_entry->addend == 0) - { - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - - if (output_bfd != (bfd *) NULL) - relocatable = TRUE; - else - { - relocatable = FALSE; - output_bfd = symbol->section->output_section->owner; - } - - if (bfd_is_und_section (symbol->section) && ! relocatable) - return bfd_reloc_undefined; - - /* We have to figure out the gp value, so that we can adjust the - symbol value correctly. We look up the symbol _gp in the output - BFD. If we can't find it, we're stuck. We cache it in the ECOFF - target data. We don't need to adjust the symbol value for an - external symbol if we are producing relocatable output. */ - gp = _bfd_get_gp_value (output_bfd); - if (gp == 0 - && (! relocatable - || (symbol->flags & BSF_SECTION_SYM) != 0)) - { - if (relocatable) - { - /* Make up a value. */ - gp = symbol->section->output_section->vma + 0x4000; - _bfd_set_gp_value (output_bfd, gp); - } - else - { - unsigned int count; - asymbol **sym; - unsigned int i; - - count = bfd_get_symcount (output_bfd); - sym = bfd_get_outsymbols (output_bfd); - - if (sym == (asymbol **) NULL) - i = count; - else - { - for (i = 0; i < count; i++, sym++) - { - register const char *name; - - name = bfd_asymbol_name (*sym); - if (*name == '_' && strcmp (name, "_gp") == 0) - { - gp = bfd_asymbol_value (*sym); - _bfd_set_gp_value (output_bfd, gp); - break; - } - } - } - - if (i >= count) - { - /* Only get the error once. */ - gp = 4; - _bfd_set_gp_value (output_bfd, gp); - *error_message = - (char *) _("GP relative relocation when _gp not defined"); - return bfd_reloc_dangerous; - } - } - } - - if (bfd_is_com_section (symbol->section)) - relocation = 0; - else - relocation = symbol->value; - - relocation += symbol->section->output_section->vma; - relocation += symbol->section->output_offset; - - if (reloc_entry->address > bfd_get_section_limit (abfd, input_section)) - return bfd_reloc_outofrange; - - insn = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address); - - /* Set val to the offset into the section or symbol. */ - val = ((insn & 0xffff) + reloc_entry->addend) & 0xffff; - if (val & 0x8000) - val -= 0x10000; - - /* Adjust val for the final section location and GP value. If we - are producing relocatable output, we don't want to do this for - an external symbol. */ - if (! relocatable - || (symbol->flags & BSF_SECTION_SYM) != 0) - val += relocation - gp; - - insn = (insn &~ (unsigned) 0xffff) | (val & 0xffff); - bfd_put_32 (abfd, (bfd_vma) insn, (bfd_byte *) data + reloc_entry->address); - - if (relocatable) - reloc_entry->address += input_section->output_offset; - - /* Make sure it fit in 16 bits. */ - if ((long) val >= 0x8000 || (long) val < -0x8000) - return bfd_reloc_overflow; - - return bfd_reloc_ok; -} - -/* Get the howto structure for a generic reloc type. */ - -static reloc_howto_type * -mips_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, - bfd_reloc_code_real_type code) -{ - int mips_type; - - switch (code) - { - case BFD_RELOC_16: - mips_type = MIPS_R_REFHALF; - break; - case BFD_RELOC_32: - case BFD_RELOC_CTOR: - mips_type = MIPS_R_REFWORD; - break; - case BFD_RELOC_MIPS_JMP: - mips_type = MIPS_R_JMPADDR; - break; - case BFD_RELOC_HI16_S: - mips_type = MIPS_R_REFHI; - break; - case BFD_RELOC_LO16: - mips_type = MIPS_R_REFLO; - break; - case BFD_RELOC_GPREL16: - mips_type = MIPS_R_GPREL; - break; - case BFD_RELOC_MIPS_LITERAL: - mips_type = MIPS_R_LITERAL; - break; - case BFD_RELOC_16_PCREL_S2: - mips_type = MIPS_R_PCREL16; - break; - default: - return (reloc_howto_type *) NULL; - } - - return &mips_howto_table[mips_type]; -} - -static reloc_howto_type * -mips_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, - const char *r_name) -{ - unsigned int i; - - for (i = 0; - i < sizeof (mips_howto_table) / sizeof (mips_howto_table[0]); - i++) - if (mips_howto_table[i].name != NULL - && strcasecmp (mips_howto_table[i].name, r_name) == 0) - return &mips_howto_table[i]; - - return NULL; -} - -/* A helper routine for mips_relocate_section which handles the REFHI - relocations. The REFHI relocation must be followed by a REFLO - relocation, and the addend used is formed from the addends of both - instructions. */ - -static void -mips_relocate_hi (struct internal_reloc *refhi, - struct internal_reloc *reflo, - bfd *input_bfd, - asection *input_section, - bfd_byte *contents, - bfd_vma relocation) -{ - unsigned long insn; - unsigned long val; - unsigned long vallo; - - if (refhi == NULL) - return; - - insn = bfd_get_32 (input_bfd, - contents + refhi->r_vaddr - input_section->vma); - if (reflo == NULL) - vallo = 0; - else - vallo = (bfd_get_32 (input_bfd, - contents + reflo->r_vaddr - input_section->vma) - & 0xffff); - - val = ((insn & 0xffff) << 16) + vallo; - val += relocation; - - /* The low order 16 bits are always treated as a signed value. - Therefore, a negative value in the low order bits requires an - adjustment in the high order bits. We need to make this - adjustment in two ways: once for the bits we took from the data, - and once for the bits we are putting back in to the data. */ - if ((vallo & 0x8000) != 0) - val -= 0x10000; - - if ((val & 0x8000) != 0) - val += 0x10000; - - insn = (insn &~ (unsigned) 0xffff) | ((val >> 16) & 0xffff); - bfd_put_32 (input_bfd, (bfd_vma) insn, - contents + refhi->r_vaddr - input_section->vma); -} - -/* Relocate a section while linking a MIPS ECOFF file. */ - -static bfd_boolean -mips_relocate_section (bfd *output_bfd, - struct bfd_link_info *info, - bfd *input_bfd, - asection *input_section, - bfd_byte *contents, - void * external_relocs) -{ - asection **symndx_to_section; - struct ecoff_link_hash_entry **sym_hashes; - bfd_vma gp; - bfd_boolean gp_undefined; - struct external_reloc *ext_rel; - struct external_reloc *ext_rel_end; - unsigned int i; - bfd_boolean got_lo; - struct internal_reloc lo_int_rel; - bfd_size_type amt; - - BFD_ASSERT (input_bfd->xvec->byteorder - == output_bfd->xvec->byteorder); - - /* We keep a table mapping the symndx found in an internal reloc to - the appropriate section. This is faster than looking up the - section by name each time. */ - symndx_to_section = ecoff_data (input_bfd)->symndx_to_section; - if (symndx_to_section == (asection **) NULL) - { - amt = NUM_RELOC_SECTIONS * sizeof (asection *); - symndx_to_section = (asection **) bfd_alloc (input_bfd, amt); - if (!symndx_to_section) - return FALSE; - - symndx_to_section[RELOC_SECTION_NONE] = NULL; - symndx_to_section[RELOC_SECTION_TEXT] = - bfd_get_section_by_name (input_bfd, ".text"); - symndx_to_section[RELOC_SECTION_RDATA] = - bfd_get_section_by_name (input_bfd, ".rdata"); - symndx_to_section[RELOC_SECTION_DATA] = - bfd_get_section_by_name (input_bfd, ".data"); - symndx_to_section[RELOC_SECTION_SDATA] = - bfd_get_section_by_name (input_bfd, ".sdata"); - symndx_to_section[RELOC_SECTION_SBSS] = - bfd_get_section_by_name (input_bfd, ".sbss"); - symndx_to_section[RELOC_SECTION_BSS] = - bfd_get_section_by_name (input_bfd, ".bss"); - symndx_to_section[RELOC_SECTION_INIT] = - bfd_get_section_by_name (input_bfd, ".init"); - symndx_to_section[RELOC_SECTION_LIT8] = - bfd_get_section_by_name (input_bfd, ".lit8"); - symndx_to_section[RELOC_SECTION_LIT4] = - bfd_get_section_by_name (input_bfd, ".lit4"); - symndx_to_section[RELOC_SECTION_XDATA] = NULL; - symndx_to_section[RELOC_SECTION_PDATA] = NULL; - symndx_to_section[RELOC_SECTION_FINI] = - bfd_get_section_by_name (input_bfd, ".fini"); - symndx_to_section[RELOC_SECTION_LITA] = NULL; - symndx_to_section[RELOC_SECTION_ABS] = NULL; - - ecoff_data (input_bfd)->symndx_to_section = symndx_to_section; - } - - sym_hashes = ecoff_data (input_bfd)->sym_hashes; - - gp = _bfd_get_gp_value (output_bfd); - if (gp == 0) - gp_undefined = TRUE; - else - gp_undefined = FALSE; - - got_lo = FALSE; - - ext_rel = (struct external_reloc *) external_relocs; - ext_rel_end = ext_rel + input_section->reloc_count; - for (i = 0; ext_rel < ext_rel_end; ext_rel++, i++) - { - struct internal_reloc int_rel; - bfd_boolean use_lo = FALSE; - bfd_vma addend; - reloc_howto_type *howto; - struct ecoff_link_hash_entry *h = NULL; - asection *s = NULL; - bfd_vma relocation; - bfd_reloc_status_type r; - - if (! got_lo) - mips_ecoff_swap_reloc_in (input_bfd, ext_rel, &int_rel); - else - { - int_rel = lo_int_rel; - got_lo = FALSE; - } - - BFD_ASSERT (int_rel.r_type - < sizeof mips_howto_table / sizeof mips_howto_table[0]); - - /* The REFHI reloc requires special handling. It must be followed - by a REFLO reloc, and the addend is formed from both relocs. */ - if (int_rel.r_type == MIPS_R_REFHI) - { - struct external_reloc *lo_ext_rel; - - /* As a GNU extension, permit an arbitrary number of REFHI - relocs before the REFLO reloc. This permits gcc to emit - the HI and LO relocs itself. */ - for (lo_ext_rel = ext_rel + 1; - lo_ext_rel < ext_rel_end; - lo_ext_rel++) - { - mips_ecoff_swap_reloc_in (input_bfd, lo_ext_rel, - &lo_int_rel); - if (lo_int_rel.r_type != int_rel.r_type) - break; - } - - if (lo_ext_rel < ext_rel_end - && lo_int_rel.r_type == MIPS_R_REFLO - && int_rel.r_extern == lo_int_rel.r_extern - && int_rel.r_symndx == lo_int_rel.r_symndx) - { - use_lo = TRUE; - if (lo_ext_rel == ext_rel + 1) - got_lo = TRUE; - } - } - - howto = &mips_howto_table[int_rel.r_type]; - - if (int_rel.r_extern) - { - h = sym_hashes[int_rel.r_symndx]; - /* If h is NULL, that means that there is a reloc against an - external symbol which we thought was just a debugging - symbol. This should not happen. */ - if (h == (struct ecoff_link_hash_entry *) NULL) - abort (); - } - else - { - if (int_rel.r_symndx < 0 || int_rel.r_symndx >= NUM_RELOC_SECTIONS) - s = NULL; - else - s = symndx_to_section[int_rel.r_symndx]; - - if (s == (asection *) NULL) - abort (); - } - - /* The GPREL reloc uses an addend: the difference in the GP - values. */ - if (int_rel.r_type != MIPS_R_GPREL - && int_rel.r_type != MIPS_R_LITERAL) - addend = 0; - else - { - if (gp_undefined) - { - (*info->callbacks->reloc_dangerous) - (info, _("GP relative relocation used when GP not defined"), - input_bfd, input_section, - int_rel.r_vaddr - input_section->vma); - /* Only give the error once per link. */ - gp = 4; - _bfd_set_gp_value (output_bfd, gp); - gp_undefined = FALSE; - } - if (! int_rel.r_extern) - { - /* This is a relocation against a section. The current - addend in the instruction is the difference between - INPUT_SECTION->vma and the GP value of INPUT_BFD. We - must change this to be the difference between the - final definition (which will end up in RELOCATION) - and the GP value of OUTPUT_BFD (which is in GP). */ - addend = ecoff_data (input_bfd)->gp - gp; - } - else if (! bfd_link_relocatable (info) - || h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - { - /* This is a relocation against a defined symbol. The - current addend in the instruction is simply the - desired offset into the symbol (normally zero). We - are going to change this into a relocation against a - defined symbol, so we want the instruction to hold - the difference between the final definition of the - symbol (which will end up in RELOCATION) and the GP - value of OUTPUT_BFD (which is in GP). */ - addend = - gp; - } - else - { - /* This is a relocation against an undefined or common - symbol. The current addend in the instruction is - simply the desired offset into the symbol (normally - zero). We are generating relocatable output, and we - aren't going to define this symbol, so we just leave - the instruction alone. */ - addend = 0; - } - } - - if (bfd_link_relocatable (info)) - { - /* We are generating relocatable output, and must convert - the existing reloc. */ - if (int_rel.r_extern) - { - if ((h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - && ! bfd_is_abs_section (h->root.u.def.section)) - { - const char *name; - - /* This symbol is defined in the output. Convert - the reloc from being against the symbol to being - against the section. */ - - /* Clear the r_extern bit. */ - int_rel.r_extern = 0; - - /* Compute a new r_symndx value. */ - s = h->root.u.def.section; - name = bfd_get_section_name (output_bfd, - s->output_section); - - int_rel.r_symndx = -1; - switch (name[1]) - { - case 'b': - if (strcmp (name, ".bss") == 0) - int_rel.r_symndx = RELOC_SECTION_BSS; - break; - case 'd': - if (strcmp (name, ".data") == 0) - int_rel.r_symndx = RELOC_SECTION_DATA; - break; - case 'f': - if (strcmp (name, ".fini") == 0) - int_rel.r_symndx = RELOC_SECTION_FINI; - break; - case 'i': - if (strcmp (name, ".init") == 0) - int_rel.r_symndx = RELOC_SECTION_INIT; - break; - case 'l': - if (strcmp (name, ".lit8") == 0) - int_rel.r_symndx = RELOC_SECTION_LIT8; - else if (strcmp (name, ".lit4") == 0) - int_rel.r_symndx = RELOC_SECTION_LIT4; - break; - case 'r': - if (strcmp (name, ".rdata") == 0) - int_rel.r_symndx = RELOC_SECTION_RDATA; - break; - case 's': - if (strcmp (name, ".sdata") == 0) - int_rel.r_symndx = RELOC_SECTION_SDATA; - else if (strcmp (name, ".sbss") == 0) - int_rel.r_symndx = RELOC_SECTION_SBSS; - break; - case 't': - if (strcmp (name, ".text") == 0) - int_rel.r_symndx = RELOC_SECTION_TEXT; - break; - } - - if (int_rel.r_symndx == -1) - abort (); - - /* Add the section VMA and the symbol value. */ - relocation = (h->root.u.def.value - + s->output_section->vma - + s->output_offset); - - /* For a PC relative relocation, the object file - currently holds just the addend. We must adjust - by the address to get the right value. */ - if (howto->pc_relative) - relocation -= int_rel.r_vaddr - input_section->vma; - - h = NULL; - } - else - { - /* Change the symndx value to the right one for the - output BFD. */ - int_rel.r_symndx = h->indx; - if (int_rel.r_symndx == -1) - { - /* This symbol is not being written out. */ - (*info->callbacks->unattached_reloc) - (info, h->root.root.string, input_bfd, input_section, - int_rel.r_vaddr - input_section->vma); - int_rel.r_symndx = 0; - } - relocation = 0; - } - } - else - { - /* This is a relocation against a section. Adjust the - value by the amount the section moved. */ - relocation = (s->output_section->vma - + s->output_offset - - s->vma); - } - - relocation += addend; - addend = 0; - - /* Adjust a PC relative relocation by removing the reference - to the original address in the section and including the - reference to the new address. */ - if (howto->pc_relative) - relocation -= (input_section->output_section->vma - + input_section->output_offset - - input_section->vma); - - /* Adjust the contents. */ - if (relocation == 0) - r = bfd_reloc_ok; - else - { - if (int_rel.r_type != MIPS_R_REFHI) - r = _bfd_relocate_contents (howto, input_bfd, relocation, - (contents - + int_rel.r_vaddr - - input_section->vma)); - else - { - mips_relocate_hi (&int_rel, - use_lo ? &lo_int_rel : NULL, - input_bfd, input_section, contents, - relocation); - r = bfd_reloc_ok; - } - } - - /* Adjust the reloc address. */ - int_rel.r_vaddr += (input_section->output_section->vma - + input_section->output_offset - - input_section->vma); - - /* Save the changed reloc information. */ - mips_ecoff_swap_reloc_out (input_bfd, &int_rel, ext_rel); - } - else - { - /* We are producing a final executable. */ - if (int_rel.r_extern) - { - /* This is a reloc against a symbol. */ - if (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - { - asection *hsec; - - hsec = h->root.u.def.section; - relocation = (h->root.u.def.value - + hsec->output_section->vma - + hsec->output_offset); - } - else - { - (*info->callbacks->undefined_symbol) - (info, h->root.root.string, input_bfd, input_section, - int_rel.r_vaddr - input_section->vma, TRUE); - relocation = 0; - } - } - else - { - /* This is a reloc against a section. */ - relocation = (s->output_section->vma - + s->output_offset - - s->vma); - - /* A PC relative reloc is already correct in the object - file. Make it look like a pcrel_offset relocation by - adding in the start address. */ - if (howto->pc_relative) - relocation += int_rel.r_vaddr; - } - - if (int_rel.r_type != MIPS_R_REFHI) - r = _bfd_final_link_relocate (howto, - input_bfd, - input_section, - contents, - (int_rel.r_vaddr - - input_section->vma), - relocation, - addend); - else - { - mips_relocate_hi (&int_rel, - use_lo ? &lo_int_rel : NULL, - input_bfd, input_section, contents, - relocation); - r = bfd_reloc_ok; - } - } - - /* MIPS_R_JMPADDR requires peculiar overflow detection. The - instruction provides a 28 bit address (the two lower bits are - implicit zeroes) which is combined with the upper four bits - of the instruction address. */ - if (r == bfd_reloc_ok - && int_rel.r_type == MIPS_R_JMPADDR - && (((relocation - + addend - + (int_rel.r_extern ? 0 : s->vma)) - & 0xf0000000) - != ((input_section->output_section->vma - + input_section->output_offset - + (int_rel.r_vaddr - input_section->vma)) - & 0xf0000000))) - r = bfd_reloc_overflow; - - if (r != bfd_reloc_ok) - { - switch (r) - { - default: - case bfd_reloc_outofrange: - abort (); - case bfd_reloc_overflow: - { - const char *name; - - if (int_rel.r_extern) - name = NULL; - else - name = bfd_section_name (input_bfd, s); - (*info->callbacks->reloc_overflow) - (info, (h ? &h->root : NULL), name, howto->name, - (bfd_vma) 0, input_bfd, input_section, - int_rel.r_vaddr - input_section->vma); - } - break; - } - } - } - - return TRUE; -} - -static void -mips_ecoff_swap_coff_aux_in (bfd *abfd ATTRIBUTE_UNUSED, - void *ext1 ATTRIBUTE_UNUSED, - int type ATTRIBUTE_UNUSED, - int in_class ATTRIBUTE_UNUSED, - int indx ATTRIBUTE_UNUSED, - int numaux ATTRIBUTE_UNUSED, - void *in1 ATTRIBUTE_UNUSED) -{ -} - -static void -mips_ecoff_swap_coff_sym_in (bfd *abfd ATTRIBUTE_UNUSED, - void *ext1 ATTRIBUTE_UNUSED, - void *in1 ATTRIBUTE_UNUSED) -{ -} - -static void -mips_ecoff_swap_coff_lineno_in (bfd *abfd ATTRIBUTE_UNUSED, - void *ext1 ATTRIBUTE_UNUSED, - void *in1 ATTRIBUTE_UNUSED) -{ -} - -static unsigned int -mips_ecoff_swap_coff_aux_out (bfd *abfd ATTRIBUTE_UNUSED, - void *inp ATTRIBUTE_UNUSED, - int type ATTRIBUTE_UNUSED, - int in_class ATTRIBUTE_UNUSED, - int indx ATTRIBUTE_UNUSED, - int numaux ATTRIBUTE_UNUSED, - void *extp ATTRIBUTE_UNUSED) -{ - return 0; -} - -static unsigned int -mips_ecoff_swap_coff_sym_out (bfd *abfd ATTRIBUTE_UNUSED, - void *inp ATTRIBUTE_UNUSED, - void *extp ATTRIBUTE_UNUSED) -{ - return 0; -} - -static unsigned int -mips_ecoff_swap_coff_lineno_out (bfd *abfd ATTRIBUTE_UNUSED, - void *inp ATTRIBUTE_UNUSED, - void *extp ATTRIBUTE_UNUSED) -{ - return 0; -} - -static unsigned int -mips_ecoff_swap_coff_reloc_out (bfd *abfd ATTRIBUTE_UNUSED, - void *inp ATTRIBUTE_UNUSED, - void *extp ATTRIBUTE_UNUSED) -{ - return 0; -} - -/* This is the ECOFF backend structure. The backend field of the - target vector points to this. */ - -static const struct ecoff_backend_data mips_ecoff_backend_data = -{ - /* COFF backend structure. */ - { - mips_ecoff_swap_coff_aux_in, mips_ecoff_swap_coff_sym_in, - mips_ecoff_swap_coff_lineno_in, mips_ecoff_swap_coff_aux_out, - mips_ecoff_swap_coff_sym_out, mips_ecoff_swap_coff_lineno_out, - mips_ecoff_swap_coff_reloc_out, - mips_ecoff_swap_filehdr_out, mips_ecoff_swap_aouthdr_out, - mips_ecoff_swap_scnhdr_out, - FILHSZ, AOUTSZ, SCNHSZ, 0, 0, 0, 0, FILNMLEN, TRUE, - ECOFF_NO_LONG_SECTION_NAMES, 4, FALSE, 2, 32768, - mips_ecoff_swap_filehdr_in, mips_ecoff_swap_aouthdr_in, - mips_ecoff_swap_scnhdr_in, NULL, - mips_ecoff_bad_format_hook, _bfd_ecoff_set_arch_mach_hook, - _bfd_ecoff_mkobject_hook, _bfd_ecoff_styp_to_sec_flags, - _bfd_ecoff_set_alignment_hook, _bfd_ecoff_slurp_symbol_table, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL - }, - /* Supported architecture. */ - bfd_arch_mips, - /* Initial portion of armap string. */ - "__________", - /* The page boundary used to align sections in a demand-paged - executable file. E.g., 0x1000. */ - 0x1000, - /* TRUE if the .rdata section is part of the text segment, as on the - Alpha. FALSE if .rdata is part of the data segment, as on the - MIPS. */ - FALSE, - /* Bitsize of constructor entries. */ - 32, - /* Reloc to use for constructor entries. */ - &mips_howto_table[MIPS_R_REFWORD], - { - /* Symbol table magic number. */ - magicSym, - /* Alignment of debugging information. E.g., 4. */ - 4, - /* Sizes of external symbolic information. */ - sizeof (struct hdr_ext), - sizeof (struct dnr_ext), - sizeof (struct pdr_ext), - sizeof (struct sym_ext), - sizeof (struct opt_ext), - sizeof (struct fdr_ext), - sizeof (struct rfd_ext), - sizeof (struct ext_ext), - /* Functions to swap in external symbolic data. */ - ecoff_swap_hdr_in, - ecoff_swap_dnr_in, - ecoff_swap_pdr_in, - ecoff_swap_sym_in, - ecoff_swap_opt_in, - ecoff_swap_fdr_in, - ecoff_swap_rfd_in, - ecoff_swap_ext_in, - _bfd_ecoff_swap_tir_in, - _bfd_ecoff_swap_rndx_in, - /* Functions to swap out external symbolic data. */ - ecoff_swap_hdr_out, - ecoff_swap_dnr_out, - ecoff_swap_pdr_out, - ecoff_swap_sym_out, - ecoff_swap_opt_out, - ecoff_swap_fdr_out, - ecoff_swap_rfd_out, - ecoff_swap_ext_out, - _bfd_ecoff_swap_tir_out, - _bfd_ecoff_swap_rndx_out, - /* Function to read in symbolic data. */ - _bfd_ecoff_slurp_symbolic_info - }, - /* External reloc size. */ - RELSZ, - /* Reloc swapping functions. */ - mips_ecoff_swap_reloc_in, - mips_ecoff_swap_reloc_out, - /* Backend reloc tweaking. */ - mips_adjust_reloc_in, - mips_adjust_reloc_out, - /* Relocate section contents while linking. */ - mips_relocate_section, - /* Do final adjustments to filehdr and aouthdr. */ - NULL, - /* Read an element from an archive at a given file position. */ - _bfd_get_elt_at_filepos -}; - -/* Looking up a reloc type is MIPS specific. */ -#define _bfd_ecoff_bfd_reloc_type_lookup mips_bfd_reloc_type_lookup -#define _bfd_ecoff_bfd_reloc_name_lookup mips_bfd_reloc_name_lookup - -/* Getting relocated section contents is generic. */ -#define _bfd_ecoff_bfd_get_relocated_section_contents \ - bfd_generic_get_relocated_section_contents - -/* Handling file windows is generic. */ -#define _bfd_ecoff_get_section_contents_in_window \ - _bfd_generic_get_section_contents_in_window - -/* Relaxing sections is MIPS specific. */ -#define _bfd_ecoff_bfd_relax_section bfd_generic_relax_section - -/* GC of sections is not done. */ -#define _bfd_ecoff_bfd_gc_sections bfd_generic_gc_sections - -/* Input section flags is not implemented. */ -#define _bfd_ecoff_bfd_lookup_section_flags bfd_generic_lookup_section_flags - -/* Merging of sections is not done. */ -#define _bfd_ecoff_bfd_merge_sections bfd_generic_merge_sections - -#define _bfd_ecoff_bfd_is_group_section bfd_generic_is_group_section -#define _bfd_ecoff_bfd_discard_group bfd_generic_discard_group -#define _bfd_ecoff_section_already_linked \ - _bfd_coff_section_already_linked -#define _bfd_ecoff_bfd_define_common_symbol bfd_generic_define_common_symbol -#define _bfd_ecoff_bfd_define_start_stop bfd_generic_define_start_stop -#define _bfd_ecoff_set_reloc _bfd_generic_set_reloc - -extern const bfd_target mips_ecoff_be_vec; - -const bfd_target mips_ecoff_le_vec = -{ - "ecoff-littlemips", /* name */ - bfd_target_ecoff_flavour, - BFD_ENDIAN_LITTLE, /* data byte order is little */ - BFD_ENDIAN_LITTLE, /* header byte order is little */ - - (HAS_RELOC | EXEC_P /* object flags */ - | HAS_LINENO | HAS_DEBUG - | HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA), - 0, /* leading underscore */ - ' ', /* ar_pad_char */ - 15, /* ar_max_namelen */ - 0, /* match priority. */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */ - - { /* bfd_check_format */ - _bfd_dummy_target, - coff_object_p, - bfd_generic_archive_p, - _bfd_dummy_target - }, - { /* bfd_set_format */ - _bfd_bool_bfd_false_error, - _bfd_ecoff_mkobject, - _bfd_generic_mkarchive, - _bfd_bool_bfd_false_error - }, - { /* bfd_write_contents */ - _bfd_bool_bfd_false_error, - _bfd_ecoff_write_object_contents, - _bfd_write_archive_contents, - _bfd_bool_bfd_false_error - }, - - BFD_JUMP_TABLE_GENERIC (_bfd_ecoff), - BFD_JUMP_TABLE_COPY (_bfd_ecoff), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_ecoff), - BFD_JUMP_TABLE_SYMBOLS (_bfd_ecoff), - BFD_JUMP_TABLE_RELOCS (_bfd_ecoff), - BFD_JUMP_TABLE_WRITE (_bfd_ecoff), - BFD_JUMP_TABLE_LINK (_bfd_ecoff), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - &mips_ecoff_be_vec, - - &mips_ecoff_backend_data -}; - -const bfd_target mips_ecoff_be_vec = -{ - "ecoff-bigmips", /* name */ - bfd_target_ecoff_flavour, - BFD_ENDIAN_BIG, /* data byte order is big */ - BFD_ENDIAN_BIG, /* header byte order is big */ - - (HAS_RELOC | EXEC_P /* object flags */ - | HAS_LINENO | HAS_DEBUG - | HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA), - 0, /* leading underscore */ - ' ', /* ar_pad_char */ - 15, /* ar_max_namelen */ - 0, /* match priority. */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, - - { /* bfd_check_format */ - _bfd_dummy_target, - coff_object_p, - bfd_generic_archive_p, - _bfd_dummy_target - }, - { /* bfd_set_format */ - _bfd_bool_bfd_false_error, - _bfd_ecoff_mkobject, - _bfd_generic_mkarchive, - _bfd_bool_bfd_false_error - }, - { /* bfd_write_contents */ - _bfd_bool_bfd_false_error, - _bfd_ecoff_write_object_contents, - _bfd_write_archive_contents, - _bfd_bool_bfd_false_error - }, - - BFD_JUMP_TABLE_GENERIC (_bfd_ecoff), - BFD_JUMP_TABLE_COPY (_bfd_ecoff), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_ecoff), - BFD_JUMP_TABLE_SYMBOLS (_bfd_ecoff), - BFD_JUMP_TABLE_RELOCS (_bfd_ecoff), - BFD_JUMP_TABLE_WRITE (_bfd_ecoff), - BFD_JUMP_TABLE_LINK (_bfd_ecoff), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - &mips_ecoff_le_vec, - - &mips_ecoff_backend_data -}; - -const bfd_target mips_ecoff_bele_vec = -{ - "ecoff-biglittlemips", /* name */ - bfd_target_ecoff_flavour, - BFD_ENDIAN_LITTLE, /* data byte order is little */ - BFD_ENDIAN_BIG, /* header byte order is big */ - - (HAS_RELOC | EXEC_P /* object flags */ - | HAS_LINENO | HAS_DEBUG - | HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA), - 0, /* leading underscore */ - ' ', /* ar_pad_char */ - 15, /* ar_max_namelen */ - 0, /* match priority. */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ - - { /* bfd_check_format */ - _bfd_dummy_target, - coff_object_p, - bfd_generic_archive_p, - _bfd_dummy_target - }, - { /* bfd_set_format */ - _bfd_bool_bfd_false_error, - _bfd_ecoff_mkobject, - _bfd_generic_mkarchive, - _bfd_bool_bfd_false_error - }, - { /* bfd_write_contents */ - _bfd_bool_bfd_false_error, - _bfd_ecoff_write_object_contents, - _bfd_write_archive_contents, - _bfd_bool_bfd_false_error - }, - - BFD_JUMP_TABLE_GENERIC (_bfd_ecoff), - BFD_JUMP_TABLE_COPY (_bfd_ecoff), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_ecoff), - BFD_JUMP_TABLE_SYMBOLS (_bfd_ecoff), - BFD_JUMP_TABLE_RELOCS (_bfd_ecoff), - BFD_JUMP_TABLE_WRITE (_bfd_ecoff), - BFD_JUMP_TABLE_LINK (_bfd_ecoff), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - NULL, - - &mips_ecoff_backend_data -}; diff --git a/bfd/config.bfd b/bfd/config.bfd index 38bfdfda10..a662951eb6 100644 --- a/bfd/config.bfd +++ b/bfd/config.bfd @@ -53,17 +53,8 @@ case $targ in echo "*** Use or1k-*-elf or or1k-*-linux as the target instead" >&2 exit 1 ;; - mips*-*-irix5* | mips*-*-irix6*) - # Not obsolete - ;; arm*-*-aout | \ arm*-*-coff | \ - mips*-big-* | \ - mips*-dec-* | mips*el-*-ecoff* | \ - mips*-*-ecoff* | \ - mips*-sgi-* | mips*-*-bsd* | \ - mips*-*-lnews* | \ - mips*-*-sysv* | mips*-*-riscos* | \ powerpc-*-lynxos* | powerpc-*-windiss* | \ null) if test "x$enable_obsolete" != xyes; then @@ -76,7 +67,8 @@ case $targ in esac case $targ in - *-*-netbsdelf* | i[3-7]86-*-netbsd*-gnu* | i[3-7]86-*-knetbsd*-gnu) + *-*-netbsdelf* | i[3-7]86-*-netbsd*-gnu* | i[3-7]86-*-knetbsd*-gnu | \ + mips*-*-irix5* | mips*-*-irix6*) # Not obsolete ;; *-adobe-* | \ @@ -133,6 +125,16 @@ case $targ in m68*-netx-* | \ m88*-*-* | \ maxq-*-coff | \ + mips*-*-bsd* | \ + mips*-*-ecoff* | \ + mips*-*-lnews* | \ + mips*-*-mach3* | \ + mips*-*-pe* | \ + mips*-*-riscos* | \ + mips*-*-sysv* | \ + mips*-big-* | \ + mips*-dec-* | \ + mips*-sgi-* | \ mips*el-*-rtems* | \ sh*-*-symbianelf* | sh5*-*-* | sh64*-*-* | \ sparc*-*-*aout* | \ @@ -207,26 +209,8 @@ esac # Make sure that the left side always has two dashes. Otherwise you # can get spurious matches. Even for unambiguous cases, do this as a # convention, else the table becomes a real mess to understand and maintain. -# -# Keep obsolete entries above the START comment, to keep them out of -# targmatch.h. case "${targ}" in - mips*-dec-bsd*) - echo "This target is obsolete and has been removed." - exit 1 - ;; - - mips*-*-mach3*) - echo "This target is obsolete and has been removed." - exit 1 - ;; - - mips*-*-pe*) - echo "This target is obsolete and has been removed." - exit 1 - ;; - plugin) targ_defvec=plugin_vec targ_selvecs="plugin_vec" @@ -876,28 +860,16 @@ case "${targ}" in targ_selvecs=microblaze_elf32_le_vec ;; - mips*-big-*) - targ_defvec=mips_ecoff_be_vec - targ_selvecs=mips_ecoff_le_vec - ;; #ifdef BFD64 mips*el-*-netbsd*) targ_defvec=mips_elf32_trad_le_vec - targ_selvecs="mips_elf32_trad_be_vec mips_elf64_trad_be_vec mips_elf64_trad_le_vec mips_ecoff_le_vec mips_ecoff_be_vec" + targ_selvecs="mips_elf32_trad_be_vec mips_elf64_trad_be_vec mips_elf64_trad_le_vec" ;; mips*-*-netbsd*) targ_defvec=mips_elf32_trad_be_vec - targ_selvecs="mips_elf32_trad_le_vec mips_elf64_trad_be_vec mips_elf64_trad_le_vec mips_ecoff_be_vec mips_ecoff_le_vec" + targ_selvecs="mips_elf32_trad_le_vec mips_elf64_trad_be_vec mips_elf64_trad_le_vec" ;; #endif - mips*-dec-* | mips*el-*-ecoff*) - targ_defvec=mips_ecoff_le_vec - targ_selvecs=mips_ecoff_be_vec - ;; - mips*-*-ecoff*) - targ_defvec=mips_ecoff_be_vec - targ_selvecs=mips_ecoff_le_vec - ;; #ifdef BFD64 mips*-*-irix6*) targ_defvec=mips_elf32_n_be_vec @@ -913,27 +885,9 @@ case "${targ}" in ;; mips*-*-irix5*) targ_defvec=mips_elf32_be_vec - targ_selvecs="mips_elf32_le_vec mips_ecoff_be_vec mips_ecoff_le_vec" - ;; -#endif - mips*-sgi-* | mips*-*-bsd*) - targ_defvec=mips_ecoff_be_vec - targ_selvecs=mips_ecoff_le_vec - ;; - mips*-*-lnews*) - targ_defvec=mips_ecoff_bele_vec - targ_selvecs="mips_ecoff_le_vec mips_ecoff_be_vec" - ;; -#ifdef BFD64 - mips*-*-sysv4*) - targ_defvec=mips_elf32_trad_be_vec - targ_selvecs="mips_elf32_trad_le_vec mips_ecoff_be_vec mips_ecoff_le_vec" + targ_selvecs="mips_elf32_le_vec" ;; #endif - mips*-*-sysv* | mips*-*-riscos*) - targ_defvec=mips_ecoff_be_vec - targ_selvecs=mips_ecoff_le_vec - ;; #ifdef BFD64 mips*el-*-vxworks*) targ_defvec=mips_elf32_vxworks_le_vec @@ -965,11 +919,11 @@ case "${targ}" in ;; mips*el-*-openbsd*) targ_defvec=mips_elf32_le_vec - targ_selvecs="mips_elf32_be_vec mips_elf64_be_vec mips_elf64_le_vec mips_ecoff_le_vec mips_ecoff_be_vec" + targ_selvecs="mips_elf32_be_vec mips_elf64_be_vec mips_elf64_le_vec" ;; mips*-*-openbsd*) targ_defvec=mips_elf32_be_vec - targ_selvecs="mips_elf32_le_vec mips_elf64_be_vec mips_elf64_le_vec mips_ecoff_be_vec mips_ecoff_le_vec" + targ_selvecs="mips_elf32_le_vec mips_elf64_be_vec mips_elf64_le_vec" ;; mips64*el-*-linux*) targ_defvec=mips_elf32_ntrad_le_vec @@ -981,11 +935,11 @@ case "${targ}" in ;; mips*el-*-linux*) targ_defvec=mips_elf32_trad_le_vec - targ_selvecs="mips_elf32_trad_be_vec mips_ecoff_le_vec mips_ecoff_be_vec mips_elf32_ntrad_le_vec mips_elf64_trad_le_vec mips_elf32_ntrad_be_vec mips_elf64_trad_be_vec" + targ_selvecs="mips_elf32_trad_be_vec mips_elf32_ntrad_le_vec mips_elf64_trad_le_vec mips_elf32_ntrad_be_vec mips_elf64_trad_be_vec" ;; mips*-*-linux*) targ_defvec=mips_elf32_trad_be_vec - targ_selvecs="mips_elf32_trad_le_vec mips_ecoff_be_vec mips_ecoff_le_vec mips_elf32_ntrad_be_vec mips_elf64_trad_be_vec mips_elf32_ntrad_le_vec mips_elf64_trad_le_vec" + targ_selvecs="mips_elf32_trad_le_vec mips_elf32_ntrad_be_vec mips_elf64_trad_be_vec mips_elf32_ntrad_le_vec mips_elf64_trad_le_vec" ;; mips64*el-*-freebsd* | mips64*el-*-kfreebsd*-gnu) # FreeBSD vectors diff --git a/bfd/configure b/bfd/configure index ecfbff1765..127f944167 100755 --- a/bfd/configure +++ b/bfd/configure @@ -14450,9 +14450,6 @@ do metag_elf32_vec) tb="$tb elf32-metag.lo elf32.lo $elf" ;; microblaze_elf32_vec) tb="$tb elf32-microblaze.lo elf32.lo $elf" ;; microblaze_elf32_le_vec) tb="$tb elf32-microblaze.lo elf32.lo $elf" ;; - mips_ecoff_be_vec) tb="$tb coff-mips.lo ecoff.lo $ecoff" ;; - mips_ecoff_le_vec) tb="$tb coff-mips.lo ecoff.lo $ecoff" ;; - mips_ecoff_bele_vec) tb="$tb coff-mips.lo ecoff.lo $ecoff" ;; mips_elf32_be_vec) tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff" ;; mips_elf32_le_vec) tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff" ;; mips_elf32_n_be_vec) tb="$tb elfn32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;; @@ -14473,8 +14470,6 @@ do mips_elf64_trad_le_vec) tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;; mips_elf64_tradfbsd_be_vec) tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;; mips_elf64_tradfbsd_le_vec) tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;; - mips_pe_le_vec) tb="$tb pe-mips.lo peigen.lo $coff" ;; - mips_pei_le_vec) tb="$tb pei-mips.lo peigen.lo $coff" ;; mmix_elf64_vec) tb="$tb elf64-mmix.lo elf64.lo $elf" target_size=64 ;; mmix_mmo_vec) tb="$tb mmo.lo" target_size=64 ;; mn10200_elf32_vec) tb="$tb elf-m10200.lo elf32.lo $elf" ;; @@ -14822,18 +14817,9 @@ if test "${target}" = "${host}"; then mips-*-netbsd* | mips*-*-openbsd*) COREFILE=netbsd-core.lo ;; - mips-dec-*) - COREFILE=trad-core.lo - TRAD_HEADER='"hosts/decstation.h"' - ;; mips-sgi-irix4*) COREFILE=irix-core.lo ;; mips-sgi-irix5*) COREFILE=irix-core.lo ;; mips-sgi-irix6*) COREFILE=irix-core.lo ;; - mips-*-sysv4*) ;; - mips-*-sysv* | mips-*-riscos*) - COREFILE=trad-core.lo - TRAD_HEADER='"hosts/riscos.h"' - ;; m68*-*-linux-*) COREFILE=trad-core.lo TRAD_HEADER='"hosts/m68klinux.h"' diff --git a/bfd/configure.ac b/bfd/configure.ac index 38f568ecaa..9c822f1b7e 100644 --- a/bfd/configure.ac +++ b/bfd/configure.ac @@ -527,9 +527,6 @@ do metag_elf32_vec) tb="$tb elf32-metag.lo elf32.lo $elf" ;; microblaze_elf32_vec) tb="$tb elf32-microblaze.lo elf32.lo $elf" ;; microblaze_elf32_le_vec) tb="$tb elf32-microblaze.lo elf32.lo $elf" ;; - mips_ecoff_be_vec) tb="$tb coff-mips.lo ecoff.lo $ecoff" ;; - mips_ecoff_le_vec) tb="$tb coff-mips.lo ecoff.lo $ecoff" ;; - mips_ecoff_bele_vec) tb="$tb coff-mips.lo ecoff.lo $ecoff" ;; mips_elf32_be_vec) tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff" ;; mips_elf32_le_vec) tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff" ;; mips_elf32_n_be_vec) tb="$tb elfn32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;; @@ -550,8 +547,6 @@ do mips_elf64_trad_le_vec) tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;; mips_elf64_tradfbsd_be_vec) tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;; mips_elf64_tradfbsd_le_vec) tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;; - mips_pe_le_vec) tb="$tb pe-mips.lo peigen.lo $coff" ;; - mips_pei_le_vec) tb="$tb pei-mips.lo peigen.lo $coff" ;; mmix_elf64_vec) tb="$tb elf64-mmix.lo elf64.lo $elf" target_size=64 ;; mmix_mmo_vec) tb="$tb mmo.lo" target_size=64 ;; mn10200_elf32_vec) tb="$tb elf-m10200.lo elf32.lo $elf" ;; @@ -908,18 +903,9 @@ changequote([,])dnl mips-*-netbsd* | mips*-*-openbsd*) COREFILE=netbsd-core.lo ;; - mips-dec-*) - COREFILE=trad-core.lo - TRAD_HEADER='"hosts/decstation.h"' - ;; mips-sgi-irix4*) COREFILE=irix-core.lo ;; mips-sgi-irix5*) COREFILE=irix-core.lo ;; mips-sgi-irix6*) COREFILE=irix-core.lo ;; - mips-*-sysv4*) ;; - mips-*-sysv* | mips-*-riscos*) - COREFILE=trad-core.lo - TRAD_HEADER='"hosts/riscos.h"' - ;; m68*-*-linux-*) COREFILE=trad-core.lo TRAD_HEADER='"hosts/m68klinux.h"' diff --git a/bfd/mipsbsd.c b/bfd/mipsbsd.c deleted file mode 100644 index 1dc287abd0..0000000000 --- a/bfd/mipsbsd.c +++ /dev/null @@ -1,511 +0,0 @@ -/* BFD backend for MIPS BSD (a.out) binaries. - Copyright (C) 1993-2018 Free Software Foundation, Inc. - Written by Ralph Campbell. - - This file is part of BFD, the Binary File Descriptor library. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, - MA 02110-1301, USA. */ - - -/* #define ENTRY_CAN_BE_ZERO */ -#define N_HEADER_IN_TEXT(x) 1 -#define N_TXTADDR(x) \ - (N_MAGIC(x) != ZMAGIC ? (x)->a_entry : /* object file or NMAGIC */\ - TEXT_START_ADDR + EXEC_BYTES_SIZE /* no padding */\ - ) -#define N_DATADDR(x) (N_TXTADDR(x)+N_TXTSIZE(x)) -#define TEXT_START_ADDR 4096 -#define TARGET_PAGE_SIZE 4096 -#define SEGMENT_SIZE TARGET_PAGE_SIZE -#define DEFAULT_ARCH bfd_arch_mips -#define MACHTYPE_OK(mtype) ((mtype) == M_UNKNOWN \ - || (mtype) == M_MIPS1 || (mtype) == M_MIPS2) -#define MY_symbol_leading_char '\0' - -/* Do not "beautify" the CONCAT* macro args. Traditional C will not - remove whitespace added here, and thus will fail to concatenate - the tokens. */ -#define MY(OP) CONCAT2 (mipsbsd_,OP) - -#include "sysdep.h" -#include "bfd.h" -#include "libbfd.h" -#include "libaout.h" - -#define SET_ARCH_MACH(ABFD, EXECP) \ - MY(set_arch_mach) (ABFD, N_MACHTYPE (EXECP)); \ - MY(choose_reloc_size) (ABFD); -static void MY(set_arch_mach) (bfd *, unsigned long); -static void MY(choose_reloc_size) (bfd *); - -#define MY_write_object_contents MY(write_object_contents) -static bfd_boolean MY(write_object_contents) (bfd *); - -/* We can't use MY(x) here because it leads to a recursive call to CONCAT2 - when expanded inside JUMP_TABLE. */ -#define MY_bfd_reloc_type_lookup mipsbsd_reloc_type_lookup -#define MY_bfd_reloc_name_lookup mipsbsd_reloc_name_lookup -#define MY_canonicalize_reloc mipsbsd_canonicalize_reloc - -#define MY_bfd_link_hash_table_create _bfd_generic_link_hash_table_create -#define MY_bfd_link_add_symbols _bfd_generic_link_add_symbols -#define MY_final_link_callback unused -#define MY_bfd_final_link _bfd_generic_final_link - -#define MY_backend_data &MY(backend_data) -#define MY_BFD_TARGET - -#include "aout-target.h" - -static bfd_reloc_status_type mips_fix_jmp_addr - (bfd *, arelent *, struct bfd_symbol *, void *, asection *, - bfd *, char **); - -long MY(canonicalize_reloc) (bfd *, sec_ptr, arelent **, asymbol **); - -static void -MY(set_arch_mach) (bfd *abfd, unsigned long machtype) -{ - enum bfd_architecture arch; - unsigned int machine; - - /* Determine the architecture and machine type of the object file. */ - switch (machtype) - { - case M_MIPS1: - arch = bfd_arch_mips; - machine = bfd_mach_mips3000; - break; - - case M_MIPS2: - arch = bfd_arch_mips; - machine = bfd_mach_mips4000; - break; - - default: - arch = bfd_arch_obscure; - machine = 0; - break; - } - - bfd_set_arch_mach (abfd, arch, machine); -} - -/* Determine the size of a relocation entry, based on the architecture */ -static void -MY (choose_reloc_size) (bfd *abfd) -{ - switch (bfd_get_arch (abfd)) - { - case bfd_arch_sparc: - case bfd_arch_mips: - obj_reloc_entry_size (abfd) = RELOC_EXT_SIZE; - break; - default: - obj_reloc_entry_size (abfd) = RELOC_STD_SIZE; - break; - } -} - -/* Write an object file in BSD a.out format. - Section contents have already been written. We write the - file header, symbols, and relocation. */ - -static bfd_boolean -MY (write_object_contents) (bfd *abfd) -{ - struct external_exec exec_bytes; - struct internal_exec *execp = exec_hdr (abfd); - - /* Magic number, maestro, please! */ - switch (bfd_get_arch (abfd)) - { - case bfd_arch_m68k: - switch (bfd_get_mach (abfd)) - { - case bfd_mach_m68010: - N_SET_MACHTYPE (execp, M_68010); - break; - default: - case bfd_mach_m68020: - N_SET_MACHTYPE (execp, M_68020); - break; - } - break; - case bfd_arch_sparc: - N_SET_MACHTYPE (execp, M_SPARC); - break; - case bfd_arch_i386: - N_SET_MACHTYPE (execp, M_386); - break; - case bfd_arch_mips: - switch (bfd_get_mach (abfd)) - { - case bfd_mach_mips4000: - case bfd_mach_mips6000: - N_SET_MACHTYPE (execp, M_MIPS2); - break; - default: - N_SET_MACHTYPE (execp, M_MIPS1); - break; - } - break; - default: - N_SET_MACHTYPE (execp, M_UNKNOWN); - } - - MY (choose_reloc_size) (abfd); - - WRITE_HEADERS (abfd, execp); - - return TRUE; -} - -/* MIPS relocation types. */ -#define MIPS_RELOC_32 0 -#define MIPS_RELOC_JMP 1 -#define MIPS_RELOC_WDISP16 2 -#define MIPS_RELOC_HI16 3 -#define MIPS_RELOC_HI16_S 4 -#define MIPS_RELOC_LO16 5 - -/* This is only called when performing a BFD_RELOC_MIPS_JMP relocation. - The jump destination address is formed from the upper 4 bits of the - "current" program counter concatenated with the jump instruction's - 26 bit field and two trailing zeros. - If the destination address is not in the same segment as the "current" - program counter, then we need to signal an error. */ - -static bfd_reloc_status_type -mips_fix_jmp_addr (bfd *abfd ATTRIBUTE_UNUSED, - arelent *reloc_entry, - struct bfd_symbol *symbol, - void * data ATTRIBUTE_UNUSED, - asection *input_section, - bfd *output_bfd, - char **error_message ATTRIBUTE_UNUSED) -{ - bfd_vma relocation, pc; - - /* If this is a partial relocation, just continue. */ - if (output_bfd != (bfd *) NULL) - return bfd_reloc_continue; - - /* If this is an undefined symbol, return error */ - if (bfd_is_und_section (symbol->section) - && (symbol->flags & BSF_WEAK) == 0) - return bfd_reloc_undefined; - - /* Work out which section the relocation is targeted at and the - initial relocation command value. */ - if (bfd_is_com_section (symbol->section)) - relocation = 0; - else - relocation = symbol->value; - - relocation += symbol->section->output_section->vma; - relocation += symbol->section->output_offset; - relocation += reloc_entry->addend; - - pc = input_section->output_section->vma + input_section->output_offset + - reloc_entry->address + 4; - - if ((relocation & 0xF0000000) != (pc & 0xF0000000)) - return bfd_reloc_overflow; - - return bfd_reloc_continue; -} - -/* This is only called when performing a BFD_RELOC_HI16_S relocation. - We need to see if bit 15 is set in the result. If it is, we add - 0x10000 and continue normally. This will compensate for the sign extension - when the low bits are added at run time. */ - -static bfd_reloc_status_type -mips_fix_hi16_s (bfd *abfd ATTRIBUTE_UNUSED, - arelent *reloc_entry, - asymbol *symbol, - void * data ATTRIBUTE_UNUSED, - asection *input_section ATTRIBUTE_UNUSED, - bfd *output_bfd, - char **error_message ATTRIBUTE_UNUSED) -{ - bfd_vma relocation; - - /* If this is a partial relocation, just continue. */ - if (output_bfd != (bfd *)NULL) - return bfd_reloc_continue; - - /* If this is an undefined symbol, return error. */ - if (bfd_is_und_section (symbol->section) - && (symbol->flags & BSF_WEAK) == 0) - return bfd_reloc_undefined; - - /* Work out which section the relocation is targeted at and the - initial relocation command value. */ - if (bfd_is_com_section (symbol->section)) - relocation = 0; - else - relocation = symbol->value; - - relocation += symbol->section->output_section->vma; - relocation += symbol->section->output_offset; - relocation += reloc_entry->addend; - - if (relocation & 0x8000) - reloc_entry->addend += 0x10000; - - return bfd_reloc_continue; -} - -static reloc_howto_type mips_howto_table_ext[] = -{ - {MIPS_RELOC_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 0, - "32", FALSE, 0, 0xffffffff, FALSE}, - {MIPS_RELOC_JMP, 2, 2, 26, FALSE, 0, complain_overflow_dont, - mips_fix_jmp_addr, - "MIPS_JMP", FALSE, 0, 0x03ffffff, FALSE}, - {MIPS_RELOC_WDISP16, 2, 2, 16, TRUE, 0, complain_overflow_signed, 0, - "WDISP16", FALSE, 0, 0x0000ffff, FALSE}, - {MIPS_RELOC_HI16, 16, 2, 16, FALSE, 0, complain_overflow_bitfield, 0, - "HI16", FALSE, 0, 0x0000ffff, FALSE}, - {MIPS_RELOC_HI16_S, 16, 2, 16, FALSE, 0, complain_overflow_bitfield, - mips_fix_hi16_s, - "HI16_S", FALSE, 0, 0x0000ffff, FALSE}, - {MIPS_RELOC_LO16, 0, 2, 16, FALSE, 0, complain_overflow_dont, 0, - "LO16", FALSE, 0, 0x0000ffff, FALSE}, -}; - -static reloc_howto_type * -MY(reloc_type_lookup) (bfd *abfd, bfd_reloc_code_real_type code) -{ - if (bfd_get_arch (abfd) != bfd_arch_mips) - return NULL; - - switch (code) - { - case BFD_RELOC_CTOR: - case BFD_RELOC_32: - return (&mips_howto_table_ext[MIPS_RELOC_32]); - case BFD_RELOC_MIPS_JMP: - return (&mips_howto_table_ext[MIPS_RELOC_JMP]); - case BFD_RELOC_16_PCREL_S2: - return (&mips_howto_table_ext[MIPS_RELOC_WDISP16]); - case BFD_RELOC_HI16: - return (&mips_howto_table_ext[MIPS_RELOC_HI16]); - case BFD_RELOC_HI16_S: - return (&mips_howto_table_ext[MIPS_RELOC_HI16_S]); - case BFD_RELOC_LO16: - return (&mips_howto_table_ext[MIPS_RELOC_LO16]); - default: - return NULL; - } -} - -static reloc_howto_type * -MY(reloc_name_lookup) (bfd *abfd ATTRIBUTE_UNUSED, - const char *r_name) -{ - unsigned int i; - - for (i = 0; - i < sizeof (mips_howto_table_ext) / sizeof (mips_howto_table_ext[0]); - i++) - if (mips_howto_table_ext[i].name != NULL - && strcasecmp (mips_howto_table_ext[i].name, r_name) == 0) - return &mips_howto_table_ext[i]; - - return NULL; -} - -/* This is just like the standard aoutx.h version but we need to do our - own mapping of external reloc type values to howto entries. */ -long -MY(canonicalize_reloc) (bfd *abfd, - sec_ptr section, - arelent **relptr, - asymbol **symbols) -{ - arelent *tblptr = section->relocation; - unsigned int count, c; - extern reloc_howto_type NAME(aout,ext_howto_table)[]; - - /* If we have already read in the relocation table, return the values. */ - if (section->flags & SEC_CONSTRUCTOR) - { - arelent_chain *chain = section->constructor_chain; - - for (count = 0; count < section->reloc_count; count++) - { - *relptr++ = &chain->relent; - chain = chain->next; - } - *relptr = 0; - return section->reloc_count; - } - - if (tblptr && section->reloc_count) - { - for (count = 0; count++ < section->reloc_count;) - *relptr++ = tblptr++; - *relptr = 0; - return section->reloc_count; - } - - if (!NAME(aout,slurp_reloc_table) (abfd, section, symbols)) - return -1; - tblptr = section->relocation; - - /* fix up howto entries. */ - for (count = 0; count++ < section->reloc_count;) - { - c = tblptr->howto - NAME(aout,ext_howto_table); - tblptr->howto = &mips_howto_table_ext[c]; - - *relptr++ = tblptr++; - } - *relptr = 0; - return section->reloc_count; -} - -static const struct aout_backend_data MY(backend_data) = -{ - 0, /* zmagic contiguous */ - 1, /* text incl header */ - 0, /* entry is text address */ - 0, /* exec_hdr_flags */ - TARGET_PAGE_SIZE, /* text vma */ - MY_set_sizes, - 0, /* text size includes exec header */ - 0, /* add_dynamic_symbols */ - 0, /* add_one_symbol */ - 0, /* link_dynamic_object */ - 0, /* write_dynamic_symbol */ - 0, /* check_dynamic_reloc */ - 0 /* finish_dynamic_link */ -}; - -extern const bfd_target mips_aout_be_vec; - -const bfd_target mips_aout_le_vec = - { - "a.out-mips-little", /* name */ - bfd_target_aout_flavour, - BFD_ENDIAN_LITTLE, /* target byte order (little) */ - BFD_ENDIAN_LITTLE, /* target headers byte order (little) */ - (HAS_RELOC | EXEC_P /* object flags */ - | HAS_LINENO | HAS_DEBUG - | HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA), - MY_symbol_leading_char, - ' ', /* ar_pad_char */ - 15, /* ar_max_namelen */ - 0, /* match priority. */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */ - - { /* bfd_check_format */ - _bfd_dummy_target, - MY_object_p, - bfd_generic_archive_p, - MY_core_file_p - }, - { /* bfd_set_format */ - _bfd_bool_bfd_false_error, - MY_mkobject, - _bfd_generic_mkarchive, - _bfd_bool_bfd_false_error - }, - { /* bfd_write_contents */ - _bfd_bool_bfd_false_error, - MY_write_object_contents, - _bfd_write_archive_contents, - _bfd_bool_bfd_false_error - }, - - BFD_JUMP_TABLE_GENERIC (MY), - BFD_JUMP_TABLE_COPY (MY), - BFD_JUMP_TABLE_CORE (MY), - BFD_JUMP_TABLE_ARCHIVE (MY), - BFD_JUMP_TABLE_SYMBOLS (MY), - BFD_JUMP_TABLE_RELOCS (MY), - BFD_JUMP_TABLE_WRITE (MY), - BFD_JUMP_TABLE_LINK (MY), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - &mips_aout_be_vec, - - MY_backend_data - }; - -const bfd_target mips_aout_be_vec = - { - "a.out-mips-big", /* name */ - bfd_target_aout_flavour, - BFD_ENDIAN_BIG, /* target byte order (big) */ - BFD_ENDIAN_BIG, /* target headers byte order (big) */ - (HAS_RELOC | EXEC_P /* object flags */ - | HAS_LINENO | HAS_DEBUG - | HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA), - MY_symbol_leading_char, - ' ', /* ar_pad_char */ - 15, /* ar_max_namelen */ - 0, /* match priority. */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ - - { /* bfd_check_format */ - _bfd_dummy_target, - MY_object_p, - bfd_generic_archive_p, - MY_core_file_p - }, - { /* bfd_set_format */ - _bfd_bool_bfd_false_error, - MY_mkobject, - _bfd_generic_mkarchive, - _bfd_bool_bfd_false_error - }, - { /* bfd_write_contents */ - _bfd_bool_bfd_false_error, - MY_write_object_contents, - _bfd_write_archive_contents, - _bfd_bool_bfd_false_error - }, - - BFD_JUMP_TABLE_GENERIC (MY), - BFD_JUMP_TABLE_COPY (MY), - BFD_JUMP_TABLE_CORE (MY), - BFD_JUMP_TABLE_ARCHIVE (MY), - BFD_JUMP_TABLE_SYMBOLS (MY), - BFD_JUMP_TABLE_RELOCS (MY), - BFD_JUMP_TABLE_WRITE (MY), - BFD_JUMP_TABLE_LINK (MY), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - &mips_aout_le_vec, - - MY_backend_data - }; diff --git a/bfd/pe-mips.c b/bfd/pe-mips.c deleted file mode 100644 index 1a617a1583..0000000000 --- a/bfd/pe-mips.c +++ /dev/null @@ -1,936 +0,0 @@ -/* BFD back-end for MIPS PE COFF files. - Copyright (C) 1990-2018 Free Software Foundation, Inc. - Modified from coff-i386.c by DJ Delorie, dj@cygnus.com - - This file is part of BFD, the Binary File Descriptor library. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, - MA 02110-1301, USA. */ - -#define COFF_WITH_PE -/* pei-mips.c may have defined this to default off (0) before - including this file, so don't redefine if that's the case. - Otherwise we're generating objects, not executable images, - so we want to define it to default on. */ -#ifndef COFF_LONG_SECTION_NAMES -#define COFF_LONG_SECTION_NAMES -#endif /* COFF_LONG_SECTION_NAMES */ -#define PCRELOFFSET TRUE - -#include "sysdep.h" -#include "bfd.h" -#include "libbfd.h" -#include "coff/mipspe.h" -#include "coff/internal.h" -#include "coff/pe.h" -#include "libcoff.h" - -#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER 2 -/* The page size is a guess based on ELF. */ - -#define COFF_PAGE_SIZE 0x1000 - -/* For some reason when using mips COFF the value stored in the .text - section for a reference to a common symbol is the value itself plus - any desired offset. Ian Taylor, Cygnus Support. */ - -/* If we are producing relocatable output, we need to do some - adjustments to the object file that are not done by the - bfd_perform_relocation function. This function is called by every - reloc type to make any required adjustments. */ - -static bfd_reloc_status_type -coff_mips_reloc (bfd *abfd, - arelent *reloc_entry, - asymbol *symbol, - void * data, - asection *input_section ATTRIBUTE_UNUSED, - bfd *output_bfd, - char **error_message ATTRIBUTE_UNUSED) -{ - symvalue diff; - - if (output_bfd == NULL) - return bfd_reloc_continue; - - if (bfd_is_com_section (symbol->section)) - { -#ifndef COFF_WITH_PE - /* We are relocating a common symbol. The current value in the - object file is ORIG + OFFSET, where ORIG is the value of the - common symbol as seen by the object file when it was compiled - (this may be zero if the symbol was undefined) and OFFSET is - the offset into the common symbol (normally zero, but may be - non-zero when referring to a field in a common structure). - ORIG is the negative of reloc_entry->addend, which is set by - the CALC_ADDEND macro below. We want to replace the value in - the object file with NEW + OFFSET, where NEW is the value of - the common symbol which we are going to put in the final - object file. NEW is symbol->value. */ - diff = symbol->value + reloc_entry->addend; -#else - /* In PE mode, we do not offset the common symbol. */ - diff = reloc_entry->addend; -#endif - } - else - /* For some reason bfd_perform_relocation always effectively - ignores the addend for a COFF target when producing - relocatable output. This seems to be always wrong for 386 - COFF, so we handle the addend here instead. */ - diff = reloc_entry->addend; - -#define DOIT(x) \ - x = ((x & ~howto->dst_mask) | (((x & howto->src_mask) + (diff >> howto->rightshift)) & howto->dst_mask)) - - if (diff != 0) - { - reloc_howto_type *howto = reloc_entry->howto; - unsigned char *addr = (unsigned char *) data + reloc_entry->address; - - switch (howto->size) - { - case 0: - { - char x = bfd_get_8 (abfd, addr); - - DOIT (x); - bfd_put_8 (abfd, x, addr); - } - break; - - case 1: - { - short x = bfd_get_16 (abfd, addr); - - DOIT (x); - bfd_put_16 (abfd, (bfd_vma) x, addr); - } - break; - - case 2: - { - long x = bfd_get_32 (abfd, addr); - - DOIT (x); - bfd_put_32 (abfd, (bfd_vma) x, addr); - } - break; - - default: - abort (); - } - } - - /* Now let bfd_perform_relocation finish everything up. */ - return bfd_reloc_continue; -} - -#ifdef COFF_WITH_PE -/* Return TRUE if this relocation should - appear in the output .reloc section. */ - -static bfd_boolean -in_reloc_p (bfd * abfd ATTRIBUTE_UNUSED, reloc_howto_type *howto) -{ - return ! howto->pc_relative && howto->type != MIPS_R_RVA; -} -#endif - -#ifndef PCRELOFFSET -#define PCRELOFFSET FALSE -#endif - -static reloc_howto_type howto_table[] = -{ - /* Reloc type 0 is ignored. The reloc reading code ensures that - this is a reference to the .abs section, which will cause - bfd_perform_relocation to do nothing. */ - HOWTO (MIPS_R_ABSOLUTE, /* Type. */ - 0, /* Rightshift. */ - 0, /* Size (0 = byte, 1 = short, 2 = long). */ - 8, /* Bitsize. */ - FALSE, /* PC_relative. */ - 0, /* Bitpos. */ - complain_overflow_dont, /* Complain_on_overflow. */ - 0, /* Special_function. */ - "IGNORE", /* Name. */ - FALSE, /* Partial_inplace. */ - 0, /* Src_mask. */ - 0, /* Dst_mask. */ - FALSE), /* Pcrel_offset. */ - - /* A 16 bit reference to a symbol, normally from a data section. */ - HOWTO (MIPS_R_REFHALF, /* Type. */ - 0, /* Rightshift. */ - 1, /* Size (0 = byte, 1 = short, 2 = long). */ - 16, /* Bitsize. */ - FALSE, /* PC_relative. */ - 0, /* Bitpos. */ - complain_overflow_bitfield, /* Complain_on_overflow. */ - coff_mips_reloc, /* Special_function. */ - "REFHALF", /* Name. */ - TRUE, /* Partial_inplace. */ - 0xffff, /* Src_mask. */ - 0xffff, /* Dst_mask. */ - FALSE), /* Pcrel_offset. */ - - /* A 32 bit reference to a symbol, normally from a data section. */ - HOWTO (MIPS_R_REFWORD, /* Type. */ - 0, /* Rightshift. */ - 2, /* Size (0 = byte, 1 = short, 2 = long). */ - 32, /* Bitsize. */ - FALSE, /* PC_relative. */ - 0, /* Bitpos. */ - complain_overflow_bitfield, /* Complain_on_overflow. */ - coff_mips_reloc, /* Special_function. */ - "REFWORD", /* Name. */ - TRUE, /* Partial_inplace. */ - 0xffffffff, /* Src_mask. */ - 0xffffffff, /* Dst_mask. */ - FALSE), /* Pcrel_offset. */ - - /* A 26 bit absolute jump address. */ - HOWTO (MIPS_R_JMPADDR, /* Type. */ - 2, /* Rightshift. */ - 2, /* Size (0 = byte, 1 = short, 2 = long). */ - 26, /* Bitsize. */ - FALSE, /* PC_relative. */ - 0, /* Bitpos. */ - complain_overflow_dont, /* Complain_on_overflow. */ - /* This needs complex overflow - detection, because the upper four - bits must match the PC. */ - coff_mips_reloc, /* Special_function. */ - "JMPADDR", /* Name. */ - TRUE, /* Partial_inplace. */ - 0x3ffffff, /* Src_mask. */ - 0x3ffffff, /* Dst_mask. */ - FALSE), /* Pcrel_offset. */ - - /* The high 16 bits of a symbol value. Handled by the function - mips_refhi_reloc. */ - HOWTO (MIPS_R_REFHI, /* Type. */ - 16, /* Rightshift. */ - 2, /* Size (0 = byte, 1 = short, 2 = long). */ - 16, /* Bitsize. */ - FALSE, /* PC_relative. */ - 0, /* Bitpos. */ - complain_overflow_bitfield, /* Complain_on_overflow. */ - coff_mips_reloc, /* Special_function. */ - "REFHI", /* Name. */ - TRUE, /* Partial_inplace. */ - 0xffff, /* Src_mask. */ - 0xffff, /* Dst_mask. */ - FALSE), /* Pcrel_offset. */ - - /* The low 16 bits of a symbol value. */ - HOWTO (MIPS_R_REFLO, /* Type. */ - 0, /* Rightshift. */ - 2, /* Size (0 = byte, 1 = short, 2 = long). */ - 16, /* Bitsize. */ - FALSE, /* PC_relative. */ - 0, /* Bitpos. */ - complain_overflow_dont, /* Complain_on_overflow. */ - coff_mips_reloc, /* Special_function. */ - "REFLO", /* Name. */ - TRUE, /* Partial_inplace. */ - 0xffff, /* Src_mask. */ - 0xffff, /* Dst_mask. */ - FALSE), /* Pcrel_offset. */ - - /* A reference to an offset from the gp register. Handled by the - function mips_gprel_reloc. */ - HOWTO (MIPS_R_GPREL, /* Type. */ - 0, /* Rightshift. */ - 2, /* Size (0 = byte, 1 = short, 2 = long). */ - 16, /* Bitsize. */ - FALSE, /* PC_relative. */ - 0, /* Bitpos. */ - complain_overflow_signed, /* Complain_on_overflow. */ - coff_mips_reloc, /* Special_function. */ - "GPREL", /* Name. */ - TRUE, /* Partial_inplace. */ - 0xffff, /* Src_mask. */ - 0xffff, /* Dst_mask. */ - FALSE), /* Pcrel_offset. */ - - /* A reference to a literal using an offset from the gp register. - Handled by the function mips_gprel_reloc. */ - HOWTO (MIPS_R_LITERAL, /* Type. */ - 0, /* Rightshift. */ - 2, /* Size (0 = byte, 1 = short, 2 = long). */ - 16, /* Bitsize. */ - FALSE, /* PC_relative. */ - 0, /* Bitpos. */ - complain_overflow_signed, /* Complain_on_overflow. */ - coff_mips_reloc, /* Special_function. */ - "LITERAL", /* Name. */ - TRUE, /* Partial_inplace. */ - 0xffff, /* Src_mask. */ - 0xffff, /* Dst_mask. */ - FALSE), /* Pcrel_offset. */ - - EMPTY_HOWTO (8), - EMPTY_HOWTO (9), - EMPTY_HOWTO (10), - EMPTY_HOWTO (11), - EMPTY_HOWTO (12), - EMPTY_HOWTO (13), - EMPTY_HOWTO (14), - EMPTY_HOWTO (15), - EMPTY_HOWTO (16), - EMPTY_HOWTO (17), - EMPTY_HOWTO (18), - EMPTY_HOWTO (19), - EMPTY_HOWTO (20), - EMPTY_HOWTO (21), - EMPTY_HOWTO (22), - EMPTY_HOWTO (23), - EMPTY_HOWTO (24), - EMPTY_HOWTO (25), - EMPTY_HOWTO (26), - EMPTY_HOWTO (27), - EMPTY_HOWTO (28), - EMPTY_HOWTO (29), - EMPTY_HOWTO (30), - EMPTY_HOWTO (31), - EMPTY_HOWTO (32), - EMPTY_HOWTO (33), - HOWTO (MIPS_R_RVA, /* Type. */ - 0, /* Rightshift. */ - 2, /* Size (0 = byte, 1 = short, 2 = long). */ - 32, /* Bitsize. */ - FALSE, /* PC_relative. */ - 0, /* Bitpos. */ - complain_overflow_bitfield, /* Complain_on_overflow. */ - coff_mips_reloc, /* Special_function. */ - "rva32", /* Name. */ - TRUE, /* Partial_inplace. */ - 0xffffffff, /* Src_mask. */ - 0xffffffff, /* Dst_mask. */ - FALSE), /* Pcrel_offset. */ - EMPTY_HOWTO (35), - EMPTY_HOWTO (36), - HOWTO (MIPS_R_PAIR, /* Type. */ - 0, /* Rightshift. */ - 2, /* Size (0 = byte, 1 = short, 2 = long). */ - 32, /* Bitsize. */ - FALSE, /* PC_relative. */ - 0, /* Bitpos. */ - complain_overflow_bitfield, /* Complain_on_overflow. */ - coff_mips_reloc, /* Special_function. */ - "PAIR", /* Name. */ - TRUE, /* Partial_inplace. */ - 0xffffffff, /* Src_mask. */ - 0xffffffff, /* Dst_mask. */ - FALSE), /* Pcrel_offset. */ -}; - -#define NUM_HOWTOS (sizeof (howto_table) / sizeof (howto_table[0])) - -/* Turn a howto into a reloc nunmber. */ - -#define SELECT_RELOC(x, howto) { x.r_type = howto->type; } -#define BADMAG(x) MIPSBADMAG (x) - -/* Customize coffcode.h. */ -#define MIPS 1 - -#define RTYPE2HOWTO(cache_ptr, dst) \ - ((cache_ptr)->howto = \ - ((dst)->r_type < NUM_HOWTOS \ - ? howto_table + (dst)->r_type \ - : NULL)) - -/* Compute the addend of a reloc. If the reloc is to a common symbol, - the object file contains the value of the common symbol. By the - time this is called, the linker may be using a different symbol - from a different object file with a different value. Therefore, we - hack wildly to locate the original symbol from this file so that we - can make the correct adjustment. This macro sets coffsym to the - symbol from the original file, and uses it to set the addend value - correctly. If this is not a common symbol, the usual addend - calculation is done, except that an additional tweak is needed for - PC relative relocs. - FIXME: This macro refers to symbols and asect; these are from the - calling function, not the macro arguments. */ - -#define CALC_ADDEND(abfd, ptr, reloc, cache_ptr) \ - { \ - coff_symbol_type *coffsym = NULL; \ - if (ptr && bfd_asymbol_bfd (ptr) != abfd) \ - coffsym = (obj_symbols (abfd) \ - + (cache_ptr->sym_ptr_ptr - symbols)); \ - else if (ptr) \ - coffsym = coff_symbol_from (ptr); \ - if (coffsym != NULL \ - && coffsym->native->u.syment.n_scnum == 0) \ - cache_ptr->addend = - coffsym->native->u.syment.n_value; \ - else if (ptr && bfd_asymbol_bfd (ptr) == abfd \ - && ptr->section != NULL) \ - cache_ptr->addend = - (ptr->section->vma + ptr->value); \ - else \ - cache_ptr->addend = 0; \ - if (ptr && reloc.r_type < NUM_HOWTOS \ - && howto_table[reloc.r_type].pc_relative) \ - cache_ptr->addend += asect->vma; \ - } - -/* Convert an rtype to howto for the COFF backend linker. */ - -static reloc_howto_type * -coff_mips_rtype_to_howto (bfd *abfd ATTRIBUTE_UNUSED, - asection *sec, - struct internal_reloc *rel, - struct coff_link_hash_entry *h, - struct internal_syment *sym, - bfd_vma *addendp) -{ - - reloc_howto_type *howto; - - howto = howto_table + rel->r_type; - -#ifdef COFF_WITH_PE - *addendp = 0; -#endif - - if (howto->pc_relative) - *addendp += sec->vma; - - if (sym != NULL && sym->n_scnum == 0 && sym->n_value != 0) - { - /* This is a common symbol. The section contents include the - size (sym->n_value) as an addend. The relocate_section - function will be adding in the final value of the symbol. We - need to subtract out the current size in order to get the - correct result. */ - - BFD_ASSERT (h != NULL); - -#ifndef COFF_WITH_PE - /* I think we *do* want to bypass this. If we don't, I have - seen some data parameters get the wrong relocation address. - If I link two versions with and without this section bypassed - and then do a binary comparison, the addresses which are - different can be looked up in the map. The case in which - this section has been bypassed has addresses which correspond - to values I can find in the map. */ - *addendp -= sym->n_value; -#endif - } - -#ifndef COFF_WITH_PE - /* If the output symbol is common (in which case this must be a - relocatable link), we need to add in the final size of the - common symbol. */ - if (h != NULL && h->root.type == bfd_link_hash_common) - *addendp += h->root.u.c.size; -#endif - -#ifdef COFF_WITH_PE - if (howto->pc_relative) - { - *addendp -= 4; - - /* If the symbol is defined, then the generic code is going to - add back the symbol value in order to cancel out an - adjustment it made to the addend. However, we set the addend - to 0 at the start of this function. We need to adjust here, - to avoid the adjustment the generic code will make. FIXME: - This is getting a bit hackish. */ - if (sym != NULL && sym->n_scnum != 0) - *addendp -= sym->n_value; - } - - if (rel->r_type == MIPS_R_RVA) - *addendp -= pe_data (sec->output_section->owner)->pe_opthdr.ImageBase; -#endif - - return howto; -} - -#define coff_rtype_to_howto coff_mips_rtype_to_howto -#define coff_bfd_reloc_type_lookup coff_mips_reloc_type_lookup -#define coff_bfd_reloc_name_lookup coff_mips_reloc_name_lookup - -/* Get the howto structure for a generic reloc type. */ - -static reloc_howto_type * -coff_mips_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, - bfd_reloc_code_real_type code) -{ - int mips_type; - - switch (code) - { - case BFD_RELOC_16: - mips_type = MIPS_R_REFHALF; - break; - case BFD_RELOC_32: - case BFD_RELOC_CTOR: - mips_type = MIPS_R_REFWORD; - break; - case BFD_RELOC_MIPS_JMP: - mips_type = MIPS_R_JMPADDR; - break; - case BFD_RELOC_HI16_S: - mips_type = MIPS_R_REFHI; - break; - case BFD_RELOC_LO16: - mips_type = MIPS_R_REFLO; - break; - case BFD_RELOC_GPREL16: - mips_type = MIPS_R_GPREL; - break; - case BFD_RELOC_MIPS_LITERAL: - mips_type = MIPS_R_LITERAL; - break; - case BFD_RELOC_RVA: - mips_type = MIPS_R_RVA; - break; - default: - return NULL; - } - - return & howto_table [mips_type]; -} - -static reloc_howto_type * -coff_mips_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, - const char *r_name) -{ - unsigned int i; - - for (i = 0; i < NUM_HOWTOS; i++) - if (howto_table[i].name != NULL - && strcasecmp (howto_table[i].name, r_name) == 0) - return &howto_table[i]; - - return NULL; -} - -static void -mips_swap_reloc_in (bfd * abfd, void * src, void * dst) -{ - static struct internal_reloc pair_prev; - RELOC *reloc_src = (RELOC *) src; - struct internal_reloc *reloc_dst = (struct internal_reloc *) dst; - - reloc_dst->r_vaddr = H_GET_32 (abfd, reloc_src->r_vaddr); - reloc_dst->r_symndx = H_GET_S32 (abfd, reloc_src->r_symndx); - reloc_dst->r_type = H_GET_16 (abfd, reloc_src->r_type); - reloc_dst->r_size = 0; - reloc_dst->r_extern = 0; - reloc_dst->r_offset = 0; - - switch (reloc_dst->r_type) - { - case MIPS_R_REFHI: - pair_prev = *reloc_dst; - break; - case MIPS_R_PAIR: - reloc_dst->r_offset = reloc_dst->r_symndx; - if (reloc_dst->r_offset & 0x8000) - reloc_dst->r_offset -= 0x10000; - reloc_dst->r_symndx = pair_prev.r_symndx; - break; - } -} - -static unsigned int -mips_swap_reloc_out (bfd * abfd, void * src, void * dst) -{ - static bfd_vma prev_addr = 0; - struct internal_reloc *reloc_src = (struct internal_reloc *)src; - struct external_reloc *reloc_dst = (struct external_reloc *)dst; - - switch (reloc_src->r_type) - { - case MIPS_R_REFHI: - prev_addr = reloc_src->r_vaddr; - break; - case MIPS_R_REFLO: - if (reloc_src->r_vaddr == prev_addr) - { - /* FIXME: only slightly hackish. If we see a REFLO pointing to - the same address as a REFHI, we assume this is the matching - PAIR reloc and output it accordingly. The symndx is really - the low 16 bits of the addend */ - H_PUT_32 (abfd, reloc_src->r_vaddr, reloc_dst->r_vaddr); - H_PUT_32 (abfd, reloc_src->r_symndx, reloc_dst->r_symndx); - H_PUT_16 (abfd, MIPS_R_PAIR, reloc_dst->r_type); - return RELSZ; - } - break; - } - - H_PUT_32 (abfd, reloc_src->r_vaddr, reloc_dst->r_vaddr); - H_PUT_32 (abfd, reloc_src->r_symndx, reloc_dst->r_symndx); - - H_PUT_16 (abfd, reloc_src->r_type, reloc_dst->r_type); - return RELSZ; -} - -#define coff_swap_reloc_in mips_swap_reloc_in -#define coff_swap_reloc_out mips_swap_reloc_out -#define NO_COFF_RELOCS - -static bfd_boolean -coff_pe_mips_relocate_section (bfd *output_bfd, - struct bfd_link_info *info, - bfd *input_bfd, - asection *input_section, - bfd_byte *contents, - struct internal_reloc *relocs, - struct internal_syment *syms, - asection **sections) -{ - struct internal_reloc *rel; - struct internal_reloc *rel_end; - unsigned int i; - - if (bfd_link_relocatable (info)) - { - _bfd_error_handler - (_("%pB: `ld -r' not supported with PE MIPS objects"), input_bfd); - bfd_set_error (bfd_error_bad_value); - return FALSE; - } - - BFD_ASSERT (input_bfd->xvec->byteorder - == output_bfd->xvec->byteorder); - - rel = relocs; - rel_end = rel + input_section->reloc_count; - - for (i = 0; rel < rel_end; rel++, i++) - { - long symndx; - struct coff_link_hash_entry *h; - struct internal_syment *sym; - bfd_vma addend = 0; - bfd_vma val, tmp, targ, src, low; - reloc_howto_type *howto; - unsigned char *mem = contents + rel->r_vaddr; - - symndx = rel->r_symndx; - - if (symndx == -1) - { - h = NULL; - sym = NULL; - } - else - { - h = obj_coff_sym_hashes (input_bfd)[symndx]; - sym = syms + symndx; - } - - /* COFF treats common symbols in one of two ways. Either the - size of the symbol is included in the section contents, or it - is not. We assume that the size is not included, and force - the rtype_to_howto function to adjust the addend as needed. */ - - if (sym != NULL && sym->n_scnum != 0) - addend = - sym->n_value; - else - addend = 0; - - howto = bfd_coff_rtype_to_howto (input_bfd, input_section, rel, h, - sym, &addend); - if (howto == NULL) - return FALSE; - - /* If we are doing a relocatable link, then we can just ignore - a PC relative reloc that is pcrel_offset. It will already - have the correct value. If this is not a relocatable link, - then we should ignore the symbol value. */ - if (howto->pc_relative && howto->pcrel_offset) - { - if (bfd_link_relocatable (info)) - continue; - if (sym != NULL && sym->n_scnum != 0) - addend += sym->n_value; - } - - val = 0; - - if (h == NULL) - { - asection *sec; - - if (symndx == -1) - { - sec = bfd_abs_section_ptr; - val = 0; - } - else - { - sec = sections[symndx]; - val = (sec->output_section->vma - + sec->output_offset - + sym->n_value); - if (! obj_pe (input_bfd)) - val -= sec->vma; - } - } - else - { - if (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - { - asection *sec; - - sec = h->root.u.def.section; - val = (h->root.u.def.value - + sec->output_section->vma - + sec->output_offset); - } - - else if (! bfd_link_relocatable (info)) - (*info->callbacks->undefined_symbol) - (info, h->root.root.string, input_bfd, input_section, - rel->r_vaddr - input_section->vma, TRUE); - } - - src = rel->r_vaddr + input_section->output_section->vma - + input_section->output_offset; - - /* OK, at this point the following variables are set up: - src = VMA of the memory we're fixing up - mem = pointer to memory we're fixing up - val = VMA of what we need to refer to. */ - -#define UI(x) \ - /* xgettext:c-format */ \ - _bfd_error_handler (_("%pB: unimplemented %s"), \ - input_bfd, x); \ - bfd_set_error (bfd_error_bad_value); - - switch (rel->r_type) - { - case MIPS_R_ABSOLUTE: - /* Ignore these. */ - break; - - case MIPS_R_REFHALF: - UI ("refhalf"); - break; - - case MIPS_R_REFWORD: - tmp = bfd_get_32 (input_bfd, mem); - /* printf ("refword: src=%08x targ=%08x+%08x\n", src, tmp, val); */ - tmp += val; - bfd_put_32 (input_bfd, tmp, mem); - break; - - case MIPS_R_JMPADDR: - tmp = bfd_get_32 (input_bfd, mem); - targ = val + (tmp & 0x03ffffff) * 4; - if ((src & 0xf0000000) != (targ & 0xf0000000)) - { - _bfd_error_handler (_("%pB: jump too far away"), input_bfd); - bfd_set_error (bfd_error_bad_value); - return FALSE; - } - tmp &= 0xfc000000; - tmp |= (targ / 4) & 0x3ffffff; - bfd_put_32 (input_bfd, tmp, mem); - break; - - case MIPS_R_REFHI: - tmp = bfd_get_32 (input_bfd, mem); - switch (rel[1].r_type) - { - case MIPS_R_PAIR: - /* MS PE object */ - targ = val + rel[1].r_offset + ((tmp & 0xffff) << 16); - break; - case MIPS_R_REFLO: - /* GNU COFF object */ - low = bfd_get_32 (input_bfd, contents + rel[1].r_vaddr); - low &= 0xffff; - if (low & 0x8000) - low -= 0x10000; - targ = val + low + ((tmp & 0xffff) << 16); - break; - default: - _bfd_error_handler (_("%pB: bad pair/reflo after refhi"), - input_bfd); - bfd_set_error (bfd_error_bad_value); - return FALSE; - } - tmp &= 0xffff0000; - tmp |= (targ >> 16) & 0xffff; - bfd_put_32 (input_bfd, tmp, mem); - break; - - case MIPS_R_REFLO: - tmp = bfd_get_32 (input_bfd, mem); - targ = val + (tmp & 0xffff); - /* printf ("refword: src=%08x targ=%08x\n", src, targ); */ - tmp &= 0xffff0000; - tmp |= targ & 0xffff; - bfd_put_32 (input_bfd, tmp, mem); - break; - - case MIPS_R_GPREL: - case MIPS_R_LITERAL: - UI ("gprel"); - break; - - case MIPS_R_SECTION: - UI ("section"); - break; - - case MIPS_R_SECREL: - UI ("secrel"); - break; - - case MIPS_R_SECRELLO: - UI ("secrello"); - break; - - case MIPS_R_SECRELHI: - UI ("secrelhi"); - break; - - case MIPS_R_RVA: - tmp = bfd_get_32 (input_bfd, mem); - /* printf ("rva: src=%08x targ=%08x+%08x\n", src, tmp, val); */ - tmp += val - - pe_data (input_section->output_section->owner)->pe_opthdr.ImageBase; - bfd_put_32 (input_bfd, tmp, mem); - break; - - case MIPS_R_PAIR: - /* ignore these */ - break; - } - } - - return TRUE; -} - -#define coff_relocate_section coff_pe_mips_relocate_section - -#ifdef TARGET_UNDERSCORE - -/* If mips gcc uses underscores for symbol names, then it does not use - a leading dot for local labels, so if TARGET_UNDERSCORE is defined - we treat all symbols starting with L as local. */ - -static bfd_boolean -coff_mips_is_local_label_name (bfd *abfd, const char *name) -{ - if (name[0] == 'L') - return TRUE; - - return _bfd_coff_is_local_label_name (abfd, name); -} - -#define coff_bfd_is_local_label_name coff_mips_is_local_label_name - -#endif /* TARGET_UNDERSCORE */ - -#define COFF_NO_HACK_SCNHDR_SIZE - -#ifndef bfd_pe_print_pdata -#define bfd_pe_print_pdata NULL -#endif - -#include "coffcode.h" - -const bfd_target -#ifdef TARGET_SYM - TARGET_SYM = -#else - mips_pe_le_vec = -#endif -{ -#ifdef TARGET_NAME - TARGET_NAME, -#else - "pe-mips", /* Name. */ -#endif - bfd_target_coff_flavour, - BFD_ENDIAN_LITTLE, /* Data byte order is little. */ - BFD_ENDIAN_LITTLE, /* Header byte order is little. */ - - (HAS_RELOC | EXEC_P /* Object flags. */ - | HAS_LINENO | HAS_DEBUG - | HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - -#ifndef COFF_WITH_PE - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC /* Section flags. */ - | SEC_CODE | SEC_DATA), -#else - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC /* Section flags. */ - | SEC_CODE | SEC_DATA - | SEC_LINK_ONCE | SEC_LINK_DUPLICATES), -#endif - -#ifdef TARGET_UNDERSCORE - TARGET_UNDERSCORE, /* Leading underscore. */ -#else - 0, /* leading underscore */ -#endif - '/', /* AR_pad_char. */ - 15, /* AR_max_namelen. */ - 0, /* match priority. */ - - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Data. */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Headers. */ - - /* Note that we allow an object file to be treated as a core file as well. */ - { /* bfd_check_format. */ - _bfd_dummy_target, - coff_object_p, - bfd_generic_archive_p, - coff_object_p - }, - { /* bfd_set_format. */ - _bfd_bool_bfd_false_error, - coff_mkobject, - _bfd_generic_mkarchive, - _bfd_bool_bfd_false_error - }, - { /* bfd_write_contents. */ - _bfd_bool_bfd_false_error, - coff_write_object_contents, - _bfd_write_archive_contents, - _bfd_bool_bfd_false_error - }, - - BFD_JUMP_TABLE_GENERIC (coff), - BFD_JUMP_TABLE_COPY (coff), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), - BFD_JUMP_TABLE_SYMBOLS (coff), - BFD_JUMP_TABLE_RELOCS (coff), - BFD_JUMP_TABLE_WRITE (coff), - BFD_JUMP_TABLE_LINK (coff), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - NULL, - - COFF_SWAP_TABLE -}; diff --git a/bfd/pei-mips.c b/bfd/pei-mips.c deleted file mode 100644 index 9661a82bb8..0000000000 --- a/bfd/pei-mips.c +++ /dev/null @@ -1,32 +0,0 @@ -/* BFD back-end for MIPS PE IMAGE COFF files. - Copyright (C) 1995-2018 Free Software Foundation, Inc. - - This file is part of BFD, the Binary File Descriptor library. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, - MA 02110-1301, USA. */ - -#include "sysdep.h" -#include "bfd.h" - -#define TARGET_SYM mips_pei_le_vec -#define TARGET_NAME "pei-mips" -#define COFF_IMAGE_WITH_PE -#define PCRELOFFSET TRUE -/* Long section names not allowed in executable images, only object files. */ -#define COFF_LONG_SECTION_NAMES 0 - -#include "pe-mips.c" - diff --git a/bfd/po/SRC-POTFILES.in b/bfd/po/SRC-POTFILES.in index f7ce38726c..7708601265 100644 --- a/bfd/po/SRC-POTFILES.in +++ b/bfd/po/SRC-POTFILES.in @@ -24,7 +24,6 @@ coff-arm.c coff-bfd.c coff-go32.c coff-i386.c -coff-mips.c coff-rs6000.c coff-sh.c coff-stgo32.c @@ -259,7 +258,6 @@ mach-o-x86-64.c mach-o.c mach-o.h merge.c -mipsbsd.c mmo.c netbsd-core.c netbsd.h @@ -273,7 +271,6 @@ pe-arm-wince.c pe-arm.c pe-i386.c pe-mcore.c -pe-mips.c pe-ppc.c pe-sh.c pe-x86_64.c @@ -285,7 +282,6 @@ pei-arm.c pei-i386.c pei-ia64.c pei-mcore.c -pei-mips.c pei-ppc.c pei-sh.c pei-x86_64.c diff --git a/bfd/targets.c b/bfd/targets.c index c03efe0ee6..3deabb5265 100644 --- a/bfd/targets.c +++ b/bfd/targets.c @@ -702,11 +702,6 @@ extern const bfd_target mep_elf32_le_vec; extern const bfd_target metag_elf32_vec; extern const bfd_target microblaze_elf32_vec; extern const bfd_target microblaze_elf32_le_vec; -extern const bfd_target mips_aout_be_vec; -extern const bfd_target mips_aout_le_vec; -extern const bfd_target mips_ecoff_be_vec; -extern const bfd_target mips_ecoff_le_vec; -extern const bfd_target mips_ecoff_bele_vec; extern const bfd_target mips_elf32_be_vec; extern const bfd_target mips_elf32_le_vec; extern const bfd_target mips_elf32_n_be_vec; @@ -727,8 +722,6 @@ extern const bfd_target mips_elf64_trad_be_vec; extern const bfd_target mips_elf64_trad_le_vec; extern const bfd_target mips_elf64_tradfbsd_be_vec; extern const bfd_target mips_elf64_tradfbsd_le_vec; -extern const bfd_target mips_pe_le_vec; -extern const bfd_target mips_pei_le_vec; extern const bfd_target mmix_elf64_vec; extern const bfd_target mmix_mmo_vec; extern const bfd_target mn10200_elf32_vec; @@ -1078,14 +1071,6 @@ static const bfd_target * const _bfd_target_vector[] = µblaze_elf32_vec, -#if 0 - /* No one seems to use this. */ - &mips_aout_be_vec, -#endif - &mips_aout_le_vec, - &mips_ecoff_be_vec, - &mips_ecoff_le_vec, - &mips_ecoff_bele_vec, #ifdef BFD64 &mips_elf32_be_vec, &mips_elf32_le_vec, @@ -1108,8 +1093,6 @@ static const bfd_target * const _bfd_target_vector[] = &mips_elf64_tradfbsd_be_vec, &mips_elf64_tradfbsd_le_vec, #endif - &mips_pe_le_vec, - &mips_pei_le_vec, #ifdef BFD64 &mmix_elf64_vec, diff --git a/include/ChangeLog b/include/ChangeLog index 2c2321d11e..940136eaf1 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,7 @@ +2018-04-18 Alan Modra + + * coff/mipspe.h: Delete. + 2018-04-18 Alan Modra * aout/dynix3.h: Delete. diff --git a/include/coff/mipspe.h b/include/coff/mipspe.h deleted file mode 100644 index 01bec6ceba..0000000000 --- a/include/coff/mipspe.h +++ /dev/null @@ -1,67 +0,0 @@ -/* coff information for Windows CE with MIPS VR4111 - - Copyright (C) 2000-2018 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, - MA 02110-1301, USA. */ - -#define L_LNNO_SIZE 2 -#define INCLUDE_COMDAT_FIELDS_IN_AUXENT -#include "coff/external.h" - -#define MIPS_ARCH_MAGIC_WINCE 0x0166 /* Windows CE - little endian */ -#define MIPS_PE_MAGIC 0x010b - -#define MIPSBADMAG(x) ((x).f_magic != MIPS_ARCH_MAGIC_WINCE) - -/* define some NT default values */ -/* #define NT_IMAGE_BASE 0x400000 moved to internal.h */ -#define NT_SECTION_ALIGNMENT 0x1000 -#define NT_FILE_ALIGNMENT 0x200 -#define NT_DEF_RESERVE 0x100000 -#define NT_DEF_COMMIT 0x1000 - -/********************** RELOCATION DIRECTIVES **********************/ - -/* The external reloc has an offset field, because some of the reloc - types on the h8 don't have room in the instruction for the entire - offset - eg the strange jump and high page addressing modes. */ - -struct external_reloc -{ - char r_vaddr[4]; - char r_symndx[4]; - char r_type[2]; -}; - -#define RELOC struct external_reloc -#define RELSZ 10 - -/* MIPS PE relocation types. */ - -#define MIPS_R_ABSOLUTE 0 /* ignored */ -#define MIPS_R_REFHALF 1 -#define MIPS_R_REFWORD 2 -#define MIPS_R_JMPADDR 3 -#define MIPS_R_REFHI 4 /* PAIR follows */ -#define MIPS_R_REFLO 5 -#define MIPS_R_GPREL 6 -#define MIPS_R_LITERAL 7 /* same as GPREL */ -#define MIPS_R_SECTION 10 -#define MIPS_R_SECREL 11 -#define MIPS_R_SECRELLO 12 -#define MIPS_R_SECRELHI 13 /* PAIR follows */ -#define MIPS_R_RVA 34 /* 0x22 */ -#define MIPS_R_PAIR 37 /* 0x25 - symndx is really a signed 16-bit addend */ -- 2.34.1