diff options
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 30 | ||||
-rw-r--r-- | bfd/Makefile.am | 16 | ||||
-rw-r--r-- | bfd/Makefile.in | 24 | ||||
-rw-r--r-- | bfd/aout-adobe.c | 535 | ||||
-rw-r--r-- | bfd/aoutx.h | 13 | ||||
-rw-r--r-- | bfd/archive.c | 16 | ||||
-rw-r--r-- | bfd/archures.c | 25 | ||||
-rw-r--r-- | bfd/bfd-in2.h | 70 | ||||
-rw-r--r-- | bfd/bfd.c | 1 | ||||
-rw-r--r-- | bfd/bout.c | 1508 | ||||
-rw-r--r-- | bfd/coff-i860.c | 730 | ||||
-rw-r--r-- | bfd/coff-i960.c | 666 | ||||
-rw-r--r-- | bfd/coffcode.h | 168 | ||||
-rw-r--r-- | bfd/coffswap.h | 14 | ||||
-rw-r--r-- | bfd/config.bfd | 43 | ||||
-rwxr-xr-x | bfd/configure | 13 | ||||
-rw-r--r-- | bfd/configure.ac | 13 | ||||
-rw-r--r-- | bfd/cpu-i860.c | 42 | ||||
-rw-r--r-- | bfd/cpu-i960.c | 172 | ||||
-rw-r--r-- | bfd/elf32-i860.c | 1274 | ||||
-rw-r--r-- | bfd/elf32-i960.c | 169 | ||||
-rw-r--r-- | bfd/hosts/i860mach3.h | 46 | ||||
-rw-r--r-- | bfd/ieee.c | 28 | ||||
-rw-r--r-- | bfd/libbfd.h | 33 | ||||
-rw-r--r-- | bfd/mach-o.c | 5 | ||||
-rw-r--r-- | bfd/po/SRC-POTFILES.in | 8 | ||||
-rw-r--r-- | bfd/reloc.c | 84 | ||||
-rw-r--r-- | bfd/targets.c | 22 |
28 files changed, 51 insertions, 5717 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 33127be..d396af1 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,33 @@ +2018-04-11 Alan Modra <amodra@gmail.com> + + * aout-adobe.c: Delete. + * bout.c: Delete. + * coff-i860.c: Delete. + * coff-i960.c: Delete. + * cpu-i860.c: Delete. + * cpu-i960.c: Delete. + * elf32-i860.c: Delete. + * elf32-i960.c: Delete. + * hosts/i860mach3.h: Delete. + * Makefile.am: Remove i860, i960, bout, and adobe support. + * archures.c: Remove i860 and i960 support. + * coffcode.h: Likewise. + * reloc.c: Likewise. + * aoutx.h: Comment updates. + * archive.c: Remove BOUT and i960 support. + * bfd.c: Remove BOUT support. + * coffswap.h: Remove i960 support. + * config.bfd: Remove i860, i960 and adobe targets. + * configure.ac: Remove adode, bout, i860, i960, icoff targets. + * targets.c: Likewise. + * ieee.c: Remove i960 support. + * mach-o.c: Remove i860 support. + * Makefile.in: Regenerate. + * bfd-in2.h: Regenerate. + * configure: Regenerate. + * libbfd.h: Regenerate. + * po/SRC-POTFILES.in: Regenerate. + 2018-04-09 Maciej W. Rozycki <macro@mips.com> * elf64-mips.c (mips_elf64_write_rel): Handle a NULL BFD pointer diff --git a/bfd/Makefile.am b/bfd/Makefile.am index f727ebe..a03e2b2 100644 --- a/bfd/Makefile.am +++ b/bfd/Makefile.am @@ -114,8 +114,6 @@ ALL_MACHINES = \ cpu-iamcu.lo \ cpu-l1om.lo \ cpu-k1om.lo \ - cpu-i860.lo \ - cpu-i960.lo \ cpu-ia64.lo \ cpu-ip2k.lo \ cpu-iq2000.lo \ @@ -204,8 +202,6 @@ ALL_MACHINES_CFILES = \ cpu-iamcu.c \ cpu-l1om.c \ cpu-k1om.c \ - cpu-i860.c \ - cpu-i960.c \ cpu-ia64.c \ cpu-ip2k.c \ cpu-iq2000.c \ @@ -271,7 +267,6 @@ ALL_MACHINES_CFILES = \ # The .o files needed by all of the 32 bit vectors that are configured into # target_vector in targets.c if configured with --enable-targets=all. BFD32_BACKENDS = \ - aout-adobe.lo \ aout-arm.lo \ aout-cris.lo \ aout-ns32k.lo \ @@ -280,7 +275,6 @@ BFD32_BACKENDS = \ aout0.lo \ aout32.lo \ armnetbsd.lo \ - bout.lo \ cf-i386lynx.lo \ cf-sparclynx.lo \ coff-apollo.lo \ @@ -290,8 +284,6 @@ BFD32_BACKENDS = \ coff-h8300.lo \ coff-h8500.lo \ coff-i386.lo \ - coff-i860.lo \ - coff-i960.lo \ coff-m68k.lo \ coff-m88k.lo \ coff-mips.lo \ @@ -347,8 +339,6 @@ BFD32_BACKENDS = \ elf32-i370.lo \ elf32-i386.lo \ elfxx-x86.lo \ - elf32-i860.lo \ - elf32-i960.lo \ elf32-ip2k.lo \ elf32-iq2000.lo \ elf32-lm32.lo \ @@ -468,7 +458,6 @@ BFD32_BACKENDS = \ xtensa-modules.lo BFD32_BACKENDS_CFILES = \ - aout-adobe.c \ aout-arm.c \ aout-cris.c \ aout-ns32k.c \ @@ -477,7 +466,6 @@ BFD32_BACKENDS_CFILES = \ aout0.c \ aout32.c \ armnetbsd.c \ - bout.c \ cf-i386lynx.c \ cf-sparclynx.c \ coff-apollo.c \ @@ -487,8 +475,6 @@ BFD32_BACKENDS_CFILES = \ coff-h8300.c \ coff-h8500.c \ coff-i386.c \ - coff-i860.c \ - coff-i960.c \ coff-m68k.c \ coff-m88k.c \ coff-mips.c \ @@ -544,8 +530,6 @@ BFD32_BACKENDS_CFILES = \ elf32-i370.c \ elf32-i386.c \ elfxx-x86.c \ - elf32-i860.c \ - elf32-i960.c \ elf32-ip2k.c \ elf32-iq2000.c \ elf32-lm32.c \ diff --git a/bfd/Makefile.in b/bfd/Makefile.in index 4060823..d63aef9 100644 --- a/bfd/Makefile.in +++ b/bfd/Makefile.in @@ -447,8 +447,6 @@ ALL_MACHINES = \ cpu-iamcu.lo \ cpu-l1om.lo \ cpu-k1om.lo \ - cpu-i860.lo \ - cpu-i960.lo \ cpu-ia64.lo \ cpu-ip2k.lo \ cpu-iq2000.lo \ @@ -537,8 +535,6 @@ ALL_MACHINES_CFILES = \ cpu-iamcu.c \ cpu-l1om.c \ cpu-k1om.c \ - cpu-i860.c \ - cpu-i960.c \ cpu-ia64.c \ cpu-ip2k.c \ cpu-iq2000.c \ @@ -605,7 +601,6 @@ ALL_MACHINES_CFILES = \ # The .o files needed by all of the 32 bit vectors that are configured into # target_vector in targets.c if configured with --enable-targets=all. BFD32_BACKENDS = \ - aout-adobe.lo \ aout-arm.lo \ aout-cris.lo \ aout-ns32k.lo \ @@ -614,7 +609,6 @@ BFD32_BACKENDS = \ aout0.lo \ aout32.lo \ armnetbsd.lo \ - bout.lo \ cf-i386lynx.lo \ cf-sparclynx.lo \ coff-apollo.lo \ @@ -624,8 +618,6 @@ BFD32_BACKENDS = \ coff-h8300.lo \ coff-h8500.lo \ coff-i386.lo \ - coff-i860.lo \ - coff-i960.lo \ coff-m68k.lo \ coff-m88k.lo \ coff-mips.lo \ @@ -681,8 +673,6 @@ BFD32_BACKENDS = \ elf32-i370.lo \ elf32-i386.lo \ elfxx-x86.lo \ - elf32-i860.lo \ - elf32-i960.lo \ elf32-ip2k.lo \ elf32-iq2000.lo \ elf32-lm32.lo \ @@ -802,7 +792,6 @@ BFD32_BACKENDS = \ xtensa-modules.lo BFD32_BACKENDS_CFILES = \ - aout-adobe.c \ aout-arm.c \ aout-cris.c \ aout-ns32k.c \ @@ -811,7 +800,6 @@ BFD32_BACKENDS_CFILES = \ aout0.c \ aout32.c \ armnetbsd.c \ - bout.c \ cf-i386lynx.c \ cf-sparclynx.c \ coff-apollo.c \ @@ -821,8 +809,6 @@ BFD32_BACKENDS_CFILES = \ coff-h8300.c \ coff-h8500.c \ coff-i386.c \ - coff-i860.c \ - coff-i960.c \ coff-m68k.c \ coff-m88k.c \ coff-mips.c \ @@ -878,8 +864,6 @@ BFD32_BACKENDS_CFILES = \ elf32-i370.c \ elf32-i386.c \ elfxx-x86.c \ - elf32-i860.c \ - elf32-i960.c \ elf32-ip2k.c \ elf32-iq2000.c \ elf32-lm32.c \ @@ -1322,7 +1306,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aix386-core.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aix5ppc-core.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aout-adobe.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aout-arm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aout-cris.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aout-ns32k.Plo@am__quote@ @@ -1339,7 +1322,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bfdio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bfdwin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/binary.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bout.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cf-i386lynx.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cf-sparclynx.Plo@am__quote@ @@ -1353,8 +1335,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coff-h8300.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coff-h8500.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coff-i386.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coff-i860.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coff-i960.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coff-m68k.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coff-m88k.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coff-mips.Plo@am__quote@ @@ -1400,8 +1380,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-hppa.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-i370.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-i386.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-i860.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-i960.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-ia64.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-iamcu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-ip2k.Plo@am__quote@ @@ -1503,8 +1481,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-hppa.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-i370.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-i386.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-i860.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-i960.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-ia64.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-ip2k.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-iq2000.Plo@am__quote@ diff --git a/bfd/aout-adobe.c b/bfd/aout-adobe.c deleted file mode 100644 index 48189d8..0000000 --- a/bfd/aout-adobe.c +++ /dev/null @@ -1,535 +0,0 @@ -/* BFD back-end for a.out.adobe binaries. - Copyright (C) 1990-2018 Free Software Foundation, Inc. - Written by Cygnus Support. Based on bout.c. - - 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 "libbfd.h" -#include "aout/adobe.h" -#include "aout/stab_gnu.h" -#include "libaout.h" /* BFD a.out internal data structures. */ - -/* Forward decl. */ -extern const bfd_target aout_adobe_vec; - -/* Swaps the information in an executable header taken from a raw byte - stream memory image, into the internal exec_header structure. */ - -static void -aout_adobe_swap_exec_header_in (bfd *abfd, - struct external_exec *bytes, - struct internal_exec *execp) -{ - /* Now fill in fields in the execp, from the bytes in the raw data. */ - execp->a_info = H_GET_32 (abfd, bytes->e_info); - execp->a_text = GET_WORD (abfd, bytes->e_text); - execp->a_data = GET_WORD (abfd, bytes->e_data); - execp->a_bss = GET_WORD (abfd, bytes->e_bss); - execp->a_syms = GET_WORD (abfd, bytes->e_syms); - execp->a_entry = GET_WORD (abfd, bytes->e_entry); - execp->a_trsize = GET_WORD (abfd, bytes->e_trsize); - execp->a_drsize = GET_WORD (abfd, bytes->e_drsize); -} - -/* Swaps the information in an internal exec header structure into the - supplied buffer ready for writing to disk. */ - -static void -aout_adobe_swap_exec_header_out (bfd *abfd, - struct internal_exec *execp, - struct external_exec *bytes) -{ - /* Now fill in fields in the raw data, from the fields in the exec - struct. */ - H_PUT_32 (abfd, execp->a_info , bytes->e_info); - PUT_WORD (abfd, execp->a_text , bytes->e_text); - PUT_WORD (abfd, execp->a_data , bytes->e_data); - PUT_WORD (abfd, execp->a_bss , bytes->e_bss); - PUT_WORD (abfd, execp->a_syms , bytes->e_syms); - PUT_WORD (abfd, execp->a_entry , bytes->e_entry); - PUT_WORD (abfd, execp->a_trsize, bytes->e_trsize); - PUT_WORD (abfd, execp->a_drsize, bytes->e_drsize); -} - -/* Finish up the opening of a b.out file for reading. Fill in all the - fields that are not handled by common code. */ - -static const bfd_target * -aout_adobe_callback (bfd *abfd) -{ - struct internal_exec *execp = exec_hdr (abfd); - asection *sect; - struct external_segdesc ext[1]; - char *section_name; - char try_again[30]; /* Name and number. */ - char *newname; - int trynum; - flagword flags; - - /* Architecture and machine type -- unknown in this format. */ - bfd_set_arch_mach (abfd, bfd_arch_unknown, 0L); - - /* The positions of the string table and symbol table. */ - obj_str_filepos (abfd) = N_STROFF (execp); - obj_sym_filepos (abfd) = N_SYMOFF (execp); - - /* Suck up the section information from the file, one section at a time. */ - for (;;) - { - bfd_size_type amt = sizeof (*ext); - if (bfd_bread ( ext, amt, abfd) != amt) - { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_wrong_format); - - return NULL; - } - switch (ext->e_type[0]) - { - case N_TEXT: - section_name = ".text"; - flags = SEC_CODE | SEC_LOAD | SEC_ALLOC | SEC_HAS_CONTENTS; - break; - - case N_DATA: - section_name = ".data"; - flags = SEC_DATA | SEC_LOAD | SEC_ALLOC | SEC_HAS_CONTENTS; - break; - - case N_BSS: - section_name = ".bss"; - flags = SEC_DATA | SEC_HAS_CONTENTS; - break; - - case 0: - goto no_more_sections; - - default: - _bfd_error_handler - /* xgettext:c-format */ - (_("%pB: unknown section type in a.out.adobe file: %x"), - abfd, ext->e_type[0]); - goto no_more_sections; - } - - /* First one is called ".text" or whatever; subsequent ones are - ".text1", ".text2", ... */ - bfd_set_error (bfd_error_no_error); - sect = bfd_make_section_with_flags (abfd, section_name, flags); - trynum = 0; - - while (!sect) - { - if (bfd_get_error () != bfd_error_no_error) - /* Some other error -- slide into the sunset. */ - return NULL; - sprintf (try_again, "%s%d", section_name, ++trynum); - sect = bfd_make_section_with_flags (abfd, try_again, flags); - } - - /* Fix the name, if it is a sprintf'd name. */ - if (sect->name == try_again) - { - amt = strlen (sect->name); - newname = bfd_zalloc (abfd, amt); - if (newname == NULL) - return NULL; - strcpy (newname, sect->name); - sect->name = newname; - } - - /* Assumed big-endian. */ - sect->size = ((ext->e_size[0] << 8) - | ext->e_size[1] << 8 - | ext->e_size[2]); - sect->vma = H_GET_32 (abfd, ext->e_virtbase); - sect->filepos = H_GET_32 (abfd, ext->e_filebase); - /* FIXME XXX alignment? */ - - /* Set relocation information for first section of each type. */ - if (trynum == 0) - switch (ext->e_type[0]) - { - case N_TEXT: - sect->rel_filepos = N_TRELOFF (execp); - sect->reloc_count = execp->a_trsize; - break; - - case N_DATA: - sect->rel_filepos = N_DRELOFF (execp); - sect->reloc_count = execp->a_drsize; - break; - - default: - break; - } - } - no_more_sections: - - adata (abfd).reloc_entry_size = sizeof (struct reloc_std_external); - adata (abfd).symbol_entry_size = sizeof (struct external_nlist); - adata (abfd).page_size = 1; /* Not applicable. */ - adata (abfd).segment_size = 1; /* Not applicable. */ - adata (abfd).exec_bytes_size = EXEC_BYTES_SIZE; - - return abfd->xvec; -} - -static const bfd_target * -aout_adobe_object_p (bfd *abfd) -{ - struct internal_exec anexec; - struct external_exec exec_bytes; - char *targ; - bfd_size_type amt = EXEC_BYTES_SIZE; - - if (bfd_bread (& exec_bytes, amt, abfd) != amt) - { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - - anexec.a_info = H_GET_32 (abfd, exec_bytes.e_info); - - /* Normally we just compare for the magic number. - However, a bunch of Adobe tools aren't fixed up yet; they generate - files using ZMAGIC(!). - If the environment variable GNUTARGET is set to "a.out.adobe", we will - take just about any a.out file as an Adobe a.out file. FIXME! */ - - if (N_BADMAG (&anexec)) - { - targ = getenv ("GNUTARGET"); - if (targ && !strcmp (targ, aout_adobe_vec.name)) - /* Just continue anyway, if specifically set to this format. */ - ; - else - { - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - } - - aout_adobe_swap_exec_header_in (abfd, &exec_bytes, &anexec); - return aout_32_some_aout_object_p (abfd, &anexec, aout_adobe_callback); -} - -struct bout_data_struct -{ - struct aoutdata a; - struct internal_exec e; -}; - -static bfd_boolean -aout_adobe_mkobject (bfd *abfd) -{ - struct bout_data_struct *rawptr; - bfd_size_type amt = sizeof (struct bout_data_struct); - - rawptr = bfd_zalloc (abfd, amt); - if (rawptr == NULL) - return FALSE; - - abfd->tdata.bout_data = rawptr; - exec_hdr (abfd) = &rawptr->e; - - adata (abfd).reloc_entry_size = sizeof (struct reloc_std_external); - adata (abfd).symbol_entry_size = sizeof (struct external_nlist); - adata (abfd).page_size = 1; /* Not applicable. */ - adata (abfd).segment_size = 1; /* Not applicable. */ - adata (abfd).exec_bytes_size = EXEC_BYTES_SIZE; - - return TRUE; -} - -static void -aout_adobe_write_section (bfd *abfd ATTRIBUTE_UNUSED, - sec_ptr sect ATTRIBUTE_UNUSED) -{ - /* FIXME XXX. */ -} - -static bfd_boolean -aout_adobe_write_object_contents (bfd *abfd) -{ - struct external_exec swapped_hdr; - static struct external_segdesc sentinel[1]; /* Initialized to zero. */ - asection *sect; - bfd_size_type amt; - - exec_hdr (abfd)->a_info = ZMAGIC; - - /* Calculate text size as total of text sections, etc. */ - exec_hdr (abfd)->a_text = 0; - exec_hdr (abfd)->a_data = 0; - exec_hdr (abfd)->a_bss = 0; - exec_hdr (abfd)->a_trsize = 0; - exec_hdr (abfd)->a_drsize = 0; - - for (sect = abfd->sections; sect; sect = sect->next) - { - if (sect->flags & SEC_CODE) - { - exec_hdr (abfd)->a_text += sect->size; - exec_hdr (abfd)->a_trsize += sect->reloc_count * - sizeof (struct reloc_std_external); - } - else if (sect->flags & SEC_DATA) - { - exec_hdr (abfd)->a_data += sect->size; - exec_hdr (abfd)->a_drsize += sect->reloc_count * - sizeof (struct reloc_std_external); - } - else if (sect->flags & SEC_ALLOC && !(sect->flags & SEC_LOAD)) - exec_hdr (abfd)->a_bss += sect->size; - } - - exec_hdr (abfd)->a_syms = bfd_get_symcount (abfd) - * sizeof (struct external_nlist); - exec_hdr (abfd)->a_entry = bfd_get_start_address (abfd); - - aout_adobe_swap_exec_header_out (abfd, exec_hdr (abfd), &swapped_hdr); - - amt = EXEC_BYTES_SIZE; - if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0 - || bfd_bwrite (& swapped_hdr, amt, abfd) != amt) - return FALSE; - - /* Now write out the section information. Text first, data next, rest - afterward. */ - for (sect = abfd->sections; sect; sect = sect->next) - if (sect->flags & SEC_CODE) - aout_adobe_write_section (abfd, sect); - - for (sect = abfd->sections; sect; sect = sect->next) - if (sect->flags & SEC_DATA) - aout_adobe_write_section (abfd, sect); - - for (sect = abfd->sections; sect; sect = sect->next) - if (!(sect->flags & (SEC_CODE | SEC_DATA))) - aout_adobe_write_section (abfd, sect); - - /* Write final `sentinel` section header (with type of 0). */ - amt = sizeof (*sentinel); - if (bfd_bwrite (sentinel, amt, abfd) != amt) - return FALSE; - - /* Now write out reloc info, followed by syms and strings. */ - if (bfd_get_symcount (abfd) != 0) - { - if (bfd_seek (abfd, (file_ptr) (N_SYMOFF (exec_hdr (abfd))), SEEK_SET) - != 0) - return FALSE; - - if (! aout_32_write_syms (abfd)) - return FALSE; - - if (bfd_seek (abfd, (file_ptr) (N_TRELOFF (exec_hdr (abfd))), SEEK_SET) - != 0) - return FALSE; - - for (sect = abfd->sections; sect; sect = sect->next) - if (sect->flags & SEC_CODE) - if (!aout_32_squirt_out_relocs (abfd, sect)) - return FALSE; - - if (bfd_seek (abfd, (file_ptr) (N_DRELOFF (exec_hdr (abfd))), SEEK_SET) - != 0) - return FALSE; - - for (sect = abfd->sections; sect; sect = sect->next) - if (sect->flags & SEC_DATA) - if (!aout_32_squirt_out_relocs (abfd, sect)) - return FALSE; - } - - return TRUE; -} - -static bfd_boolean -aout_adobe_set_section_contents (bfd *abfd, - asection *section, - const void * location, - file_ptr offset, - bfd_size_type count) -{ - file_ptr section_start; - sec_ptr sect; - - /* Set by bfd.c handler. */ - if (! abfd->output_has_begun) - { - /* Assign file offsets to sections. Text sections are first, and - are contiguous. Then data sections. Everything else at the end. */ - section_start = N_TXTOFF (0); - - for (sect = abfd->sections; sect; sect = sect->next) - { - if (sect->flags & SEC_CODE) - { - sect->filepos = section_start; - /* FIXME: Round to alignment. */ - section_start += sect->size; - } - } - - for (sect = abfd->sections; sect; sect = sect->next) - { - if (sect->flags & SEC_DATA) - { - sect->filepos = section_start; - /* FIXME: Round to alignment. */ - section_start += sect->size; - } - } - - for (sect = abfd->sections; sect; sect = sect->next) - { - if (sect->flags & SEC_HAS_CONTENTS && - !(sect->flags & (SEC_CODE | SEC_DATA))) - { - sect->filepos = section_start; - /* FIXME: Round to alignment. */ - section_start += sect->size; - } - } - } - - /* Regardless, once we know what we're doing, we might as well get - going. */ - if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0) - return FALSE; - - if (count == 0) - return TRUE; - - return bfd_bwrite (location, count, abfd) == count; -} - -static bfd_boolean -aout_adobe_set_arch_mach (bfd *abfd, - enum bfd_architecture arch, - unsigned long machine) -{ - if (! bfd_default_set_arch_mach (abfd, arch, machine)) - return FALSE; - - if (arch == bfd_arch_unknown - || arch == bfd_arch_m68k) - return TRUE; - - return FALSE; -} - -static int -aout_adobe_sizeof_headers (bfd *ignore_abfd ATTRIBUTE_UNUSED, - struct bfd_link_info *info ATTRIBUTE_UNUSED) -{ - return sizeof (struct internal_exec); -} - -/* Build the transfer vector for Adobe A.Out files. */ - -#define aout_32_find_line _bfd_nosymbols_find_line -#define aout_32_get_symbol_version_string _bfd_nosymbols_get_symbol_version_string -#define aout_32_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol -#define aout_32_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup -#define aout_32_bfd_reloc_name_lookup _bfd_norelocs_bfd_reloc_name_lookup -#define aout_32_close_and_cleanup aout_32_bfd_free_cached_info -#define aout_32_set_arch_mach aout_adobe_set_arch_mach -#define aout_32_set_section_contents aout_adobe_set_section_contents -#define aout_32_sizeof_headers aout_adobe_sizeof_headers -#define aout_32_bfd_get_relocated_section_contents bfd_generic_get_relocated_section_contents -#define aout_32_get_section_contents_in_window _bfd_generic_get_section_contents_in_window -#define aout_32_bfd_relax_section bfd_generic_relax_section -#define aout_32_bfd_gc_sections bfd_generic_gc_sections -#define aout_32_bfd_lookup_section_flags bfd_generic_lookup_section_flags -#define aout_32_bfd_merge_sections bfd_generic_merge_sections -#define aout_32_bfd_is_group_section bfd_generic_is_group_section -#define aout_32_bfd_discard_group bfd_generic_discard_group -#define aout_32_section_already_linked _bfd_generic_section_already_linked -#define aout_32_bfd_define_common_symbol bfd_generic_define_common_symbol -#define aout_32_bfd_define_start_stop bfd_generic_define_start_stop -#define aout_32_bfd_link_hash_table_create _bfd_generic_link_hash_table_create -#define aout_32_bfd_link_add_symbols _bfd_generic_link_add_symbols -#define aout_32_bfd_link_just_syms _bfd_generic_link_just_syms -#define aout_32_bfd_copy_link_hash_symbol_type \ - _bfd_generic_copy_link_hash_symbol_type -#define aout_32_bfd_final_link _bfd_generic_final_link -#define aout_32_bfd_link_split_section _bfd_generic_link_split_section -#define aout_32_bfd_link_check_relocs _bfd_generic_link_check_relocs -#define aout_32_set_reloc _bfd_generic_set_reloc - -const bfd_target aout_adobe_vec = -{ - "a.out.adobe", /* Name. */ - bfd_target_aout_flavour, - BFD_ENDIAN_BIG, /* Data byte order is unknown (big assumed). */ - BFD_ENDIAN_BIG, /* Header byte order is big. */ - (HAS_RELOC | EXEC_P | /* Object flags. */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT ), - /* section flags */ - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_DATA | SEC_RELOC), - '_', /* Symbol leading char. */ - ' ', /* AR_pad_char. */ - 16, /* 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, /* Headers. */ - - { /* bfd_check_format. */ - _bfd_dummy_target, - aout_adobe_object_p, - bfd_generic_archive_p, - _bfd_dummy_target - }, - { /* bfd_set_format. */ - _bfd_bool_bfd_false_error, - aout_adobe_mkobject, - _bfd_generic_mkarchive, - _bfd_bool_bfd_false_error - }, - { /* bfd_write_contents. */ - _bfd_bool_bfd_false_error, - aout_adobe_write_object_contents, - _bfd_write_archive_contents, - _bfd_bool_bfd_false_error - }, - - BFD_JUMP_TABLE_GENERIC (aout_32), - BFD_JUMP_TABLE_COPY (_bfd_generic), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_bsd), - BFD_JUMP_TABLE_SYMBOLS (aout_32), - BFD_JUMP_TABLE_RELOCS (aout_32), - BFD_JUMP_TABLE_WRITE (aout_32), - BFD_JUMP_TABLE_LINK (aout_32), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - NULL, - - NULL -}; diff --git a/bfd/aoutx.h b/bfd/aoutx.h index 525e560..7809fac 100644 --- a/bfd/aoutx.h +++ b/bfd/aoutx.h @@ -33,9 +33,9 @@ DESCRIPTION The support is split into a basic support file @file{aoutx.h} and other files which derive functions from the base. One derivation file is @file{aoutf1.h} (for a.out flavour 1), and - adds to the basic a.out functions support for sun3, sun4, 386 - and 29k a.out files, to create a target jump vector for a - specific target. + adds to the basic a.out functions support for sun3, sun4, and + 386 a.out files, to create a target jump vector for a specific + target. This information is further split out into more specific files for each machine, including @file{sunos.c} for sun3 and sun4, @@ -136,10 +136,9 @@ DESCRIPTION The file @file{aoutx.h} provides for both the @emph{standard} and @emph{extended} forms of a.out relocation records. - The standard records contain only an - address, a symbol index, and a type field. The extended records - (used on 29ks and sparcs) also have a full integer for an - addend. */ + The standard records contain only an address, a symbol index, + and a type field. The extended records also have a full + integer for an addend. */ #ifndef CTOR_TABLE_RELOC_HOWTO #define CTOR_TABLE_RELOC_IDX 2 diff --git a/bfd/archive.c b/bfd/archive.c index d58f172..b949310 100644 --- a/bfd/archive.c +++ b/bfd/archive.c @@ -847,7 +847,6 @@ bfd_generic_archive_p (bfd *abfd) bfd_is_thin_archive (abfd) = (strncmp (armag, ARMAGT, SARMAG) == 0); if (strncmp (armag, ARMAG, SARMAG) != 0 - && strncmp (armag, ARMAGB, SARMAG) != 0 && ! bfd_is_thin_archive (abfd)) { bfd_set_error (bfd_error_wrong_format); @@ -1042,21 +1041,6 @@ do_slurp_coff_armap (bfd *abfd) nsymz = bfd_getb32 (int_buf); stringsize = parsed_size - (4 * nsymz) - 4; - /* ... except that some archive formats are broken, and it may be our - fault - the i960 little endian coff sometimes has big and sometimes - little, because our tools changed. Here's a horrible hack to clean - up the crap. */ - - if (stringsize > 0xfffff - && bfd_get_arch (abfd) == bfd_arch_i960 - && bfd_get_flavour (abfd) == bfd_target_coff_flavour) - { - /* This looks dangerous, let's do it the other way around. */ - nsymz = bfd_getl32 (int_buf); - stringsize = parsed_size - (4 * nsymz) - 4; - swap = bfd_getl32; - } - /* The coff armap must be read sequentially. So we construct a bsd-style one in core all at once, for simplicity. */ diff --git a/bfd/archures.c b/bfd/archures.c index 7327f5f..20868ecd 100644 --- a/bfd/archures.c +++ b/bfd/archures.c @@ -63,8 +63,7 @@ DESCRIPTION Another field indicates which processor within the family is in use. The machine gives a number which distinguishes different versions of the architecture, - containing, for example, 2 and 3 for Intel i960 KA and i960 KB, - and 68020 and 68030 for Motorola 68020 and 68030. + containing, for example, 68020 for Motorola 68020. .enum bfd_architecture .{ @@ -103,23 +102,6 @@ DESCRIPTION .#define bfd_mach_mcf_isa_c_nodiv_mac 30 .#define bfd_mach_mcf_isa_c_nodiv_emac 31 . bfd_arch_vax, {* DEC Vax. *} -. bfd_arch_i960, {* Intel 960. *} -. {* The order of the following is important. -. lower number indicates a machine type that -. only accepts a subset of the instructions -. available to machines with higher numbers. -. The exception is the "ca", which is -. incompatible with all other machines except -. "core". *} -. -.#define bfd_mach_i960_core 1 -.#define bfd_mach_i960_ka_sa 2 -.#define bfd_mach_i960_kb_sb 3 -.#define bfd_mach_i960_mc 4 -.#define bfd_mach_i960_xa 5 -.#define bfd_mach_i960_ca 6 -.#define bfd_mach_i960_jx 7 -.#define bfd_mach_i960_hx 8 . . bfd_arch_or1k, {* OpenRISC 1000. *} .#define bfd_mach_or1k 1 @@ -237,7 +219,6 @@ DESCRIPTION .#define bfd_mach_i386_iamcu_intel_syntax (bfd_mach_i386_iamcu | bfd_mach_i386_intel_syntax) . bfd_arch_we32k, {* AT&T WE32xxx. *} . bfd_arch_tahoe, {* CCI/Harris Tahoe. *} -. bfd_arch_i860, {* Intel 860. *} . bfd_arch_i370, {* IBM 360/370 Mainframes. *} . bfd_arch_romp, {* IBM ROMP PC/RT. *} . bfd_arch_convex, {* Convex. *} @@ -603,8 +584,6 @@ extern const bfd_arch_info_type bfd_hppa_arch; extern const bfd_arch_info_type bfd_i370_arch; extern const bfd_arch_info_type bfd_i386_arch; extern const bfd_arch_info_type bfd_iamcu_arch; -extern const bfd_arch_info_type bfd_i860_arch; -extern const bfd_arch_info_type bfd_i960_arch; extern const bfd_arch_info_type bfd_ia64_arch; extern const bfd_arch_info_type bfd_ip2k_arch; extern const bfd_arch_info_type bfd_iq2000_arch; @@ -698,8 +677,6 @@ static const bfd_arch_info_type * const bfd_archures_list[] = &bfd_i370_arch, &bfd_i386_arch, &bfd_iamcu_arch, - &bfd_i860_arch, - &bfd_i960_arch, &bfd_ia64_arch, &bfd_ip2k_arch, &bfd_iq2000_arch, diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index de5f68d..3f5d38b 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -1979,23 +1979,6 @@ enum bfd_architecture #define bfd_mach_mcf_isa_c_nodiv_mac 30 #define bfd_mach_mcf_isa_c_nodiv_emac 31 bfd_arch_vax, /* DEC Vax. */ - bfd_arch_i960, /* Intel 960. */ - /* The order of the following is important. - lower number indicates a machine type that - only accepts a subset of the instructions - available to machines with higher numbers. - The exception is the "ca", which is - incompatible with all other machines except - "core". */ - -#define bfd_mach_i960_core 1 -#define bfd_mach_i960_ka_sa 2 -#define bfd_mach_i960_kb_sb 3 -#define bfd_mach_i960_mc 4 -#define bfd_mach_i960_xa 5 -#define bfd_mach_i960_ca 6 -#define bfd_mach_i960_jx 7 -#define bfd_mach_i960_hx 8 bfd_arch_or1k, /* OpenRISC 1000. */ #define bfd_mach_or1k 1 @@ -2113,7 +2096,6 @@ enum bfd_architecture #define bfd_mach_i386_iamcu_intel_syntax (bfd_mach_i386_iamcu | bfd_mach_i386_intel_syntax) bfd_arch_we32k, /* AT&T WE32xxx. */ bfd_arch_tahoe, /* CCI/Harris Tahoe. */ - bfd_arch_i860, /* Intel 860. */ bfd_arch_i370, /* IBM 360/370 Mainframes. */ bfd_arch_romp, /* IBM ROMP PC/RT. */ bfd_arch_convex, /* Convex. */ @@ -2506,10 +2488,9 @@ typedef enum bfd_reloc_status /* The symbol to relocate against was undefined. */ bfd_reloc_undefined, - /* The relocation was performed, but may not be ok - presently - generated only when linking i960 coff files with i960 b.out - symbols. If this type is returned, the error_message argument - to bfd_perform_relocation will be set. */ + /* The relocation was performed, but may not be ok. If this type is + returned, the error_message argument to bfd_perform_relocation + will be set. */ bfd_reloc_dangerous } bfd_reloc_status_type; @@ -2589,8 +2570,7 @@ struct reloc_howto_struct /* If this field is non null, then the supplied function is called rather than the normal function. This allows really - strange relocation methods to be accommodated (e.g., i960 callj - instructions). */ + strange relocation methods to be accommodated. */ bfd_reloc_status_type (*special_function) (bfd *, arelent *, struct bfd_symbol *, void *, asection *, bfd *, char **); @@ -2715,9 +2695,7 @@ enum bfd_reloc_code_real { /* PC-relative relocations. Sometimes these are relative to the address of the relocation itself; sometimes they are relative to the start of -the section containing the relocation. It depends on the specific target. - -The 24-bit relocation is used in some Intel 960 configurations. */ +the section containing the relocation. It depends on the specific target. */ BFD_RELOC_64_PCREL, BFD_RELOC_32_PCREL, BFD_RELOC_24_PCREL, @@ -2809,9 +2787,6 @@ decided relatively late. */ BFD_RELOC_GPREL16, BFD_RELOC_GPREL32, -/* Reloc types used for i960/b.out. */ - BFD_RELOC_I960_CALLJ, - /* SPARC ELF relocations. There is probably some overlap with other relocation types already defined. */ BFD_RELOC_NONE, @@ -5435,40 +5410,6 @@ a matching LO8XG part. */ BFD_RELOC_CRIS_DTPMOD, BFD_RELOC_CRIS_32_IE, -/* Intel i860 Relocations. */ - BFD_RELOC_860_COPY, - BFD_RELOC_860_GLOB_DAT, - BFD_RELOC_860_JUMP_SLOT, - BFD_RELOC_860_RELATIVE, - BFD_RELOC_860_PC26, - BFD_RELOC_860_PLT26, - BFD_RELOC_860_PC16, - BFD_RELOC_860_LOW0, - BFD_RELOC_860_SPLIT0, - BFD_RELOC_860_LOW1, - BFD_RELOC_860_SPLIT1, - BFD_RELOC_860_LOW2, - BFD_RELOC_860_SPLIT2, - BFD_RELOC_860_LOW3, - BFD_RELOC_860_LOGOT0, - BFD_RELOC_860_SPGOT0, - BFD_RELOC_860_LOGOT1, - BFD_RELOC_860_SPGOT1, - BFD_RELOC_860_LOGOTOFF0, - BFD_RELOC_860_SPGOTOFF0, - BFD_RELOC_860_LOGOTOFF1, - BFD_RELOC_860_SPGOTOFF1, - BFD_RELOC_860_LOGOTOFF2, - BFD_RELOC_860_LOGOTOFF3, - BFD_RELOC_860_LOPC, - BFD_RELOC_860_HIGHADJ, - BFD_RELOC_860_HAGOT, - BFD_RELOC_860_HAGOTOFF, - BFD_RELOC_860_HAPC, - BFD_RELOC_860_HIGH, - BFD_RELOC_860_HIGOT, - BFD_RELOC_860_HIGOTOFF, - /* OpenRISC 1000 Relocations. */ BFD_RELOC_OR1K_REL_26, BFD_RELOC_OR1K_GOTPC_HI16, @@ -7076,7 +7017,6 @@ struct bfd struct tekhex_data_struct *tekhex_data; struct elf_obj_tdata *elf_obj_data; struct nlm_obj_tdata *nlm_obj_data; - struct bout_data_struct *bout_data; struct mmo_data_struct *mmo_data; struct sun_core_struct *sun_core_data; struct sco5_core_struct *sco5_core_data; @@ -318,7 +318,6 @@ CODE_FRAGMENT . struct tekhex_data_struct *tekhex_data; . struct elf_obj_tdata *elf_obj_data; . struct nlm_obj_tdata *nlm_obj_data; -. struct bout_data_struct *bout_data; . struct mmo_data_struct *mmo_data; . struct sun_core_struct *sun_core_data; . struct sco5_core_struct *sco5_core_data; diff --git a/bfd/bout.c b/bfd/bout.c deleted file mode 100644 index c766633..0000000 --- a/bfd/bout.c +++ /dev/null @@ -1,1508 +0,0 @@ -/* BFD back-end for Intel 960 b.out binaries. - Copyright (C) 1990-2018 Free Software Foundation, Inc. - Written by Cygnus Support. - - 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 "libbfd.h" -#include "bfdlink.h" -#include "genlink.h" -#include "bout.h" -#include "libiberty.h" - -#include "aout/stab_gnu.h" -#include "libaout.h" /* BFD a.out internal data structures. */ - -#define ABS32CODE 0 -#define ABS32CODE_SHRUNK 1 -#define PCREL24 2 -#define CALLJ 3 -#define ABS32 4 -#define PCREL13 5 -#define ABS32_MAYBE_RELAXABLE 1 -#define ABS32_WAS_RELAXABLE 2 - -#define ALIGNER 10 -#define ALIGNDONE 11 - -static reloc_howto_type howto_reloc_callj = - HOWTO (CALLJ, 0, 2, 24, TRUE, 0, complain_overflow_signed, 0,"callj", TRUE, 0x00ffffff, 0x00ffffff,FALSE); -static reloc_howto_type howto_reloc_abs32 = - HOWTO (ABS32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,0,"abs32", TRUE, 0xffffffff,0xffffffff,FALSE); -static reloc_howto_type howto_reloc_pcrel24 = - HOWTO (PCREL24, 0, 2, 24, TRUE, 0, complain_overflow_signed,0,"pcrel24", TRUE, 0x00ffffff,0x00ffffff,FALSE); -static reloc_howto_type howto_reloc_pcrel13 = - HOWTO (PCREL13, 0, 2, 13, TRUE, 0, complain_overflow_signed,0,"pcrel13", TRUE, 0x00001fff,0x00001fff,FALSE); -static reloc_howto_type howto_reloc_abs32codeshrunk = - HOWTO (ABS32CODE_SHRUNK, 0, 2, 24, TRUE, 0, complain_overflow_signed, 0,"callx->callj", TRUE, 0x00ffffff, 0x00ffffff,FALSE); -static reloc_howto_type howto_reloc_abs32code = - HOWTO (ABS32CODE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,0,"callx", TRUE, 0xffffffff,0xffffffff,FALSE); - -static reloc_howto_type howto_align_table[] = -{ - HOWTO (ALIGNER, 0, 0x1, 0, FALSE, 0, complain_overflow_dont, 0, "align16", FALSE, 0, 0, FALSE), - HOWTO (ALIGNER, 0, 0x3, 0, FALSE, 0, complain_overflow_dont, 0, "align32", FALSE, 0, 0, FALSE), - HOWTO (ALIGNER, 0, 0x7, 0, FALSE, 0, complain_overflow_dont, 0, "align64", FALSE, 0, 0, FALSE), - HOWTO (ALIGNER, 0, 0xf, 0, FALSE, 0, complain_overflow_dont, 0, "align128", FALSE, 0, 0, FALSE), -}; - -static reloc_howto_type howto_done_align_table[] = -{ - HOWTO (ALIGNDONE, 0x1, 0x1, 0, FALSE, 0, complain_overflow_dont, 0, "donealign16", FALSE, 0, 0, FALSE), - HOWTO (ALIGNDONE, 0x3, 0x3, 0, FALSE, 0, complain_overflow_dont, 0, "donealign32", FALSE, 0, 0, FALSE), - HOWTO (ALIGNDONE, 0x7, 0x7, 0, FALSE, 0, complain_overflow_dont, 0, "donealign64", FALSE, 0, 0, FALSE), - HOWTO (ALIGNDONE, 0xf, 0xf, 0, FALSE, 0, complain_overflow_dont, 0, "donealign128", FALSE, 0, 0, FALSE), -}; - -/* Swaps the information in an executable header taken from a raw byte - stream memory image, into the internal exec_header structure. */ - -static void -bout_swap_exec_header_in (bfd *abfd, - struct external_exec *bytes, - struct internal_exec *execp) -{ - /* Now fill in fields in the execp, from the bytes in the raw data. */ - execp->a_info = H_GET_32 (abfd, bytes->e_info); - execp->a_text = GET_WORD (abfd, bytes->e_text); - execp->a_data = GET_WORD (abfd, bytes->e_data); - execp->a_bss = GET_WORD (abfd, bytes->e_bss); - execp->a_syms = GET_WORD (abfd, bytes->e_syms); - execp->a_entry = GET_WORD (abfd, bytes->e_entry); - execp->a_trsize = GET_WORD (abfd, bytes->e_trsize); - execp->a_drsize = GET_WORD (abfd, bytes->e_drsize); - execp->a_tload = GET_WORD (abfd, bytes->e_tload); - execp->a_dload = GET_WORD (abfd, bytes->e_dload); - execp->a_talign = bytes->e_talign[0]; - execp->a_dalign = bytes->e_dalign[0]; - execp->a_balign = bytes->e_balign[0]; - execp->a_relaxable = bytes->e_relaxable[0]; -} - -/* Swaps the information in an internal exec header structure into the - supplied buffer ready for writing to disk. */ - -static void -bout_swap_exec_header_out (bfd *abfd, - struct internal_exec *execp, - struct external_exec *bytes) -{ - /* Now fill in fields in the raw data, from the fields in the exec struct. */ - H_PUT_32 (abfd, execp->a_info , bytes->e_info); - PUT_WORD (abfd, execp->a_text , bytes->e_text); - PUT_WORD (abfd, execp->a_data , bytes->e_data); - PUT_WORD (abfd, execp->a_bss , bytes->e_bss); - PUT_WORD (abfd, execp->a_syms , bytes->e_syms); - PUT_WORD (abfd, execp->a_entry , bytes->e_entry); - PUT_WORD (abfd, execp->a_trsize, bytes->e_trsize); - PUT_WORD (abfd, execp->a_drsize, bytes->e_drsize); - PUT_WORD (abfd, execp->a_tload , bytes->e_tload); - PUT_WORD (abfd, execp->a_dload , bytes->e_dload); - bytes->e_talign[0] = execp->a_talign; - bytes->e_dalign[0] = execp->a_dalign; - bytes->e_balign[0] = execp->a_balign; - bytes->e_relaxable[0] = execp->a_relaxable; -} - -/* Finish up the opening of a b.out file for reading. Fill in all the - fields that are not handled by common code. */ - -static const bfd_target * -b_out_callback (bfd *abfd) -{ - struct internal_exec *execp = exec_hdr (abfd); - unsigned long bss_start; - - /* Architecture and machine type. */ - bfd_set_arch_mach (abfd, - bfd_arch_i960, /* B.out only used on i960. */ - bfd_mach_i960_core /* Default. */ - ); - - /* The positions of the string table and symbol table. */ - obj_str_filepos (abfd) = N_STROFF (execp); - obj_sym_filepos (abfd) = N_SYMOFF (execp); - - /* The alignments of the sections. */ - obj_textsec (abfd)->alignment_power = execp->a_talign; - obj_datasec (abfd)->alignment_power = execp->a_dalign; - obj_bsssec (abfd)->alignment_power = execp->a_balign; - - /* The starting addresses of the sections. */ - obj_textsec (abfd)->vma = execp->a_tload; - obj_datasec (abfd)->vma = execp->a_dload; - - obj_textsec (abfd)->lma = obj_textsec (abfd)->vma; - obj_datasec (abfd)->lma = obj_datasec (abfd)->vma; - - /* And reload the sizes, since the aout module zaps them. */ - obj_textsec (abfd)->size = execp->a_text; - - bss_start = execp->a_dload + execp->a_data; /* BSS = end of data section. */ - obj_bsssec (abfd)->vma = align_power (bss_start, execp->a_balign); - - obj_bsssec (abfd)->lma = obj_bsssec (abfd)->vma; - - /* The file positions of the sections. */ - obj_textsec (abfd)->filepos = N_TXTOFF (execp); - obj_datasec (abfd)->filepos = N_DATOFF (execp); - - /* The file positions of the relocation info. */ - obj_textsec (abfd)->rel_filepos = N_TROFF (execp); - obj_datasec (abfd)->rel_filepos = N_DROFF (execp); - - adata (abfd).page_size = 1; /* Not applicable. */ - adata (abfd).segment_size = 1; /* Not applicable. */ - adata (abfd).exec_bytes_size = EXEC_BYTES_SIZE; - - if (execp->a_relaxable) - abfd->flags |= BFD_IS_RELAXABLE; - return abfd->xvec; -} - -static const bfd_target * -b_out_object_p (bfd *abfd) -{ - struct internal_exec anexec; - struct external_exec exec_bytes; - bfd_size_type amt = EXEC_BYTES_SIZE; - - if (bfd_bread ((void *) &exec_bytes, amt, abfd) != amt) - { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_wrong_format); - return 0; - } - - anexec.a_info = H_GET_32 (abfd, exec_bytes.e_info); - - if (N_BADMAG (&anexec)) - { - bfd_set_error (bfd_error_wrong_format); - return 0; - } - - bout_swap_exec_header_in (abfd, &exec_bytes, &anexec); - return aout_32_some_aout_object_p (abfd, &anexec, b_out_callback); -} - -struct bout_data_struct - { - struct aoutdata a; - struct internal_exec e; - }; - -static bfd_boolean -b_out_mkobject (bfd *abfd) -{ - struct bout_data_struct *rawptr; - bfd_size_type amt = sizeof (struct bout_data_struct); - - rawptr = bfd_zalloc (abfd, amt); - if (rawptr == NULL) - return FALSE; - - abfd->tdata.bout_data = rawptr; - exec_hdr (abfd) = &rawptr->e; - - obj_textsec (abfd) = NULL; - obj_datasec (abfd) = NULL; - obj_bsssec (abfd) = NULL; - - return TRUE; -} - -static int -b_out_symbol_cmp (const void * a_ptr, const void * b_ptr) -{ - struct aout_symbol ** a = (struct aout_symbol **) a_ptr; - struct aout_symbol ** b = (struct aout_symbol **) b_ptr; - asection *sec; - bfd_vma av, bv; - - /* Primary key is address. */ - sec = bfd_get_section (&(*a)->symbol); - av = sec->output_section->vma + sec->output_offset + (*a)->symbol.value; - sec = bfd_get_section (&(*b)->symbol); - bv = sec->output_section->vma + sec->output_offset + (*b)->symbol.value; - - if (av < bv) - return -1; - if (av > bv) - return 1; - - /* Secondary key puts CALLNAME syms last and BALNAME syms first, - so that they have the best chance of being contiguous. */ - if (IS_BALNAME ((*a)->other) || IS_CALLNAME ((*b)->other)) - return -1; - if (IS_CALLNAME ((*a)->other) || IS_BALNAME ((*b)->other)) - return 1; - - return 0; -} - -static bfd_boolean -b_out_squirt_out_relocs (bfd *abfd, asection *section) -{ - arelent **generic; - int r_extern = 0; - int r_idx; - int incode_mask; - int len_1; - unsigned int count = section->reloc_count; - struct relocation_info *native, *natptr; - bfd_size_type natsize; - int extern_mask, pcrel_mask, len_2, callj_mask; - - if (count == 0) - return TRUE; - - generic = section->orelocation; - natsize = (bfd_size_type) count * sizeof (struct relocation_info); - native = bfd_malloc (natsize); - if (!native && natsize != 0) - return FALSE; - - if (bfd_header_big_endian (abfd)) - { - /* Big-endian bit field allocation order. */ - pcrel_mask = 0x80; - extern_mask = 0x10; - len_2 = 0x40; - len_1 = 0x20; - callj_mask = 0x02; - incode_mask = 0x08; - } - else - { - /* Little-endian bit field allocation order. */ - pcrel_mask = 0x01; - extern_mask = 0x08; - len_2 = 0x04; - len_1 = 0x02; - callj_mask = 0x40; - incode_mask = 0x10; - } - - for (natptr = native; count > 0; --count, ++natptr, ++generic) - { - arelent *g = *generic; - unsigned char *raw = (unsigned char *) natptr; - asymbol *sym = *(g->sym_ptr_ptr); - asection *output_section = sym->section->output_section; - - H_PUT_32 (abfd, g->address, raw); - /* Find a type in the output format which matches the input howto - - at the moment we assume input format == output format FIXME!! */ - r_idx = 0; - /* FIXME: Need callj stuff here, and to check the howto entries to - be sure they are real for this architecture. */ - if (g->howto== &howto_reloc_callj) - raw[7] = callj_mask + pcrel_mask + len_2; - else if (g->howto == &howto_reloc_pcrel24) - raw[7] = pcrel_mask + len_2; - else if (g->howto == &howto_reloc_pcrel13) - raw[7] = pcrel_mask + len_1; - else if (g->howto == &howto_reloc_abs32code) - raw[7] = len_2 + incode_mask; - else if (g->howto >= howto_align_table - && g->howto <= (howto_align_table + ARRAY_SIZE (howto_align_table) - 1)) - { - /* symnum == -2; extern_mask not set, pcrel_mask set. */ - r_idx = -2; - r_extern = 0; - raw[7] = (pcrel_mask - | ((g->howto - howto_align_table) << 1)); - } - else - raw[7] = len_2; - - if (r_idx != 0) - /* Already mucked with r_extern, r_idx. */; - else if (bfd_is_com_section (output_section) - || bfd_is_abs_section (output_section) - || bfd_is_und_section (output_section)) - { - if (bfd_abs_section_ptr->symbol == sym) - { - /* Whoops, looked like an abs symbol, but is really an offset - from the abs section. */ - r_idx = 0; - r_extern = 0; - } - else - { - /* Fill in symbol. */ - r_extern = 1; - r_idx = (*g->sym_ptr_ptr)->udata.i; - } - } - else - { - /* Just an ordinary section. */ - r_extern = 0; - r_idx = output_section->target_index; - } - - if (bfd_header_big_endian (abfd)) - { - raw[4] = (unsigned char) (r_idx >> 16); - raw[5] = (unsigned char) (r_idx >> 8); - raw[6] = (unsigned char) (r_idx ); - } - else - { - raw[6] = (unsigned char) (r_idx >> 16); - raw[5] = (unsigned char) (r_idx>> 8); - raw[4] = (unsigned char) (r_idx ); - } - - if (r_extern) - raw[7] |= extern_mask; - } - - if (bfd_bwrite ((void *) native, natsize, abfd) != natsize) - { - free (native); - return FALSE; - } - - free (native); - - return TRUE; -} - -static bfd_boolean -b_out_write_object_contents (bfd *abfd) -{ - struct external_exec swapped_hdr; - bfd_size_type amt; - - if (! aout_32_make_sections (abfd)) - return FALSE; - - exec_hdr (abfd)->a_info = BMAGIC; - - exec_hdr (abfd)->a_text = obj_textsec (abfd)->size; - exec_hdr (abfd)->a_data = obj_datasec (abfd)->size; - exec_hdr (abfd)->a_bss = obj_bsssec (abfd)->size; - exec_hdr (abfd)->a_syms = bfd_get_symcount (abfd) * 12; - exec_hdr (abfd)->a_entry = bfd_get_start_address (abfd); - exec_hdr (abfd)->a_trsize = (obj_textsec (abfd)->reloc_count) * 8; - exec_hdr (abfd)->a_drsize = (obj_datasec (abfd)->reloc_count) * 8; - - exec_hdr (abfd)->a_talign = obj_textsec (abfd)->alignment_power; - exec_hdr (abfd)->a_dalign = obj_datasec (abfd)->alignment_power; - exec_hdr (abfd)->a_balign = obj_bsssec (abfd)->alignment_power; - - exec_hdr (abfd)->a_tload = obj_textsec (abfd)->vma; - exec_hdr (abfd)->a_dload = obj_datasec (abfd)->vma; - - bout_swap_exec_header_out (abfd, exec_hdr (abfd), &swapped_hdr); - - amt = EXEC_BYTES_SIZE; - if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0 - || bfd_bwrite ((void *) &swapped_hdr, amt, abfd) != amt) - return FALSE; - - /* Now write out reloc info, followed by syms and strings */ - if (bfd_get_symcount (abfd) != 0) - { - /* Make sure {CALL,BAL}NAME symbols remain adjacent on output - by sorting. This is complicated by the fact that stabs are - also ordered. Solve this by shifting all stabs to the end - in order, then sorting the rest. */ - - asymbol **outsyms, **p, **q; - - outsyms = bfd_get_outsymbols (abfd); - p = outsyms + bfd_get_symcount (abfd); - - for (q = p--; p >= outsyms; p--) - { - if ((*p)->flags & BSF_DEBUGGING) - { - asymbol *t = *--q; - *q = *p; - *p = t; - } - } - - if (q > outsyms) - qsort (outsyms, (size_t) (q - outsyms), sizeof (asymbol*), - b_out_symbol_cmp); - - /* Back to your regularly scheduled program. */ - if (bfd_seek (abfd, (file_ptr) (N_SYMOFF (exec_hdr (abfd))), SEEK_SET) - != 0) - return FALSE; - - if (! aout_32_write_syms (abfd)) - return FALSE; - - if (bfd_seek (abfd, (file_ptr) (N_TROFF (exec_hdr (abfd))), SEEK_SET) - != 0) - return FALSE; - - if (!b_out_squirt_out_relocs (abfd, obj_textsec (abfd))) - return FALSE; - if (bfd_seek (abfd, (file_ptr) (N_DROFF (exec_hdr (abfd))), SEEK_SET) - != 0) - return FALSE; - - if (!b_out_squirt_out_relocs (abfd, obj_datasec (abfd))) - return FALSE; - } - return TRUE; -} - -/* Some reloc hackery. */ - -#define CALLS 0x66003800 /* Template for 'calls' instruction */ -#define BAL 0x0b000000 /* Template for 'bal' instruction */ -#define BAL_MASK 0x00ffffff -#define BALX 0x85f00000 /* Template for 'balx' instruction */ -#define BALX_MASK 0x0007ffff -#define CALL 0x09000000 -#define PCREL13_MASK 0x1fff - -#define output_addr(sec) ((sec)->output_offset+(sec)->output_section->vma) - -static bfd_vma -get_value (arelent *reloc, - struct bfd_link_info *link_info, - asection *input_section) -{ - bfd_vma value; - asymbol *symbol = *(reloc->sym_ptr_ptr); - - /* A symbol holds a pointer to a section, and an offset from the - base of the section. To relocate, we find where the section will - live in the output and add that in. */ - if (bfd_is_und_section (symbol->section)) - { - struct bfd_link_hash_entry *h; - - /* The symbol is undefined in this BFD. Look it up in the - global linker hash table. FIXME: This should be changed when - we convert b.out to use a specific final_link function and - change the interface to bfd_relax_section to not require the - generic symbols. */ - h = bfd_wrapped_link_hash_lookup (input_section->owner, link_info, - bfd_asymbol_name (symbol), - FALSE, FALSE, TRUE); - if (h != (struct bfd_link_hash_entry *) NULL - && (h->type == bfd_link_hash_defined - || h->type == bfd_link_hash_defweak)) - value = h->u.def.value + output_addr (h->u.def.section); - else if (h != (struct bfd_link_hash_entry *) NULL - && h->type == bfd_link_hash_common) - value = h->u.c.size; - else - { - (*link_info->callbacks->undefined_symbol) - (link_info, bfd_asymbol_name (symbol), - input_section->owner, input_section, reloc->address, TRUE); - value = 0; - } - } - else - value = symbol->value + output_addr (symbol->section); - - /* Add the value contained in the relocation. */ - value += reloc->addend; - - return value; -} - -/* Magic to turn callx into calljx. */ - -static bfd_reloc_status_type -calljx_callback (bfd *abfd, - struct bfd_link_info *link_info, - arelent *reloc_entry, - void * src, - void * dst, - asection *input_section) -{ - int word = bfd_get_32 (abfd, src); - asymbol *symbol_in = *(reloc_entry->sym_ptr_ptr); - aout_symbol_type *symbol = aout_symbol (symbol_in); - bfd_vma value; - - value = get_value (reloc_entry, link_info, input_section); - - if (IS_CALLNAME (symbol->other)) - { - aout_symbol_type *balsym = symbol+1; - int inst = bfd_get_32 (abfd, (bfd_byte *) src-4); - - /* The next symbol should be an N_BALNAME. */ - BFD_ASSERT (IS_BALNAME (balsym->other)); - inst &= BALX_MASK; - inst |= BALX; - bfd_put_32 (abfd, (bfd_vma) inst, (bfd_byte *) dst-4); - symbol = balsym; - value = (symbol->symbol.value - + output_addr (symbol->symbol.section)); - } - - word += value + reloc_entry->addend; - - bfd_put_32 (abfd, (bfd_vma) word, dst); - return bfd_reloc_ok; -} - -/* Magic to turn call into callj. */ - -static bfd_reloc_status_type -callj_callback (bfd *abfd, - struct bfd_link_info *link_info, - arelent *reloc_entry, - void * data, - unsigned int srcidx, - unsigned int dstidx, - asection *input_section, - bfd_boolean shrinking) -{ - int word = bfd_get_32 (abfd, (bfd_byte *) data + srcidx); - asymbol *symbol_in = *(reloc_entry->sym_ptr_ptr); - aout_symbol_type *symbol = aout_symbol (symbol_in); - bfd_vma value; - - value = get_value (reloc_entry, link_info, input_section); - - if (IS_OTHER (symbol->other)) - /* Call to a system procedure - replace code with system - procedure number. */ - word = CALLS | (symbol->other - 1); - - else if (IS_CALLNAME (symbol->other)) - { - aout_symbol_type *balsym = symbol+1; - - /* The next symbol should be an N_BALNAME. */ - BFD_ASSERT (IS_BALNAME (balsym->other)); - - /* We are calling a leaf, so replace the call instruction with a - bal. */ - word = BAL | ((word - + output_addr (balsym->symbol.section) - + balsym->symbol.value + reloc_entry->addend - - dstidx - - output_addr (input_section)) - & BAL_MASK); - } - else if ((symbol->symbol.flags & BSF_SECTION_SYM) != 0) - { - /* A callj against a symbol in the same section is a fully - resolved relative call. We don't need to do anything here. - If the symbol is not in the same section, I'm not sure what - to do; fortunately, this case will probably never arise. */ - BFD_ASSERT (! shrinking); - BFD_ASSERT (symbol->symbol.section == input_section); - } - else - word = CALL | (((word & BAL_MASK) - + value - + reloc_entry->addend - - (shrinking ? dstidx : 0) - - output_addr (input_section)) - & BAL_MASK); - - bfd_put_32 (abfd, (bfd_vma) word, (bfd_byte *) data + dstidx); - return bfd_reloc_ok; -} - -static reloc_howto_type * -b_out_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, - bfd_reloc_code_real_type code) -{ - switch (code) - { - default: - return 0; - case BFD_RELOC_I960_CALLJ: - return &howto_reloc_callj; - case BFD_RELOC_32: - case BFD_RELOC_CTOR: - return &howto_reloc_abs32; - case BFD_RELOC_24_PCREL: - return &howto_reloc_pcrel24; - } -} - -static reloc_howto_type * -b_out_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, - const char *r_name) -{ - if (strcasecmp (howto_reloc_callj.name, r_name) == 0) - return &howto_reloc_callj; - if (strcasecmp (howto_reloc_abs32.name, r_name) == 0) - return &howto_reloc_abs32; - if (strcasecmp (howto_reloc_pcrel24.name, r_name) == 0) - return &howto_reloc_pcrel24; - - return NULL; -} - -/* Allocate enough room for all the reloc entries, plus pointers to them all. */ - -static bfd_boolean -b_out_slurp_reloc_table (bfd *abfd, sec_ptr asect, asymbol **symbols) -{ - struct relocation_info *rptr; - unsigned int counter; - arelent *cache_ptr; - int extern_mask, pcrel_mask, callj_mask, length_shift; - int incode_mask; - int size_mask; - bfd_vma prev_addr = 0; - unsigned int count; - bfd_size_type reloc_size, amt; - struct relocation_info *relocs; - arelent *reloc_cache; - - if (asect->relocation) - return TRUE; - - if (!aout_32_slurp_symbol_table (abfd)) - return FALSE; - - if (asect == obj_datasec (abfd)) - reloc_size = exec_hdr (abfd)->a_drsize; - else if (asect == obj_textsec (abfd)) - reloc_size = exec_hdr (abfd)->a_trsize; - else if (asect == obj_bsssec (abfd)) - reloc_size = 0; - else - { - bfd_set_error (bfd_error_invalid_operation); - return FALSE; - } - - if (bfd_seek (abfd, asect->rel_filepos, SEEK_SET) != 0) - return FALSE; - count = reloc_size / sizeof (struct relocation_info); - - relocs = bfd_malloc (reloc_size); - if (!relocs && reloc_size != 0) - return FALSE; - - amt = ((bfd_size_type) count + 1) * sizeof (arelent); - reloc_cache = bfd_malloc (amt); - if (!reloc_cache) - { - if (relocs != NULL) - free (relocs); - return FALSE; - } - - if (bfd_bread ((void *) relocs, reloc_size, abfd) != reloc_size) - { - free (reloc_cache); - if (relocs != NULL) - free (relocs); - return FALSE; - } - - if (bfd_header_big_endian (abfd)) - { - /* Big-endian bit field allocation order. */ - pcrel_mask = 0x80; - extern_mask = 0x10; - incode_mask = 0x08; - callj_mask = 0x02; - size_mask = 0x20; - length_shift = 5; - } - else - { - /* Little-endian bit field allocation order. */ - pcrel_mask = 0x01; - extern_mask = 0x08; - incode_mask = 0x10; - callj_mask = 0x40; - size_mask = 0x02; - length_shift = 1; - } - - for (rptr = relocs, cache_ptr = reloc_cache, counter = 0; - counter < count; - counter++, rptr++, cache_ptr++) - { - unsigned char *raw = (unsigned char *)rptr; - unsigned int symnum; - - cache_ptr->address = H_GET_32 (abfd, raw + 0); - cache_ptr->howto = 0; - - if (bfd_header_big_endian (abfd)) - symnum = (raw[4] << 16) | (raw[5] << 8) | raw[6]; - else - symnum = (raw[6] << 16) | (raw[5] << 8) | raw[4]; - - if (raw[7] & extern_mask) - { - /* If this is set then the r_index is an index into the symbol table; - if the bit is not set then r_index contains a section map. - We either fill in the sym entry with a pointer to the symbol, - or point to the correct section. */ - cache_ptr->sym_ptr_ptr = symbols + symnum; - cache_ptr->addend = 0; - } - else - { - /* In a.out symbols are relative to the beginning of the - file rather than sections ? - (look in translate_from_native_sym_flags) - The reloc entry addend has added to it the offset into the - file of the data, so subtract the base to make the reloc - section relative. */ - int s; - - /* Sign-extend symnum from 24 bits to whatever host uses. */ - s = symnum; - if (s & (1 << 23)) - s |= (~0U) << 24; - - cache_ptr->sym_ptr_ptr = (asymbol **)NULL; - switch (s) - { - case N_TEXT: - case N_TEXT | N_EXT: - cache_ptr->sym_ptr_ptr = obj_textsec (abfd)->symbol_ptr_ptr; - cache_ptr->addend = - obj_textsec (abfd)->vma; - break; - case N_DATA: - case N_DATA | N_EXT: - cache_ptr->sym_ptr_ptr = obj_datasec (abfd)->symbol_ptr_ptr; - cache_ptr->addend = - obj_datasec (abfd)->vma; - break; - case N_BSS: - case N_BSS | N_EXT: - cache_ptr->sym_ptr_ptr = obj_bsssec (abfd)->symbol_ptr_ptr; - cache_ptr->addend = - obj_bsssec (abfd)->vma; - break; - case N_ABS: - case N_ABS | N_EXT: - cache_ptr->sym_ptr_ptr = obj_bsssec (abfd)->symbol_ptr_ptr; - cache_ptr->addend = 0; - break; - case -2: /* .align */ - if (raw[7] & pcrel_mask) - { - cache_ptr->howto = &howto_align_table[(raw[7] >> length_shift) & 3]; - cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; - } - else - { - /* .org? */ - abort (); - } - cache_ptr->addend = 0; - break; - default: - BFD_ASSERT (FALSE); - break; - } - } - - /* The i960 only has a few relocation types: - abs 32-bit and pcrel 24bit. except for callj's! */ - if (cache_ptr->howto != 0) - ; - else if (raw[7] & callj_mask) - { - cache_ptr->howto = &howto_reloc_callj; - } - else if ( raw[7] & pcrel_mask) - { - if (raw[7] & size_mask) - cache_ptr->howto = &howto_reloc_pcrel13; - else - cache_ptr->howto = &howto_reloc_pcrel24; - } - else - { - if (raw[7] & incode_mask) - cache_ptr->howto = &howto_reloc_abs32code; - else - cache_ptr->howto = &howto_reloc_abs32; - } - - if (cache_ptr->address < prev_addr) - { - /* Ouch! this reloc is out of order, insert into the right place. */ - arelent tmp; - arelent *cursor = cache_ptr-1; - bfd_vma stop = cache_ptr->address; - - tmp = *cache_ptr; - while (cursor->address > stop && cursor >= reloc_cache) - { - cursor[1] = cursor[0]; - cursor--; - } - - cursor[1] = tmp; - } - else - prev_addr = cache_ptr->address; - } - - if (relocs != NULL) - free (relocs); - asect->relocation = reloc_cache; - asect->reloc_count = count; - - return TRUE; -} - -/* This is stupid. This function should be a boolean predicate. */ - -static long -b_out_canonicalize_reloc (bfd *abfd, - sec_ptr section, - arelent **relptr, - asymbol **symbols) -{ - arelent *tblptr; - unsigned int count; - - if ((section->flags & SEC_CONSTRUCTOR) != 0) - { - arelent_chain *chain = section->constructor_chain; - - for (count = 0; count < section->reloc_count; count++) - { - *relptr++ = &chain->relent; - chain = chain->next; - } - } - else - { - if (section->relocation == NULL - && ! b_out_slurp_reloc_table (abfd, section, symbols)) - return -1; - - tblptr = section->relocation; - for (count = 0; count++ < section->reloc_count;) - *relptr++ = tblptr++; - } - - *relptr = NULL; - - return section->reloc_count; -} - -static long -b_out_get_reloc_upper_bound (bfd *abfd, sec_ptr asect) -{ - if (bfd_get_format (abfd) != bfd_object) - { - bfd_set_error (bfd_error_invalid_operation); - return -1; - } - - if (asect->flags & SEC_CONSTRUCTOR) - return sizeof (arelent *) * (asect->reloc_count + 1); - - if (asect == obj_datasec (abfd)) - return (sizeof (arelent *) * - ((exec_hdr (abfd)->a_drsize / sizeof (struct relocation_info)) - + 1)); - - if (asect == obj_textsec (abfd)) - return (sizeof (arelent *) * - ((exec_hdr (abfd)->a_trsize / sizeof (struct relocation_info)) - + 1)); - - if (asect == obj_bsssec (abfd)) - return 0; - - bfd_set_error (bfd_error_invalid_operation); - return -1; -} - - -static bfd_boolean -b_out_set_section_contents (bfd *abfd, - asection *section, - const void * location, - file_ptr offset, - bfd_size_type count) -{ - if (! abfd->output_has_begun) - { - /* Set by bfd.c handler. */ - if (! aout_32_make_sections (abfd)) - return FALSE; - - obj_textsec (abfd)->filepos = sizeof (struct external_exec); - obj_datasec (abfd)->filepos = obj_textsec (abfd)->filepos - + obj_textsec (abfd)->size; - } - - /* Regardless, once we know what we're doing, we might as well get going. */ - if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0) - return FALSE; - - if (count == 0) - return TRUE; - - return bfd_bwrite ((void *) location, count, abfd) == count; -} - -static bfd_boolean -b_out_set_arch_mach (bfd *abfd, - enum bfd_architecture arch, - unsigned long machine) -{ - bfd_default_set_arch_mach (abfd, arch, machine); - - if (arch == bfd_arch_unknown) /* Unknown machine arch is OK. */ - return TRUE; - - if (arch == bfd_arch_i960) /* i960 default is OK. */ - switch (machine) - { - case bfd_mach_i960_core: - case bfd_mach_i960_kb_sb: - case bfd_mach_i960_mc: - case bfd_mach_i960_xa: - case bfd_mach_i960_ca: - case bfd_mach_i960_ka_sa: - case bfd_mach_i960_jx: - case bfd_mach_i960_hx: - case 0: - return TRUE; - default: - return FALSE; - } - - return FALSE; -} - -static int -b_out_sizeof_headers (bfd *ignore_abfd ATTRIBUTE_UNUSED, - struct bfd_link_info *info ATTRIBUTE_UNUSED) -{ - return sizeof (struct external_exec); -} - -static void -perform_slip (bfd *abfd, - unsigned int slip, - asection *input_section, - bfd_vma value) -{ - asymbol **s; - - s = _bfd_generic_link_get_symbols (abfd); - BFD_ASSERT (s != (asymbol **) NULL); - - /* Find all symbols past this point, and make them know - what's happened. */ - while (*s) - { - asymbol *p = *s; - - if (p->section == input_section) - { - /* This was pointing into this section, so mangle it. */ - if (p->value > value) - { - p->value -=slip; - - if (p->udata.p != NULL) - { - struct generic_link_hash_entry *h; - - h = (struct generic_link_hash_entry *) p->udata.p; - BFD_ASSERT (h->root.type == bfd_link_hash_defined); - h->root.u.def.value -= slip; - BFD_ASSERT (h->root.u.def.value == p->value); - } - } - } - s++; - } -} - -/* This routine works out if the thing we want to get to can be - reached with a 24bit offset instead of a 32 bit one. - If it can, then it changes the amode. */ - -static int -abs32code (bfd *abfd, - asection *input_section, - arelent *r, - unsigned int shrink, - struct bfd_link_info *link_info) -{ - bfd_vma value = get_value (r, link_info, input_section); - bfd_vma dot = output_addr (input_section) + r->address; - bfd_vma gap; - - /* See if the address we're looking at within 2^23 bytes of where - we are, if so then we can use a small branch rather than the - jump we were going to. */ - gap = value - (dot - shrink); - - if ((long)(-1UL << 23) < (long)gap && (long)gap < 1L << 23) - { - /* Change the reloc type from 32bitcode possible 24, to 24bit - possible 32. */ - r->howto = &howto_reloc_abs32codeshrunk; - /* The place to relc moves back by four bytes. */ - r->address -=4; - - /* This will be four bytes smaller in the long run. */ - shrink += 4 ; - perform_slip (abfd, 4, input_section, r->address-shrink + 4); - } - - return shrink; -} - -static int -aligncode (bfd *abfd, - asection *input_section, - arelent *r, - unsigned int shrink) -{ - bfd_vma dot = output_addr (input_section) + r->address; - bfd_vma old_end; - bfd_vma new_end; - unsigned int shrink_delta; - int size = r->howto->size; - - /* Reduce the size of the alignment so that it's still aligned but - smaller - the current size is already the same size as or bigger - than the alignment required. */ - - /* Calculate the first byte following the padding before we optimize. */ - old_end = ((dot + size ) & ~size) + size+1; - /* Work out where the new end will be - remember that we're smaller - than we used to be. */ - new_end = ((dot - shrink + size) & ~size); - - shrink_delta = (old_end - new_end) - shrink; - - if (shrink_delta) - { - /* Change the reloc so that it knows how far to align to. */ - r->howto = howto_done_align_table + (r->howto - howto_align_table); - - /* Encode the stuff into the addend - for future use we need to - know how big the reloc used to be. */ - r->addend = old_end - dot + r->address; - - /* This will be N bytes smaller in the long run, adjust all the symbols. */ - perform_slip (abfd, shrink_delta, input_section, r->address - shrink); - shrink += shrink_delta; - } - - return shrink; -} - -static bfd_boolean -b_out_bfd_relax_section (bfd *abfd, - asection *i, - struct bfd_link_info *link_info, - bfd_boolean *again) -{ - /* Get enough memory to hold the stuff. */ - bfd *input_bfd = i->owner; - asection *input_section = i; - unsigned int shrink = 0 ; - arelent **reloc_vector = NULL; - long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section); - - if (bfd_link_relocatable (link_info)) - (*link_info->callbacks->einfo) - (_("%P%F: --relax and -r may not be used together\n")); - - if (reloc_size < 0) - return FALSE; - - /* We only run this relaxation once. It might work to run it - multiple times, but it hasn't been tested. */ - *again = FALSE; - - if (reloc_size) - { - long reloc_count; - - reloc_vector = bfd_malloc ((bfd_size_type) reloc_size); - if (reloc_vector == NULL && reloc_size != 0) - goto error_return; - - /* Get the relocs and think about them. */ - reloc_count = - bfd_canonicalize_reloc (input_bfd, input_section, reloc_vector, - _bfd_generic_link_get_symbols (input_bfd)); - if (reloc_count < 0) - goto error_return; - if (reloc_count > 0) - { - arelent **parent; - - for (parent = reloc_vector; *parent; parent++) - { - arelent *r = *parent; - - switch (r->howto->type) - { - case ALIGNER: - /* An alignment reloc. */ - shrink = aligncode (abfd, input_section, r, shrink); - break; - case ABS32CODE: - /* A 32bit reloc in an addressing mode. */ - shrink = abs32code (input_bfd, input_section, r, shrink, - link_info); - break; - case ABS32CODE_SHRUNK: - shrink += 4; - break; - } - } - } - } - input_section->size -= shrink; - - if (reloc_vector != NULL) - free (reloc_vector); - return TRUE; - error_return: - if (reloc_vector != NULL) - free (reloc_vector); - return FALSE; -} - -static bfd_byte * -b_out_bfd_get_relocated_section_contents (bfd *output_bfd, - struct bfd_link_info *link_info, - struct bfd_link_order *link_order, - bfd_byte *data, - bfd_boolean relocatable, - asymbol **symbols) -{ - /* Get enough memory to hold the stuff. */ - bfd *input_bfd = link_order->u.indirect.section->owner; - asection *input_section = link_order->u.indirect.section; - long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section); - arelent **reloc_vector = NULL; - long reloc_count; - - if (reloc_size < 0) - goto error_return; - - /* If producing relocatable output, don't bother to relax. */ - if (relocatable) - return bfd_generic_get_relocated_section_contents (output_bfd, link_info, - link_order, - data, relocatable, - symbols); - - reloc_vector = bfd_malloc ((bfd_size_type) reloc_size); - if (reloc_vector == NULL && reloc_size != 0) - goto error_return; - - /* Read in the section. */ - BFD_ASSERT (bfd_get_section_contents (input_bfd, - input_section, - data, - (bfd_vma) 0, - input_section->size)); - - reloc_count = bfd_canonicalize_reloc (input_bfd, - input_section, - reloc_vector, - symbols); - if (reloc_count < 0) - goto error_return; - if (reloc_count > 0) - { - arelent **parent = reloc_vector; - arelent *reloc ; - unsigned int dst_address = 0; - unsigned int src_address = 0; - unsigned int run; - unsigned int idx; - - /* Find how long a run we can do. */ - while (dst_address < link_order->size) - { - reloc = *parent; - if (reloc) - { - /* Note that the relaxing didn't tie up the addresses in the - relocation, so we use the original address to work out the - run of non-relocated data. */ - BFD_ASSERT (reloc->address >= src_address); - run = reloc->address - src_address; - parent++; - } - else - run = link_order->size - dst_address; - - /* Copy the bytes. */ - for (idx = 0; idx < run; idx++) - data[dst_address++] = data[src_address++]; - - /* Now do the relocation. */ - if (reloc) - { - switch (reloc->howto->type) - { - case ABS32CODE: - calljx_callback (input_bfd, link_info, reloc, - src_address + data, dst_address + data, - input_section); - src_address += 4; - dst_address += 4; - break; - case ABS32: - bfd_put_32 (input_bfd, - (bfd_get_32 (input_bfd, data + src_address) - + get_value (reloc, link_info, input_section)), - data + dst_address); - src_address += 4; - dst_address += 4; - break; - case CALLJ: - callj_callback (input_bfd, link_info, reloc, data, - src_address, dst_address, input_section, - FALSE); - src_address += 4; - dst_address += 4; - break; - case ALIGNDONE: - BFD_ASSERT (reloc->addend >= src_address); - BFD_ASSERT ((bfd_vma) reloc->addend - <= input_section->size); - src_address = reloc->addend; - dst_address = ((dst_address + reloc->howto->size) - & ~reloc->howto->size); - break; - case ABS32CODE_SHRUNK: - /* This used to be a callx, but we've found out that a - callj will reach, so do the right thing. */ - callj_callback (input_bfd, link_info, reloc, data, - src_address + 4, dst_address, input_section, - TRUE); - dst_address += 4; - src_address += 8; - break; - case PCREL24: - { - long int word = bfd_get_32 (input_bfd, - data + src_address); - bfd_vma value; - - value = get_value (reloc, link_info, input_section); - word = ((word & ~BAL_MASK) - | (((word & BAL_MASK) - + value - - output_addr (input_section) - + reloc->addend) - & BAL_MASK)); - - bfd_put_32 (input_bfd, (bfd_vma) word, data + dst_address); - dst_address += 4; - src_address += 4; - - } - break; - case PCREL13: - { - long int word = bfd_get_32 (input_bfd, - data + src_address); - bfd_vma value; - - value = get_value (reloc, link_info, input_section); - word = ((word & ~PCREL13_MASK) - | (((word & PCREL13_MASK) - + value - + reloc->addend - - output_addr (input_section)) - & PCREL13_MASK)); - - bfd_put_32 (input_bfd, (bfd_vma) word, data + dst_address); - dst_address += 4; - src_address += 4; - } - break; - - default: - abort (); - } - } - } - } - if (reloc_vector != NULL) - free (reloc_vector); - return data; - error_return: - if (reloc_vector != NULL) - free (reloc_vector); - return NULL; -} - - -/* Build the transfer vectors for Big and Little-Endian B.OUT files. */ - -#define aout_32_find_line _bfd_nosymbols_find_line -#define aout_32_get_symbol_version_string _bfd_nosymbols_get_symbol_version_string -#define aout_32_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol -#define aout_32_close_and_cleanup aout_32_bfd_free_cached_info -#define b_out_bfd_link_hash_table_create _bfd_generic_link_hash_table_create -#define b_out_bfd_link_add_symbols _bfd_generic_link_add_symbols -#define b_out_bfd_link_just_syms _bfd_generic_link_just_syms -#define b_out_bfd_copy_link_hash_symbol_type \ - _bfd_generic_copy_link_hash_symbol_type -#define b_out_bfd_final_link _bfd_generic_final_link -#define b_out_bfd_link_split_section _bfd_generic_link_split_section -#define b_out_bfd_gc_sections bfd_generic_gc_sections -#define b_out_bfd_lookup_section_flags bfd_generic_lookup_section_flags -#define b_out_bfd_merge_sections bfd_generic_merge_sections -#define b_out_bfd_is_group_section bfd_generic_is_group_section -#define b_out_bfd_discard_group bfd_generic_discard_group -#define b_out_section_already_linked _bfd_generic_section_already_linked -#define b_out_bfd_define_common_symbol bfd_generic_define_common_symbol -#define b_out_bfd_define_start_stop bfd_generic_define_start_stop -#define aout_32_get_section_contents_in_window _bfd_generic_get_section_contents_in_window -#define b_out_bfd_link_check_relocs _bfd_generic_link_check_relocs -#define b_out_set_reloc _bfd_generic_set_reloc - -extern const bfd_target bout_le_vec; - -const bfd_target bout_be_vec = -{ - "b.out.big", /* Name. */ - bfd_target_aout_flavour, - BFD_ENDIAN_LITTLE, /* Data byte order. */ - BFD_ENDIAN_BIG, /* Header byte order. */ - (HAS_RELOC | EXEC_P | /* Object flags. */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | BFD_IS_RELAXABLE ), - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA), - '_', /* Symbol leading char. */ - ' ', /* AR_pad_char. */ - 16, /* 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, /* Headers. */ - - { /* bfd_check_format. */ - _bfd_dummy_target, - b_out_object_p, - bfd_generic_archive_p, - _bfd_dummy_target - }, - { /* bfd_set_format. */ - _bfd_bool_bfd_false_error, - b_out_mkobject, - _bfd_generic_mkarchive, - _bfd_bool_bfd_false_error - }, - { /* bfd_write_contents. */ - _bfd_bool_bfd_false_error, - b_out_write_object_contents, - _bfd_write_archive_contents, - _bfd_bool_bfd_false_error - }, - - BFD_JUMP_TABLE_GENERIC (aout_32), - BFD_JUMP_TABLE_COPY (_bfd_generic), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_bsd), - BFD_JUMP_TABLE_SYMBOLS (aout_32), - BFD_JUMP_TABLE_RELOCS (b_out), - BFD_JUMP_TABLE_WRITE (b_out), - BFD_JUMP_TABLE_LINK (b_out), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - &bout_le_vec, - - NULL -}; - -const bfd_target bout_le_vec = -{ - "b.out.little", /* Name. */ - bfd_target_aout_flavour, - BFD_ENDIAN_LITTLE, /* Data byte order. */ - BFD_ENDIAN_LITTLE, /* Header byte order. */ - (HAS_RELOC | EXEC_P | /* Object flags. */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | BFD_IS_RELAXABLE ), - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA), - '_', /* Symbol leading char. */ - ' ', /* AR_pad_char. */ - 16, /* 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. */ - - { /* bfd_check_format. */ - _bfd_dummy_target, - b_out_object_p, - bfd_generic_archive_p, - _bfd_dummy_target - }, - { /* bfd_set_format. */ - _bfd_bool_bfd_false_error, - b_out_mkobject, - _bfd_generic_mkarchive, - _bfd_bool_bfd_false_error - }, - { /* bfd_write_contents. */ - _bfd_bool_bfd_false_error, - b_out_write_object_contents, - _bfd_write_archive_contents, - _bfd_bool_bfd_false_error - }, - - BFD_JUMP_TABLE_GENERIC (aout_32), - BFD_JUMP_TABLE_COPY (_bfd_generic), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_bsd), - BFD_JUMP_TABLE_SYMBOLS (aout_32), - BFD_JUMP_TABLE_RELOCS (b_out), - BFD_JUMP_TABLE_WRITE (b_out), - BFD_JUMP_TABLE_LINK (b_out), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - &bout_be_vec, - - NULL -}; diff --git a/bfd/coff-i860.c b/bfd/coff-i860.c deleted file mode 100644 index 9ff96ea..0000000 --- a/bfd/coff-i860.c +++ /dev/null @@ -1,730 +0,0 @@ -/* BFD back-end for Intel i860 COFF files. - Copyright (C) 1990-2018 Free Software Foundation, Inc. - Created mostly by substituting "860" for "386" in coff-i386.c - Harry Dolan <dolan@ssd.intel.com>, October 1995 - - 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 "libbfd.h" - -#include "coff/i860.h" - -#include "coff/internal.h" - -#ifndef bfd_pe_print_pdata -#define bfd_pe_print_pdata NULL -#endif - -#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 i860 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_i860_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 == (bfd *) NULL) - return bfd_reloc_continue; - - if (bfd_is_com_section (symbol->section)) - { - /* 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 - { - /* 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 860 - 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->dst_mask)) - - if (diff != 0) - { - reloc_howto_type *howto = reloc_entry->howto; - unsigned char *addr = (unsigned char *) data + reloc_entry->address; - - if (! bfd_reloc_offset_in_range (howto, abfd, input_section, - reloc_entry->address - * bfd_octets_per_byte (abfd))) - return bfd_reloc_outofrange; - - 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; -} - -/* This is just a temporary measure until we teach bfd to generate - these relocations. */ - -static bfd_reloc_status_type -coff_i860_reloc_nyi (bfd *abfd, - arelent *reloc_entry, - asymbol *symbol ATTRIBUTE_UNUSED, - void *data ATTRIBUTE_UNUSED, - asection *input_section ATTRIBUTE_UNUSED, - bfd *output_bfd ATTRIBUTE_UNUSED, - char **error_message ATTRIBUTE_UNUSED) -{ - reloc_howto_type *howto = reloc_entry->howto; - _bfd_error_handler (_("%pB: %s unsupported"), abfd, howto->name); - return bfd_reloc_notsupported; -} - -#ifndef PCRELOFFSET -#define PCRELOFFSET FALSE -#endif - -static reloc_howto_type howto_table[] = -{ - EMPTY_HOWTO (0), - EMPTY_HOWTO (1), - EMPTY_HOWTO (2), - EMPTY_HOWTO (3), - EMPTY_HOWTO (4), - EMPTY_HOWTO (5), - HOWTO (R_DIR32, /* 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_i860_reloc, /* special_function */ - "dir32", /* name */ - TRUE, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - TRUE), /* pcrel_offset */ - /* {7}, */ - HOWTO (R_IMAGEBASE, /* 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_i860_reloc, /* special_function */ - "rva32", /* name */ - TRUE, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - EMPTY_HOWTO (010), - EMPTY_HOWTO (011), - EMPTY_HOWTO (012), - EMPTY_HOWTO (013), - EMPTY_HOWTO (014), - EMPTY_HOWTO (015), - EMPTY_HOWTO (016), - HOWTO (R_RELBYTE, /* type */ - 0, /* rightshift */ - 0, /* size (0 = byte, 1 = short, 2 = long) */ - 8, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - coff_i860_reloc, /* special_function */ - "8", /* name */ - TRUE, /* partial_inplace */ - 0x000000ff, /* src_mask */ - 0x000000ff, /* dst_mask */ - PCRELOFFSET), /* pcrel_offset */ - HOWTO (R_RELWORD, /* 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_i860_reloc, /* special_function */ - "16", /* name */ - TRUE, /* partial_inplace */ - 0x0000ffff, /* src_mask */ - 0x0000ffff, /* dst_mask */ - PCRELOFFSET), /* pcrel_offset */ - HOWTO (R_RELLONG, /* 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_i860_reloc, /* special_function */ - "32", /* name */ - TRUE, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - PCRELOFFSET), /* pcrel_offset */ - HOWTO (R_PCRBYTE, /* type */ - 0, /* rightshift */ - 0, /* size (0 = byte, 1 = short, 2 = long) */ - 8, /* bitsize */ - TRUE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - coff_i860_reloc, /* special_function */ - "DISP8", /* name */ - TRUE, /* partial_inplace */ - 0x000000ff, /* src_mask */ - 0x000000ff, /* dst_mask */ - PCRELOFFSET), /* pcrel_offset */ - HOWTO (R_PCRWORD, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - TRUE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - coff_i860_reloc, /* special_function */ - "DISP16", /* name */ - TRUE, /* partial_inplace */ - 0x0000ffff, /* src_mask */ - 0x0000ffff, /* dst_mask */ - PCRELOFFSET), /* pcrel_offset */ - HOWTO (R_PCRLONG, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - TRUE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - coff_i860_reloc, /* special_function */ - "DISP32", /* name */ - TRUE, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - PCRELOFFSET), /* pcrel_offset */ - EMPTY_HOWTO (0x15), - EMPTY_HOWTO (0x16), - EMPTY_HOWTO (0x17), - EMPTY_HOWTO (0x18), - EMPTY_HOWTO (0x19), - EMPTY_HOWTO (0x1a), - EMPTY_HOWTO (0x1b), - HOWTO (COFF860_R_PAIR, /* 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_i860_reloc_nyi, /* special_function */ - "PAIR", /* name */ - FALSE, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - EMPTY_HOWTO (0x1d), - HOWTO (COFF860_R_HIGH, /* type */ - 16, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - coff_i860_reloc, /* special_function */ - "HIGH", /* name */ - FALSE, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - HOWTO (COFF860_R_LOW0, /* 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_i860_reloc, /* special_function */ - "LOW0", /* name */ - FALSE, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - HOWTO (COFF860_R_LOW1, /* 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_i860_reloc, /* special_function */ - "LOW1", /* name */ - FALSE, /* partial_inplace */ - 0xfffe, /* src_mask */ - 0xfffe, /* dst_mask */ - FALSE), /* pcrel_offset */ - HOWTO (COFF860_R_LOW2, /* 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_i860_reloc, /* special_function */ - "LOW2", /* name */ - FALSE, /* partial_inplace */ - 0xfffc, /* src_mask */ - 0xfffc, /* dst_mask */ - FALSE), /* pcrel_offset */ - HOWTO (COFF860_R_LOW3, /* 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_i860_reloc, /* special_function */ - "LOW3", /* name */ - FALSE, /* partial_inplace */ - 0xfff8, /* src_mask */ - 0xfff8, /* dst_mask */ - FALSE), /* pcrel_offset */ - HOWTO (COFF860_R_LOW4, /* 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_i860_reloc, /* special_function */ - "LOW4", /* name */ - FALSE, /* partial_inplace */ - 0xfff0, /* src_mask */ - 0xfff0, /* dst_mask */ - FALSE), /* pcrel_offset */ - HOWTO (COFF860_R_SPLIT0, /* 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_i860_reloc_nyi, /* special_function */ - "SPLIT0", /* name */ - FALSE, /* partial_inplace */ - 0x1f07ff, /* src_mask */ - 0x1f07ff, /* dst_mask */ - FALSE), /* pcrel_offset */ - HOWTO (COFF860_R_SPLIT1, /* 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_i860_reloc_nyi, /* special_function */ - "SPLIT1", /* name */ - FALSE, /* partial_inplace */ - 0x1f07fe, /* src_mask */ - 0x1f07fe, /* dst_mask */ - FALSE), /* pcrel_offset */ - HOWTO (COFF860_R_SPLIT2, /* 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_i860_reloc_nyi, /* special_function */ - "SPLIT2", /* name */ - FALSE, /* partial_inplace */ - 0x1f07fc, /* src_mask */ - 0x1f07fc, /* dst_mask */ - FALSE), /* pcrel_offset */ - HOWTO (COFF860_R_HIGHADJ, /* 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_i860_reloc_nyi, /* special_function */ - "HIGHADJ", /* name */ - FALSE, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - HOWTO (COFF860_R_BRADDR, /* type */ - 2, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 26, /* bitsize */ - TRUE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - coff_i860_reloc_nyi, /* special_function */ - "BRADDR", /* name */ - FALSE, /* partial_inplace */ - 0x3ffffff, /* src_mask */ - 0x3ffffff, /* dst_mask */ - TRUE) /* pcrel_offset */ -}; - -/* Turn a howto into a reloc number. */ - -#define SELECT_RELOC(x,howto) { x.r_type = howto->type; } -#define BADMAG(x) I860BADMAG(x) -#define I860 1 /* Customize coffcode.h */ - -#define RTYPE2HOWTO(cache_ptr, dst) \ - ((cache_ptr)->howto = \ - ((dst)->r_type < sizeof (howto_table) / sizeof (howto_table[0]) \ - ? howto_table + (dst)->r_type \ - : NULL)) - -/* For 860 COFF a STYP_NOLOAD | STYP_BSS section is part of a shared - library. On some other COFF targets STYP_BSS is normally - STYP_NOLOAD. */ -#define BSS_NOLOAD_IS_SHARED_LIBRARY - -/* 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. */ - -/* PR 17512: file: 0a38fb7c - Set an addend value, even if it is not going to be used. A tool - like coffdump might be used to print out the contents of the reloc. */ -#define CALC_ADDEND(abfd, ptr, reloc, cache_ptr) (cache_ptr)->addend = 0 - -/* We use the special COFF backend linker. */ -#define coff_relocate_section _bfd_coff_generic_relocate_section - -static reloc_howto_type * -coff_i860_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; - - if (rel->r_type > sizeof (howto_table) / sizeof (howto_table[0])) - { - bfd_set_error (bfd_error_bad_value); - return NULL; - } - - howto = howto_table + rel->r_type; - - 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); - - /* 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; - } - - /* 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; - - return howto; -} - -static reloc_howto_type * -coff_i860_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, - bfd_reloc_code_real_type code) -{ - switch (code) - { - case BFD_RELOC_32: - return howto_table + R_DIR32; - case BFD_RELOC_860_PC26: - return howto_table + COFF860_R_BRADDR; - case BFD_RELOC_860_PC16: - /* ??? How to handle PC16 for COFF? SPLIT0 is close for now. */ - return howto_table + COFF860_R_SPLIT0; - case BFD_RELOC_860_LOW0: - return howto_table + COFF860_R_LOW0; - case BFD_RELOC_860_SPLIT0: - return howto_table + COFF860_R_SPLIT0; - case BFD_RELOC_860_LOW1: - return howto_table + COFF860_R_LOW1; - case BFD_RELOC_860_SPLIT1: - return howto_table + COFF860_R_SPLIT1; - case BFD_RELOC_860_LOW2: - return howto_table + COFF860_R_LOW2; - case BFD_RELOC_860_SPLIT2: - return howto_table + COFF860_R_SPLIT2; - case BFD_RELOC_860_LOW3: - return howto_table + COFF860_R_LOW3; - case BFD_RELOC_860_HIGHADJ: - return howto_table + COFF860_R_HIGHADJ; - case BFD_RELOC_860_HIGH: - return howto_table + COFF860_R_HIGH; - default: - BFD_FAIL (); - return 0; - } -} - -static reloc_howto_type * -coff_i860_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, - const char *r_name) -{ - unsigned int i; - - for (i = 0; i < sizeof (howto_table) / sizeof (howto_table[0]); i++) - if (howto_table[i].name != NULL - && strcasecmp (howto_table[i].name, r_name) == 0) - return &howto_table[i]; - - return NULL; -} - -/* This is called from coff_slurp_reloc_table for each relocation - entry. This special handling is due to the `PAIR' relocation - which has a different meaning for the `r_symndx' field. */ - -static void -i860_reloc_processing (arelent *cache_ptr, struct internal_reloc *dst, - asymbol **symbols, bfd *abfd, asection *asect) -{ - if (dst->r_type == COFF860_R_PAIR) - { - /* Handle the PAIR relocation specially. */ - cache_ptr->howto = howto_table + dst->r_type; - cache_ptr->address = dst->r_vaddr; - cache_ptr->addend = dst->r_symndx; - cache_ptr->sym_ptr_ptr= bfd_abs_section_ptr->symbol_ptr_ptr; - } - else - { - /* For every other relocation, do exactly what coff_slurp_reloc_table - would do (which this code is taken directly from). */ - asymbol *ptr = NULL; - cache_ptr->address = dst->r_vaddr; - - if (dst->r_symndx != -1) - { - if (dst->r_symndx < 0 || dst->r_symndx >= obj_conv_table_size (abfd)) - { - _bfd_error_handler - /* xgettext: c-format */ - (_("%pB: warning: illegal symbol index %ld in relocs"), - abfd, dst->r_symndx); - cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; - ptr = NULL; - } - else - { - cache_ptr->sym_ptr_ptr = (symbols - + obj_convert (abfd)[dst->r_symndx]); - ptr = *(cache_ptr->sym_ptr_ptr); - } - } - else - { - cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; - ptr = NULL; - } - - /* The symbols definitions that we have read in have been - relocated as if their sections started at 0. But the offsets - refering to the symbols in the raw data have not been - modified, so we have to have a negative addend to compensate. - - Note that symbols which used to be common must be left alone. */ - - /* Calculate any reloc addend by looking at the symbol. */ - CALC_ADDEND (abfd, ptr, (*dst), cache_ptr); - (void) ptr; - - cache_ptr->address -= asect->vma; - - /* Fill in the cache_ptr->howto field from dst->r_type. */ - RTYPE2HOWTO (cache_ptr, dst); - } -} - -#define coff_rtype_to_howto coff_i860_rtype_to_howto -#define coff_bfd_reloc_type_lookup coff_i860_reloc_type_lookup -#define coff_bfd_reloc_name_lookup coff_i860_reloc_name_lookup - -#define RELOC_PROCESSING(relent, reloc, symbols, abfd, section) \ - i860_reloc_processing (relent, reloc, symbols, abfd, section) - -#include "coffcode.h" - -static const bfd_target * -i3coff_object_p(bfd *a) -{ - return coff_object_p (a); -} - -const bfd_target -#ifdef TARGET_SYM - TARGET_SYM = -#else - i860_coff_vec = -#endif -{ -#ifdef TARGET_NAME - TARGET_NAME, -#else - "coff-i860", /* 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), - - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - '_', /* 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 */ - -/* Note that we allow an object file to be treated as a core file as well. */ - { /* bfd_check_format */ - _bfd_dummy_target, - i3coff_object_p, - bfd_generic_archive_p, - i3coff_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/coff-i960.c b/bfd/coff-i960.c deleted file mode 100644 index 4e68d44..0000000 --- a/bfd/coff-i960.c +++ /dev/null @@ -1,666 +0,0 @@ -/* BFD back-end for Intel 960 COFF files. - Copyright (C) 1990-2018 Free Software Foundation, Inc. - Written by Cygnus Support. - - 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 I960 1 -#define BADMAG(x) I960BADMAG(x) - -#include "sysdep.h" -#include "bfd.h" -#include "libbfd.h" -#include "coff/i960.h" -#include "coff/internal.h" - -#ifndef bfd_pe_print_pdata -#define bfd_pe_print_pdata NULL -#endif - -#include "libcoff.h" /* To allow easier abstraction-breaking. */ - - -#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (3) -#define COFF_ALIGN_IN_SECTION_HEADER 1 - -#define GET_SCNHDR_ALIGN H_GET_32 -#define PUT_SCNHDR_ALIGN H_PUT_32 - -/* The i960 does not support an MMU, so COFF_PAGE_SIZE can be - arbitrarily small. */ -#define COFF_PAGE_SIZE 1 - -#define COFF_LONG_FILENAMES - -/* This set of local label names is taken from gas. */ - -static bfd_boolean -coff_i960_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name) -{ - return (name[0] == 'L' - || (name[0] == '.' - && (name[1] == 'C' - || name[1] == 'I' - || name[1] == '.'))); -} - -/* This is just like the usual CALC_ADDEND, but it includes the - section VMA for PC relative relocs. */ -#ifndef CALC_ADDEND -#define CALC_ADDEND(abfd, ptr, reloc, cache_ptr) \ - { \ - coff_symbol_type *coffsym = (coff_symbol_type *) 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 != (coff_symbol_type *) NULL \ - && coffsym->native->u.syment.n_scnum == 0) \ - cache_ptr->addend = 0; \ - else if (ptr && bfd_asymbol_bfd (ptr) == abfd \ - && ptr->section != (asection *) NULL) \ - cache_ptr->addend = - (ptr->section->vma + ptr->value); \ - else \ - cache_ptr->addend = 0; \ - if (ptr && (reloc.r_type == 25 || reloc.r_type == 27)) \ - cache_ptr->addend += asect->vma; \ - } -#endif - -#define CALLS 0x66003800 /* Template for 'calls' instruction */ -#define BAL 0x0b000000 /* Template for 'bal' instruction */ -#define BAL_MASK 0x00ffffff - -static bfd_reloc_status_type -optcall_callback (bfd *abfd, - arelent *reloc_entry, - asymbol *symbol_in, - void * data, - asection *input_section, - bfd *ignore_bfd ATTRIBUTE_UNUSED, - char **error_message) -{ - /* This item has already been relocated correctly, but we may be - * able to patch in yet better code - done by digging out the - * correct info on this symbol */ - bfd_reloc_status_type result; - coff_symbol_type *cs = coffsymbol(symbol_in); - - /* Don't do anything with symbols which aren't tied up yet, - except move the reloc. */ - if (bfd_is_und_section (cs->symbol.section)) { - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - - /* So the target symbol has to be of coff type, and the symbol - has to have the correct native information within it */ - if ((bfd_asymbol_flavour(&cs->symbol) != bfd_target_coff_flavour) - || (cs->native == (combined_entry_type *)NULL)) - { - /* This is interesting, consider the case where we're outputting coff - from a mix n match input, linking from coff to a symbol defined in a - bout file will cause this match to be true. Should I complain? This - will only work if the bout symbol is non leaf. */ - *error_message = - (char *) _("uncertain calling convention for non-COFF symbol"); - result = bfd_reloc_dangerous; - } - else - { - switch (cs->native->u.syment.n_sclass) - { - case C_LEAFSTAT: - case C_LEAFEXT: - /* This is a call to a leaf procedure, replace instruction with a bal - to the correct location. */ - { - union internal_auxent *aux = &((cs->native+2)->u.auxent); - int word = bfd_get_32 (abfd, (bfd_byte *)data + reloc_entry->address); - int olf = (aux->x_bal.x_balntry - cs->native->u.syment.n_value); - BFD_ASSERT(cs->native->u.syment.n_numaux==2); - - /* We replace the original call instruction with a bal to - the bal entry point - the offset of which is described in - the 2nd auxent of the original symbol. We keep the native - sym and auxents untouched, so the delta between the two - is the offset of the bal entry point. */ - word = ((word + olf) & BAL_MASK) | BAL; - bfd_put_32 (abfd, (bfd_vma) word, - (bfd_byte *) data + reloc_entry->address); - } - result = bfd_reloc_ok; - break; - case C_SCALL: - /* This is a call to a system call, replace with a calls to # */ - BFD_ASSERT(0); - result = bfd_reloc_ok; - break; - default: - result = bfd_reloc_ok; - break; - } - } - return result; -} - -/* i960 COFF is used by VxWorks 5.1. However, VxWorks 5.1 does not - appear to correctly handle a reloc against a symbol defined in the - same object file. It appears to simply discard such relocs, rather - than adding their values into the object file. We handle this here - by converting all relocs against defined symbols into relocs - against the section symbol, when generating a relocatable output - file. - - Note that this function is only called if we are not using the COFF - specific backend linker. It only does something when doing a - relocatable link, which will almost certainly fail when not - generating COFF i960 output, so this function is actually no longer - useful. It was used before this target was converted to use the - COFF specific backend linker. */ - -static bfd_reloc_status_type -coff_i960_relocate (bfd *abfd, - arelent *reloc_entry, - asymbol *symbol, - void * data ATTRIBUTE_UNUSED, - asection *input_section ATTRIBUTE_UNUSED, - bfd *output_bfd, - char **error_message ATTRIBUTE_UNUSED) -{ - asection *osec; - - if (output_bfd == NULL) - { - /* Not generating relocatable output file. */ - return bfd_reloc_continue; - } - - if (bfd_is_und_section (bfd_get_section (symbol))) - { - /* Symbol is not defined, so no need to worry about it. */ - return bfd_reloc_continue; - } - - if (bfd_is_com_section (bfd_get_section (symbol))) - { - /* I don't really know what the right action is for a common - symbol. */ - return bfd_reloc_continue; - } - - /* Convert the reloc to use the section symbol. FIXME: This method - is ridiculous. */ - osec = bfd_get_section (symbol)->output_section; - if (coff_section_data (output_bfd, osec) != NULL - && coff_section_data (output_bfd, osec)->tdata != NULL) - reloc_entry->sym_ptr_ptr = - (asymbol **) coff_section_data (output_bfd, osec)->tdata; - else - { - const char *sec_name; - asymbol **syms, **sym_end; - - sec_name = bfd_get_section_name (output_bfd, osec); - syms = bfd_get_outsymbols (output_bfd); - sym_end = syms + bfd_get_symcount (output_bfd); - for (; syms < sym_end; syms++) - { - if (bfd_asymbol_name (*syms) != NULL - && (*syms)->value == 0 - && strcmp ((*syms)->section->output_section->name, - sec_name) == 0) - break; - } - - if (syms >= sym_end) - abort (); - - reloc_entry->sym_ptr_ptr = syms; - - if (coff_section_data (output_bfd, osec) == NULL) - { - bfd_size_type amt = sizeof (struct coff_section_tdata); - osec->used_by_bfd = bfd_zalloc (abfd, amt); - if (osec->used_by_bfd == NULL) - return bfd_reloc_overflow; - } - coff_section_data (output_bfd, osec)->tdata = syms; - } - - /* Let bfd_perform_relocation do its thing, which will include - stuffing the symbol addend into the object file. */ - return bfd_reloc_continue; -} - -static reloc_howto_type howto_rellong = - HOWTO ((unsigned int) R_RELLONG, 0, 2, 32,FALSE, 0, - complain_overflow_bitfield, coff_i960_relocate,"rellong", TRUE, - 0xffffffff, 0xffffffff, 0); -static reloc_howto_type howto_iprmed = - HOWTO (R_IPRMED, 0, 2, 24,TRUE,0, complain_overflow_signed, - coff_i960_relocate, "iprmed ", TRUE, 0x00ffffff, 0x00ffffff, 0); -static reloc_howto_type howto_optcall = - HOWTO (R_OPTCALL, 0,2,24,TRUE,0, complain_overflow_signed, - optcall_callback, "optcall", TRUE, 0x00ffffff, 0x00ffffff, 0); - -static reloc_howto_type * -coff_i960_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, - bfd_reloc_code_real_type code) -{ - switch (code) - { - default: - return 0; - case BFD_RELOC_I960_CALLJ: - return &howto_optcall; - case BFD_RELOC_32: - case BFD_RELOC_CTOR: - return &howto_rellong; - case BFD_RELOC_24_PCREL: - return &howto_iprmed; - } -} - -static reloc_howto_type * -coff_i960_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, - const char *r_name) -{ - if (strcasecmp (howto_optcall.name, r_name) == 0) - return &howto_optcall; - if (strcasecmp (howto_rellong.name, r_name) == 0) - return &howto_rellong; - if (strcasecmp (howto_iprmed.name, r_name) == 0) - return &howto_iprmed; - - return NULL; -} - -/* The real code is in coffcode.h */ - -#define RTYPE2HOWTO(cache_ptr, dst) \ -{ \ - reloc_howto_type *howto_ptr; \ - switch ((dst)->r_type) { \ - case 17: howto_ptr = &howto_rellong; break; \ - case 25: howto_ptr = &howto_iprmed; break; \ - case 27: howto_ptr = &howto_optcall; break; \ - default: howto_ptr = 0; break; \ - } \ - (cache_ptr)->howto = howto_ptr; \ - } - -/* i960 COFF is used by VxWorks 5.1. However, VxWorks 5.1 does not - appear to correctly handle a reloc against a symbol defined in the - same object file. It appears to simply discard such relocs, rather - than adding their values into the object file. We handle this by - converting all relocs against global symbols into relocs against - internal symbols at the start of the section. This routine is - called at the start of the linking process, and it creates the - necessary symbols. */ - -static bfd_boolean -coff_i960_start_final_link (bfd *abfd, struct bfd_link_info *info) -{ - bfd_size_type symesz = bfd_coff_symesz (abfd); - asection *o; - bfd_byte *esym; - - if (! bfd_link_relocatable (info)) - return TRUE; - - esym = (bfd_byte *) bfd_malloc (symesz); - if (esym == NULL) - return FALSE; - - if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0) - return FALSE; - - for (o = abfd->sections; o != NULL; o = o->next) - { - struct internal_syment isym; - - strncpy (isym._n._n_name, o->name, SYMNMLEN); - isym.n_value = 0; - isym.n_scnum = o->target_index; - isym.n_type = T_NULL; - isym.n_sclass = C_STAT; - isym.n_numaux = 0; - - bfd_coff_swap_sym_out (abfd, &isym, esym); - - if (bfd_bwrite (esym, symesz, abfd) != symesz) - { - free (esym); - return FALSE; - } - - obj_raw_syment_count (abfd) += 1; - } - - free (esym); - - return TRUE; -} - -/* The reloc processing routine for the optimized COFF linker. */ - -static bfd_boolean -coff_i960_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, - 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 *relend; - - rel = relocs; - relend = rel + input_section->reloc_count; - for (; rel < relend; rel++) - { - long symndx; - struct coff_link_hash_entry *h; - struct internal_syment *sym; - bfd_vma addend; - bfd_vma val; - reloc_howto_type *howto; - bfd_reloc_status_type rstat = bfd_reloc_ok; - bfd_boolean done; - - symndx = rel->r_symndx; - - if (symndx == -1) - { - h = NULL; - sym = NULL; - } - else - { - h = obj_coff_sym_hashes (input_bfd)[symndx]; - sym = syms + symndx; - } - - if (sym != NULL && sym->n_scnum != 0) - addend = - sym->n_value; - else - addend = 0; - - switch (rel->r_type) - { - case 17: howto = &howto_rellong; break; - case 25: howto = &howto_iprmed; break; - case 27: howto = &howto_optcall; break; - default: - bfd_set_error (bfd_error_bad_value); - return FALSE; - } - - 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 - - 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); - } - - done = FALSE; - - if (howto->type == R_OPTCALL && ! bfd_link_relocatable (info) && symndx != -1) - { - int class_val; - - if (h != NULL) - class_val = h->symbol_class; - else - class_val = sym->n_sclass; - - switch (class_val) - { - case C_NULL: - /* This symbol is apparently not from a COFF input file. - We warn, and then assume that it is not a leaf - function. */ - (*info->callbacks->reloc_dangerous) - (info, - _("uncertain calling convention for non-COFF symbol"), - input_bfd, input_section, - rel->r_vaddr - input_section->vma); - break; - case C_LEAFSTAT: - case C_LEAFEXT: - /* This is a call to a leaf procedure; use the bal - instruction. */ - { - long olf; - unsigned long word; - - if (h != NULL) - { - BFD_ASSERT (h->numaux == 2); - olf = h->aux[1].x_bal.x_balntry; - } - else - { - bfd_byte *esyms; - union internal_auxent aux; - - BFD_ASSERT (sym->n_numaux == 2); - esyms = (bfd_byte *) obj_coff_external_syms (input_bfd); - esyms += (symndx + 2) * bfd_coff_symesz (input_bfd); - bfd_coff_swap_aux_in (input_bfd, esyms, sym->n_type, - sym->n_sclass, 1, sym->n_numaux, - &aux); - olf = aux.x_bal.x_balntry; - } - - word = bfd_get_32 (input_bfd, - (contents - + (rel->r_vaddr - input_section->vma))); - word = ((word + olf - val) & BAL_MASK) | BAL; - bfd_put_32 (input_bfd, - (bfd_vma) word, - contents + (rel->r_vaddr - input_section->vma)); - done = TRUE; - } - break; - case C_SCALL: - BFD_ASSERT (0); - break; - } - } - - if (! done) - { - if (howto->pc_relative) - addend += input_section->vma; - rstat = _bfd_final_link_relocate (howto, input_bfd, input_section, - contents, - rel->r_vaddr - input_section->vma, - val, addend); - } - - switch (rstat) - { - default: - abort (); - case bfd_reloc_ok: - break; - case bfd_reloc_overflow: - { - const char *name; - char buf[SYMNMLEN + 1]; - - if (symndx == -1) - name = "*ABS*"; - else if (h != NULL) - name = NULL; - else - { - name = _bfd_coff_internal_syment_name (input_bfd, sym, buf); - if (name == NULL) - return FALSE; - } - - (*info->callbacks->reloc_overflow) - (info, (h ? &h->root : NULL), name, howto->name, - (bfd_vma) 0, input_bfd, input_section, - rel->r_vaddr - input_section->vma); - } - } - } - - return TRUE; -} - -/* Adjust the symbol index of any reloc against a global symbol to - instead be a reloc against the internal symbol we created specially - for the section. */ - -static bfd_boolean -coff_i960_adjust_symndx (bfd *obfd ATTRIBUTE_UNUSED, - struct bfd_link_info *info ATTRIBUTE_UNUSED, - bfd *ibfd, - asection *sec ATTRIBUTE_UNUSED, - struct internal_reloc *irel, - bfd_boolean *adjustedp) -{ - struct coff_link_hash_entry *h; - - *adjustedp = FALSE; - - h = obj_coff_sym_hashes (ibfd)[irel->r_symndx]; - if (h == NULL - || (h->root.type != bfd_link_hash_defined - && h->root.type != bfd_link_hash_defweak)) - return TRUE; - - irel->r_symndx = h->root.u.def.section->output_section->target_index - 1; - *adjustedp = TRUE; - - return TRUE; -} - -#define coff_bfd_is_local_label_name coff_i960_is_local_label_name - -#define coff_start_final_link coff_i960_start_final_link - -#define coff_relocate_section coff_i960_relocate_section - -#define coff_adjust_symndx coff_i960_adjust_symndx - -#define coff_bfd_reloc_type_lookup coff_i960_reloc_type_lookup -#define coff_bfd_reloc_name_lookup coff_i960_reloc_name_lookup - -#include "coffcode.h" - -extern const bfd_target icoff_be_vec; - -CREATE_LITTLE_COFF_TARGET_VEC (icoff_le_vec, "coff-Intel-little", 0, 0, '_', & icoff_be_vec, COFF_SWAP_TABLE) - -const bfd_target icoff_be_vec = -{ - "coff-Intel-big", /* name */ - bfd_target_coff_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), - - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - '_', /* 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, - 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), - - &icoff_le_vec, - - COFF_SWAP_TABLE -}; diff --git a/bfd/coffcode.h b/bfd/coffcode.h index caa8bcb..4a0741a1 100644 --- a/bfd/coffcode.h +++ b/bfd/coffcode.h @@ -40,11 +40,6 @@ SECTION defines the relocations used by the 88k format @xref{Relocations}. - The Intel i960 processor version of coff is implemented in - @file{coff-i960.c}. This file has the same structure as - @file{coff-m88k.c}, except that it includes @file{coff/i960.h} - rather than @file{coff-m88k.h}. - SUBSECTION Porting to a new version of coff @@ -97,15 +92,6 @@ SUBSUBSECTION Some of the Coff targets then also have additional routines in the target source file itself. - For example, @file{coff-i960.c} includes - @file{coff/internal.h} and @file{coff/i960.h}. It then - defines a few constants, such as @code{I960}, and includes - @file{coffcode.h}. Since the i960 has complex relocation - types, @file{coff-i960.c} also includes some code to - manipulate the i960 relocs. This code is not in - @file{coffcode.h} because it would not be used by any other - target. - SUBSUBSECTION Coff long section names @@ -1664,19 +1650,6 @@ coff_bad_format_hook (bfd * abfd ATTRIBUTE_UNUSED, void * filehdr) if (BADMAG (*internal_f)) return FALSE; - /* If the optional header is NULL or not the correct size then - quit; the only difference I can see between m88k dgux headers (MC88DMAGIC) - and Intel 960 readwrite headers (I960WRMAGIC) is that the - optional header is of a different size. - - But the mips keeps extra stuff in it's opthdr, so dont check - when doing that. */ - -#if defined(M88) || defined(I960) - if (internal_f->f_opthdr != 0 && bfd_coff_aoutsz (abfd) != internal_f->f_opthdr) - return FALSE; -#endif - return TRUE; } @@ -1848,12 +1821,6 @@ coff_set_alignment_hook (bfd * abfd ATTRIBUTE_UNUSED, struct internal_scnhdr *hdr = (struct internal_scnhdr *) scnhdr; unsigned int i; -#ifdef I960 - /* Extract ALIGN from 2**ALIGN stored in section header. */ - for (i = 0; i < 32; i++) - if ((1 << i) >= hdr->s_align) - break; -#endif #ifdef COFF_DECODE_ALIGNMENT i = COFF_DECODE_ALIGNMENT(hdr->s_flags); #endif @@ -2235,47 +2202,6 @@ coff_set_arch_mach_hook (bfd *abfd, void * filehdr) } break; #endif -#ifdef I860 - case I860MAGIC: - arch = bfd_arch_i860; - break; -#endif -#ifdef I960 -#ifdef I960ROMAGIC - case I960ROMAGIC: - case I960RWMAGIC: - arch = bfd_arch_i960; - switch (F_I960TYPE & internal_f->f_flags) - { - default: - case F_I960CORE: - machine = bfd_mach_i960_core; - break; - case F_I960KB: - machine = bfd_mach_i960_kb_sb; - break; - case F_I960MC: - machine = bfd_mach_i960_mc; - break; - case F_I960XA: - machine = bfd_mach_i960_xa; - break; - case F_I960CA: - machine = bfd_mach_i960_ca; - break; - case F_I960KA: - machine = bfd_mach_i960_ka_sa; - break; - case F_I960JX: - machine = bfd_mach_i960_jx; - break; - case F_I960HX: - machine = bfd_mach_i960_hx; - break; - } - break; -#endif -#endif #ifdef RS6000COFF_C #ifdef XCOFF64 @@ -2552,31 +2478,7 @@ coff_pointerize_aux_hook (bfd *abfd ATTRIBUTE_UNUSED, } #else -#ifdef I960 - -/* We don't want to pointerize bal entries. */ - -static bfd_boolean -coff_pointerize_aux_hook (bfd *abfd ATTRIBUTE_UNUSED, - combined_entry_type *table_base ATTRIBUTE_UNUSED, - combined_entry_type *symbol, - unsigned int indaux, - combined_entry_type *aux ATTRIBUTE_UNUSED) -{ - /* Return TRUE if we don't want to pointerize this aux entry, which - is the case for the lastfirst aux entry for a C_LEAFPROC symbol. */ - return (indaux == 1 - && symbol->is_sym - && (symbol->u.syment.n_sclass == C_LEAFPROC - || symbol->u.syment.n_sclass == C_LEAFSTAT - || symbol->u.syment.n_sclass == C_LEAFEXT)); -} - -#else /* ! I960 */ - #define coff_pointerize_aux_hook 0 - -#endif /* ! I960 */ #endif /* ! RS6000COFF_C */ /* Print an aux entry. This returns TRUE if it has printed it. */ @@ -2856,32 +2758,6 @@ coff_set_flags (bfd * abfd, return TRUE; #endif -#ifdef I960ROMAGIC - case bfd_arch_i960: - - { - unsigned flags; - - *magicp = I960ROMAGIC; - - switch (bfd_get_mach (abfd)) - { - case bfd_mach_i960_core: flags = F_I960CORE; break; - case bfd_mach_i960_kb_sb: flags = F_I960KB; break; - case bfd_mach_i960_mc: flags = F_I960MC; break; - case bfd_mach_i960_xa: flags = F_I960XA; break; - case bfd_mach_i960_ca: flags = F_I960CA; break; - case bfd_mach_i960_ka_sa: flags = F_I960KA; break; - case bfd_mach_i960_jx: flags = F_I960JX; break; - case bfd_mach_i960_hx: flags = F_I960HX; break; - default: return FALSE; - } - *flagsp = flags; - return TRUE; - } - break; -#endif - #ifdef TIC30MAGIC case bfd_arch_tic30: *magicp = TIC30MAGIC; @@ -2981,12 +2857,6 @@ coff_set_flags (bfd * abfd, return TRUE; #endif -#ifdef I860MAGIC - case bfd_arch_i860: - *magicp = I860MAGIC; - return TRUE; -#endif - #ifdef IA64MAGIC case bfd_arch_ia64: *magicp = IA64MAGIC; @@ -3146,9 +3016,7 @@ sort_by_secaddr (const void * arg1, const void * arg2) /* Calculate the file position for each section. */ -#ifndef I960 #define ALIGN_SECTIONS_IN_FILE -#endif #if defined(TIC80COFF) || defined(TICOFF) #undef ALIGN_SECTIONS_IN_FILE #endif @@ -3389,9 +3257,7 @@ coff_compute_section_file_positions (bfd * abfd) #endif /* Align the sections in the file to the same boundary on - which they are aligned in virtual memory. I960 doesn't - do this (FIXME) so we can stay in sync with Intel. 960 - doesn't yet page from files... */ + which they are aligned in virtual memory. */ #ifdef ALIGN_SECTIONS_IN_FILE if ((abfd->flags & EXEC_P) != 0) { @@ -3855,11 +3721,6 @@ coff_write_object_contents (bfd * abfd) else if (!strcmp (current->name, _BSS)) bss_sec = current; -#ifdef I960 - section.s_align = (current->alignment_power - ? 1 << current->alignment_power - : 0); -#endif #ifdef COFF_ENCODE_ALIGNMENT COFF_ENCODE_ALIGNMENT(section, current->alignment_power); if ((unsigned int)COFF_DECODE_ALIGNMENT(section.s_flags) @@ -4118,15 +3979,6 @@ coff_write_object_contents (bfd * abfd) internal_a.magic = TIC80_ARCH_MAGIC; #define __A_MAGIC_SET__ #endif /* TIC80 */ -#ifdef I860 - /* FIXME: What are the a.out magic numbers for the i860? */ - internal_a.magic = 0; -#define __A_MAGIC_SET__ -#endif /* I860 */ -#ifdef I960 - internal_a.magic = (magic == I960ROMAGIC ? NMAGIC : OMAGIC); -#define __A_MAGIC_SET__ -#endif /* I960 */ #if M88 #define __A_MAGIC_SET__ internal_a.magic = PAGEMAGICBCS; @@ -4820,11 +4672,6 @@ coff_slurp_symbol_table (bfd * abfd) switch (src->u.syment.n_sclass) { -#ifdef I960 - case C_LEAFEXT: - /* Fall through to next case. */ -#endif - case C_EXT: case C_WEAKEXT: #if defined ARM @@ -4918,9 +4765,6 @@ coff_slurp_symbol_table (bfd * abfd) break; case C_STAT: /* Static. */ -#ifdef I960 - case C_LEAFSTAT: /* Static leaf procedure. */ -#endif #if defined ARM case C_THUMBSTAT: /* Thumb static. */ case C_THUMBLABEL: /* Thumb label. */ @@ -4958,11 +4802,6 @@ coff_slurp_symbol_table (bfd * abfd) case C_REGPARM: /* Register parameter. */ case C_REG: /* register variable. */ /* C_AUTOARG conflicts with TI COFF C_UEXT. */ -#if !defined (TIC80COFF) && !defined (TICOFF) -#ifdef C_AUTOARG - case C_AUTOARG: /* 960-specific storage class. */ -#endif -#endif case C_TPDEF: /* Type definition. */ case C_ARG: case C_AUTO: /* Automatic variable. */ @@ -5158,9 +4997,6 @@ coff_classify_symbol (bfd *abfd, { case C_EXT: case C_WEAKEXT: -#ifdef I960 - case C_LEAFEXT: -#endif #ifdef ARM case C_THUMBEXT: case C_THUMBEXTFUNC: @@ -5262,7 +5098,7 @@ SUBSUBSECTION o The reloc index is turned into a pointer to a howto structure, in a back end specific way. For instance, the 386 - and 960 use the @code{r_type} to directly produce an index + uses the @code{r_type} to directly produce an index into a howto table vector; the 88k subtracts a number from the @code{r_type} field and creates an addend field. */ diff --git a/bfd/coffswap.h b/bfd/coffswap.h index 7b000e0..5fec8bf 100644 --- a/bfd/coffswap.h +++ b/bfd/coffswap.h @@ -618,10 +618,6 @@ coff_swap_aouthdr_in (bfd * abfd, void * aouthdr_ext1, void * aouthdr_int1) aouthdr_int->data_start = GET_AOUTHDR_DATA_START (abfd, aouthdr_ext->data_start); -#ifdef I960 - aouthdr_int->tagentries = H_GET_32 (abfd, aouthdr_ext->tagentries); -#endif - #ifdef APOLLO_M68 H_PUT_32 (abfd, aouthdr_int->o_inlib, aouthdr_ext->o_inlib); H_PUT_32 (abfd, aouthdr_int->o_sri, aouthdr_ext->o_sri); @@ -689,10 +685,6 @@ coff_swap_aouthdr_out (bfd * abfd, void * in, void * out) PUT_AOUTHDR_DATA_START (abfd, aouthdr_in->data_start, aouthdr_out->data_start); -#ifdef I960 - H_PUT_32 (abfd, aouthdr_in->tagentries, aouthdr_out->tagentries); -#endif - #ifdef RS6000COFF_C #ifdef XCOFF64 H_PUT_64 (abfd, aouthdr_in->o_toc, aouthdr_out->o_toc); @@ -767,9 +759,6 @@ coff_swap_scnhdr_in (bfd * abfd, void * ext, void * in) scnhdr_int->s_flags = GET_SCNHDR_FLAGS (abfd, scnhdr_ext->s_flags); scnhdr_int->s_nreloc = GET_SCNHDR_NRELOC (abfd, scnhdr_ext->s_nreloc); scnhdr_int->s_nlnno = GET_SCNHDR_NLNNO (abfd, scnhdr_ext->s_nlnno); -#ifdef I960 - scnhdr_int->s_align = GET_SCNHDR_ALIGN (abfd, scnhdr_ext->s_align); -#endif #ifdef COFF_ADJUST_SCNHDR_IN_POST COFF_ADJUST_SCNHDR_IN_POST (abfd, ext, in); #endif @@ -830,9 +819,6 @@ coff_swap_scnhdr_out (bfd * abfd, void * in, void * out) } #endif -#ifdef I960 - PUT_SCNHDR_ALIGN (abfd, scnhdr_int->s_align, scnhdr_ext->s_align); -#endif #ifdef COFF_ADJUST_SCNHDR_OUT_POST COFF_ADJUST_SCNHDR_OUT_POST (abfd, in, out); #endif diff --git a/bfd/config.bfd b/bfd/config.bfd index f04a993..881c48c 100644 --- a/bfd/config.bfd +++ b/bfd/config.bfd @@ -81,8 +81,6 @@ case $targ in i[3-7]86-*-os9k | \ i[3-7]86-none-* | \ i[3-7]86-*-aout* | i[3-7]86*-*-vsta* | \ - i860-*-* | \ - i960-*-* | \ m68*-motorola-sysv* | m68*-hp-bsd* | m68*-*-aout* | \ m68*-*-coff* | m68*-*-sysv* | \ m68*-*-hpux* | \ @@ -115,7 +113,6 @@ case $targ in we32k-*-* | \ w65-*-* | \ *-*-ieee* | \ - *-adobe-* | \ *-sony-* | \ *-tandem-* | \ i370-* | \ @@ -131,13 +128,15 @@ case $targ in esac case $targ in + *-adobe-* | \ *-go32-rtems* | \ *-*-rtemsaout* | \ *-*-rtemscoff* | \ a29k-* | \ arm-*-oabi | \ hppa*-*-rtems* | \ - i960-*-rtems* | \ + i860-*-* | \ + i960-*-* | \ m68*-*-lynxos* | \ m68*-apollo-* | \ m68*-apple-aux* | \ @@ -882,37 +881,6 @@ case "${targ}" in targ_selfvecs="iamcu_elf32_vec i386chaos_vec" ;; - i860-*-mach3* | i860-*-osf1* | i860-*-coff*) - targ_defvec=i860_coff_vec - ;; - i860-stardent-sysv4* | i860-stardent-elf*) - targ_defvec=i860_elf32_le_vec - targ_selvecs="i860_elf32_vec i860_elf32_le_vec" - ;; - i860-*-sysv4* | i860-*-elf*) - targ_defvec=i860_elf32_vec - ;; - - i960-*-vxworks4* | i960-*-vxworks5.0) - targ_defvec=bout_le_vec - targ_selvecs="bout_be_vec icoff_le_vec icoff_be_vec ieee_vec" - targ_underscore=yes - ;; - i960-*-vxworks5.* | i960-*-coff* | i960-*-sysv*) - targ_defvec=icoff_le_vec - targ_selvecs="icoff_be_vec bout_le_vec bout_be_vec ieee_vec" - targ_underscore=yes - ;; - i960-*-vxworks* | i960-*-aout* | i960-*-bout* | i960-*-nindy*) - targ_defvec=bout_le_vec - targ_selvecs="bout_be_vec icoff_le_vec icoff_be_vec ieee_vec" - targ_underscore=yes - ;; - i960-*-elf*) - targ_defvec=i960_elf32_vec - targ_selvecs="icoff_le_vec icoff_be_vec" - ;; - ia16-*-elf) targ_defvec=i386_elf32_vec targ_selvecs="i386_msdos_vec i386_aout_vec" @@ -1854,11 +1822,6 @@ case "${targ}" in targ_defvec=ieee_vec ;; - *-adobe-*) - targ_defvec=aout_adobe_vec - targ_underscore=yes - ;; - *-sony-*) targ_defvec=m68k_aout_newsos3_vec targ_underscore=yes diff --git a/bfd/configure b/bfd/configure index 667f001..f14c96c 100755 --- a/bfd/configure +++ b/bfd/configure @@ -14344,7 +14344,6 @@ do aout0_be_vec) tb="$tb aout0.lo aout32.lo" ;; aout64_vec) tb="$tb demo64.lo aout64.lo"; target_size=64 ;; aout_vec) tb="$tb host-aout.lo aout32.lo" ;; - aout_adobe_vec) tb="$tb aout-adobe.lo aout32.lo" ;; arc_elf32_be_vec) tb="$tb elf32-arc.lo elf32.lo $elf" ;; arc_elf32_le_vec) tb="$tb elf32-arc.lo elf32.lo $elf" ;; arm_aout_be_vec) tb="$tb aout-arm.lo aout32.lo" ;; @@ -14377,8 +14376,6 @@ do avr_elf32_vec) tb="$tb elf32-avr.lo elf32.lo $elf" ;; bfin_elf32_vec) tb="$tb elf32-bfin.lo elf32.lo $elf" ;; bfin_elf32_fdpic_vec) tb="$tb elf32-bfin.lo elf32.lo $elf" ;; - bout_be_vec) tb="$tb bout.lo aout32.lo" ;; - bout_le_vec) tb="$tb bout.lo aout32.lo" ;; cr16_elf32_vec) tb="$tb elf32-cr16.lo elf32.lo $elf" ;; cr16c_elf32_vec) tb="$tb elf32-cr16c.lo elf32.lo $elf" ;; cris_aout_vec) tb="$tb aout-cris.lo" ;; @@ -14431,10 +14428,6 @@ do i386_pe_vec) tb="$tb pe-i386.lo peigen.lo $coff" ;; i386_pei_vec) tb="$tb pei-i386.lo peigen.lo $coff" ;; iamcu_elf32_vec) tb="$tb elf32-i386.lo elfxx-x86.lo elf-ifunc.lo elf-nacl.lo elf-vxworks.lo elf32.lo $elf" ;; - i860_coff_vec) tb="$tb coff-i860.lo $coff" ;; - i860_elf32_vec) tb="$tb elf32-i860.lo elf32.lo $elf" ;; - i860_elf32_le_vec) tb="$tb elf32-i860.lo elf32.lo $elf" ;; - i960_elf32_vec) tb="$tb elf32-i960.lo elf32.lo $elf" ;; ia64_elf32_be_vec) tb="$tb elf32-ia64.lo elfxx-ia64.lo elf32.lo $elf" ;; ia64_elf32_hpux_be_vec) tb="$tb elf32-ia64.lo elfxx-ia64.lo elf32.lo $elf" ;; ia64_elf64_be_vec) tb="$tb elf64-ia64.lo elfxx-ia64.lo elf64.lo $elf"; target_size=64 ;; @@ -14442,8 +14435,6 @@ do ia64_elf64_hpux_be_vec) tb="$tb elf64-ia64.lo elfxx-ia64.lo elf64.lo $elf"; target_size=64 ;; ia64_elf64_vms_vec) tb="$tb elf64-ia64-vms.lo elf64-ia64.lo elfxx-ia64.lo elf64.lo vms-lib.lo vms-misc.lo $elf"; target_size=64 ;; ia64_pei_vec) tb="$tb pei-ia64.lo pepigen.lo $coff"; target_size=64 ;; - icoff_be_vec) tb="$tb coff-i960.lo $coff" ;; - icoff_le_vec) tb="$tb coff-i960.lo $coff" ;; ieee_vec) tb="$tb ieee.lo" ;; ip2k_elf32_vec) tb="$tb elf32-ip2k.lo elf32.lo $elf" ;; iq2000_elf32_vec) tb="$tb elf32-iq2000.lo elf32.lo $elf" ;; @@ -14890,10 +14881,6 @@ if test "${target}" = "${host}"; then ;; i[3-7]86-*-isc*) COREFILE=trad-core.lo ;; i[3-7]86-*-aix*) COREFILE=aix386-core.lo ;; - i860-*-mach3* | i860-*-osf1*) - COREFILE=trad-core.lo - TRAD_HEADER='"hosts/i860mach3.h"' - ;; mips-*-netbsd* | mips*-*-openbsd*) COREFILE=netbsd-core.lo ;; diff --git a/bfd/configure.ac b/bfd/configure.ac index 20e2c02..8eeb5ff 100644 --- a/bfd/configure.ac +++ b/bfd/configure.ac @@ -421,7 +421,6 @@ do aout0_be_vec) tb="$tb aout0.lo aout32.lo" ;; aout64_vec) tb="$tb demo64.lo aout64.lo"; target_size=64 ;; aout_vec) tb="$tb host-aout.lo aout32.lo" ;; - aout_adobe_vec) tb="$tb aout-adobe.lo aout32.lo" ;; arc_elf32_be_vec) tb="$tb elf32-arc.lo elf32.lo $elf" ;; arc_elf32_le_vec) tb="$tb elf32-arc.lo elf32.lo $elf" ;; arm_aout_be_vec) tb="$tb aout-arm.lo aout32.lo" ;; @@ -454,8 +453,6 @@ do avr_elf32_vec) tb="$tb elf32-avr.lo elf32.lo $elf" ;; bfin_elf32_vec) tb="$tb elf32-bfin.lo elf32.lo $elf" ;; bfin_elf32_fdpic_vec) tb="$tb elf32-bfin.lo elf32.lo $elf" ;; - bout_be_vec) tb="$tb bout.lo aout32.lo" ;; - bout_le_vec) tb="$tb bout.lo aout32.lo" ;; cr16_elf32_vec) tb="$tb elf32-cr16.lo elf32.lo $elf" ;; cr16c_elf32_vec) tb="$tb elf32-cr16c.lo elf32.lo $elf" ;; cris_aout_vec) tb="$tb aout-cris.lo" ;; @@ -508,10 +505,6 @@ do i386_pe_vec) tb="$tb pe-i386.lo peigen.lo $coff" ;; i386_pei_vec) tb="$tb pei-i386.lo peigen.lo $coff" ;; iamcu_elf32_vec) tb="$tb elf32-i386.lo elfxx-x86.lo elf-ifunc.lo elf-nacl.lo elf-vxworks.lo elf32.lo $elf" ;; - i860_coff_vec) tb="$tb coff-i860.lo $coff" ;; - i860_elf32_vec) tb="$tb elf32-i860.lo elf32.lo $elf" ;; - i860_elf32_le_vec) tb="$tb elf32-i860.lo elf32.lo $elf" ;; - i960_elf32_vec) tb="$tb elf32-i960.lo elf32.lo $elf" ;; ia64_elf32_be_vec) tb="$tb elf32-ia64.lo elfxx-ia64.lo elf32.lo $elf" ;; ia64_elf32_hpux_be_vec) tb="$tb elf32-ia64.lo elfxx-ia64.lo elf32.lo $elf" ;; ia64_elf64_be_vec) tb="$tb elf64-ia64.lo elfxx-ia64.lo elf64.lo $elf"; target_size=64 ;; @@ -519,8 +512,6 @@ do ia64_elf64_hpux_be_vec) tb="$tb elf64-ia64.lo elfxx-ia64.lo elf64.lo $elf"; target_size=64 ;; ia64_elf64_vms_vec) tb="$tb elf64-ia64-vms.lo elf64-ia64.lo elfxx-ia64.lo elf64.lo vms-lib.lo vms-misc.lo $elf"; target_size=64 ;; ia64_pei_vec) tb="$tb pei-ia64.lo pepigen.lo $coff"; target_size=64 ;; - icoff_be_vec) tb="$tb coff-i960.lo $coff" ;; - icoff_le_vec) tb="$tb coff-i960.lo $coff" ;; ieee_vec) tb="$tb ieee.lo" ;; ip2k_elf32_vec) tb="$tb elf32-ip2k.lo elf32.lo $elf" ;; iq2000_elf32_vec) tb="$tb elf32-iq2000.lo elf32.lo $elf" ;; @@ -976,10 +967,6 @@ changequote(,)dnl i[3-7]86-*-isc*) COREFILE=trad-core.lo ;; i[3-7]86-*-aix*) COREFILE=aix386-core.lo ;; changequote([,])dnl - i860-*-mach3* | i860-*-osf1*) - COREFILE=trad-core.lo - TRAD_HEADER='"hosts/i860mach3.h"' - ;; mips-*-netbsd* | mips*-*-openbsd*) COREFILE=netbsd-core.lo ;; diff --git a/bfd/cpu-i860.c b/bfd/cpu-i860.c deleted file mode 100644 index 7f6eb4b..0000000 --- a/bfd/cpu-i860.c +++ /dev/null @@ -1,42 +0,0 @@ -/* BFD support for the Intel 860 architecture. - Copyright (C) 1992-2018 Free Software Foundation, Inc. - Created mostly by substituting "860" for "386" in cpu-i386.c - Harry Dolan <dolan@ssd.intel.com>, October 1995 - - 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 "libbfd.h" - -const bfd_arch_info_type bfd_i860_arch = - { - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ - bfd_arch_i860, /* Architecture */ - 0, /* Only one machine */ - "i860", /* Architecture name */ - "i860", /* Printable name */ - 3, /* Section alignment exponent */ - TRUE, /* Is this the default architecture? */ - bfd_default_compatible, - bfd_default_scan, - bfd_arch_default_fill, - 0, /* Next in list */ - }; diff --git a/bfd/cpu-i960.c b/bfd/cpu-i960.c deleted file mode 100644 index f1333db..0000000 --- a/bfd/cpu-i960.c +++ /dev/null @@ -1,172 +0,0 @@ -/* BFD library support routines for the i960 architecture. - Copyright (C) 1990-2018 Free Software Foundation, Inc. - Hacked by Steve Chamberlain of Cygnus Support. - - 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 "libbfd.h" - -/* This routine is provided a string, and tries to work out if it - could possibly refer to the i960 machine pointed at in the - info_struct pointer */ - -static bfd_boolean -scan_960_mach (const bfd_arch_info_type *ap, - const char *string) -{ - unsigned long machine; - int fail_because_not_80960 = FALSE; - - /* Look for the string i960 at the front of the string. */ - if (strncasecmp ("i960", string, 4) == 0) - { - string += 4; - - /* i960 on it's own means core to us. */ - if (* string == 0) - return ap->mach == bfd_mach_i960_core; - - /* "i960:*" is valid, anything else is not. */ - if (* string != ':') - return FALSE; - - string ++; - } - /* In some bfds the cpu-id is written as "80960KA", "80960KB", - "80960CA" or "80960MC". */ - else if (CONST_STRNEQ (string, "80960")) - { - string += 5; - - /* Set this to TRUE here. If a correct matching postfix - is detected below it will be reset to FALSE. */ - fail_because_not_80960 = TRUE; - } - /* No match, can't be us. */ - else - return FALSE; - - if (* string == '\0') - return FALSE; - - if (string[0] == 'c' && string[1] == 'o' && string[2] == 'r' && - string[3] == 'e' && string[4] == '\0') - machine = bfd_mach_i960_core; - else if (strcasecmp (string, "ka_sa") == 0) - machine = bfd_mach_i960_ka_sa; - else if (strcasecmp (string, "kb_sb") == 0) - machine = bfd_mach_i960_kb_sb; - else if (string[1] == '\0' || string[2] != '\0') /* rest are 2-char. */ - return FALSE; - else if (string[0] == 'k' && string[1] == 'b') - { machine = bfd_mach_i960_kb_sb; fail_because_not_80960 = FALSE; } - else if (string[0] == 's' && string[1] == 'b') - machine = bfd_mach_i960_kb_sb; - else if (string[0] == 'm' && string[1] == 'c') - { machine = bfd_mach_i960_mc; fail_because_not_80960 = FALSE; } - else if (string[0] == 'x' && string[1] == 'a') - machine = bfd_mach_i960_xa; - else if (string[0] == 'c' && string[1] == 'a') - { machine = bfd_mach_i960_ca; fail_because_not_80960 = FALSE; } - else if (string[0] == 'k' && string[1] == 'a') - { machine = bfd_mach_i960_ka_sa; fail_because_not_80960 = FALSE; } - else if (string[0] == 's' && string[1] == 'a') - machine = bfd_mach_i960_ka_sa; - else if (string[0] == 'j' && string[1] == 'x') - machine = bfd_mach_i960_jx; - else if (string[0] == 'h' && string[1] == 'x') - machine = bfd_mach_i960_hx; - else - return FALSE; - - if (fail_because_not_80960) - return FALSE; - - if (machine == ap->mach) - return TRUE; - - return FALSE; -} - -/* This routine is provided two arch_infos and works out the i960 - machine which would be compatible with both and returns a pointer - to its info structure */ - -static const bfd_arch_info_type * -compatible (const bfd_arch_info_type *a, - const bfd_arch_info_type *b) -{ - - /* The i960 has distinct subspecies which may not interbreed: - CORE CA - CORE KA KB MC XA - CORE HX JX - Any architecture on the same line is compatible, the one on - the right is the least restrictive. - - We represent this information in an array, each machine to a side */ - -#define ERROR 0 -#define CORE bfd_mach_i960_core /*1*/ -#define KA bfd_mach_i960_ka_sa /*2*/ -#define KB bfd_mach_i960_kb_sb /*3*/ -#define MC bfd_mach_i960_mc /*4*/ -#define XA bfd_mach_i960_xa /*5*/ -#define CA bfd_mach_i960_ca /*6*/ -#define JX bfd_mach_i960_jx /*7*/ -#define HX bfd_mach_i960_hx /*8*/ -#define MAX_ARCH ((int)HX) - - static const unsigned long matrix[MAX_ARCH+1][MAX_ARCH+1] = - { - { ERROR, CORE, KA, KB, MC, XA, CA, JX, HX }, - { CORE, CORE, KA, KB, MC, XA, CA, JX, HX }, - { KA, KA, KA, KB, MC, XA, ERROR, ERROR, ERROR}, - { KB, KB, KB, KB, MC, XA, ERROR, ERROR, ERROR}, - { MC, MC, MC, MC, MC, XA, ERROR, ERROR, ERROR}, - { XA, XA, XA, XA, XA, XA, ERROR, ERROR, ERROR}, - { CA, CA, ERROR, ERROR, ERROR, ERROR, CA, ERROR, ERROR}, - { JX, JX, ERROR, ERROR, ERROR, ERROR, ERROR, JX, HX }, - { HX, HX, ERROR, ERROR, ERROR, ERROR, ERROR, HX, HX }, - }; - - if (a->arch != b->arch || matrix[a->mach][b->mach] == ERROR) - return NULL; - - return (a->mach == matrix[a->mach][b->mach]) ? a : b; -} - -#define N(a,b,d,n) \ -{ 32, 32, 8,bfd_arch_i960,a,"i960",b,3,d,compatible,scan_960_mach, \ - bfd_arch_default_fill, n,} - -static const bfd_arch_info_type arch_info_struct[] = -{ - N(bfd_mach_i960_ka_sa,"i960:ka_sa",FALSE, &arch_info_struct[1]), - N(bfd_mach_i960_kb_sb,"i960:kb_sb",FALSE, &arch_info_struct[2]), - N(bfd_mach_i960_mc, "i960:mc", FALSE, &arch_info_struct[3]), - N(bfd_mach_i960_xa, "i960:xa", FALSE, &arch_info_struct[4]), - N(bfd_mach_i960_ca, "i960:ca", FALSE, &arch_info_struct[5]), - N(bfd_mach_i960_jx, "i960:jx", FALSE, &arch_info_struct[6]), - N(bfd_mach_i960_hx, "i960:hx", FALSE, 0), -}; - -const bfd_arch_info_type bfd_i960_arch = - N(bfd_mach_i960_core, "i960:core", TRUE, &arch_info_struct[0]); diff --git a/bfd/elf32-i860.c b/bfd/elf32-i860.c deleted file mode 100644 index d588dc5..0000000 --- a/bfd/elf32-i860.c +++ /dev/null @@ -1,1274 +0,0 @@ -/* Intel i860 specific support for 32-bit ELF. - Copyright (C) 1993-2018 Free Software Foundation, Inc. - - Full i860 support contributed by Jason Eckhardt <jle@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 "libbfd.h" -#include "elf-bfd.h" -#include "elf/i860.h" - -/* special_function for R_860_PC26 relocation. */ -static bfd_reloc_status_type -i860_howto_pc26_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) -{ - bfd_vma insn; - bfd_vma relocation; - bfd_byte *addr; - - if (output_bfd != NULL - && (symbol->flags & BSF_SECTION_SYM) == 0 - && (! reloc_entry->howto->partial_inplace - || reloc_entry->addend == 0)) - { - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - - /* Used elf32-mips.c as an example. */ - if (bfd_is_und_section (symbol->section) - && output_bfd == (bfd *) NULL) - return 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; - - /* Adjust for PC-relative relocation. */ - relocation -= (input_section->output_section->vma - + input_section->output_offset - + reloc_entry->address - + 4); - - /* Check for target out of range. */ - if ((bfd_signed_vma)relocation > (0x3ffffff << 2) - || (bfd_signed_vma)relocation < (-0x4000000 * 4)) - return bfd_reloc_outofrange; - - addr = (bfd_byte *) data + reloc_entry->address; - insn = bfd_get_32 (abfd, addr); - - relocation >>= reloc_entry->howto->rightshift; - insn = (insn & ~reloc_entry->howto->dst_mask) - | (relocation & reloc_entry->howto->dst_mask); - - bfd_put_32 (abfd, (bfd_vma) insn, addr); - - return bfd_reloc_ok; -} - -/* special_function for R_860_PC16 relocation. */ -static bfd_reloc_status_type -i860_howto_pc16_reloc (bfd *abfd, - arelent *reloc_entry, - asymbol *symbol, - void *data, - asection *input_section, - bfd *output_bfd, - char **error_message ATTRIBUTE_UNUSED) -{ - bfd_vma insn; - bfd_vma relocation; - bfd_byte *addr; - - if (output_bfd != NULL - && (symbol->flags & BSF_SECTION_SYM) == 0 - && (! reloc_entry->howto->partial_inplace - || reloc_entry->addend == 0)) - { - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - - /* Used elf32-mips.c as an example. */ - if (bfd_is_und_section (symbol->section) - && output_bfd == (bfd *) NULL) - return 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; - - /* Adjust for PC-relative relocation. */ - relocation -= (input_section->output_section->vma - + input_section->output_offset - + reloc_entry->address - + 4); - - /* Check for target out of range. */ - if ((bfd_signed_vma)relocation > (0x7fff << 2) - || (bfd_signed_vma)relocation < (-0x8000 * 4)) - return bfd_reloc_outofrange; - - addr = (bfd_byte *) data + reloc_entry->address; - insn = bfd_get_32 (abfd, addr); - - relocation >>= reloc_entry->howto->rightshift; - relocation = (((relocation & 0xf800) << 5) | (relocation & 0x7ff)) - & reloc_entry->howto->dst_mask; - insn = (insn & ~reloc_entry->howto->dst_mask) | relocation; - - bfd_put_32 (abfd, (bfd_vma) insn, addr); - - return bfd_reloc_ok; -} - -/* special_function for R_860_HIGHADJ relocation. */ -static bfd_reloc_status_type -i860_howto_highadj_reloc (bfd *abfd, - arelent *reloc_entry, - asymbol *symbol, - void *data, - asection *input_section, - bfd *output_bfd, - char **error_message ATTRIBUTE_UNUSED) -{ - bfd_vma insn; - bfd_vma relocation; - bfd_byte *addr; - - if (output_bfd != NULL - && (symbol->flags & BSF_SECTION_SYM) == 0 - && (! reloc_entry->howto->partial_inplace - || reloc_entry->addend == 0)) - { - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - - /* Used elf32-mips.c as an example. */ - if (bfd_is_und_section (symbol->section) - && output_bfd == (bfd *) NULL) - return 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; - relocation += 0x8000; - - if (reloc_entry->address > bfd_get_section_limit (abfd, input_section)) - return bfd_reloc_outofrange; - - addr = (bfd_byte *) data + reloc_entry->address; - insn = bfd_get_32 (abfd, addr); - - relocation = ((relocation >> 16) & 0xffff); - - insn = (insn & 0xffff0000) | relocation; - - bfd_put_32 (abfd, (bfd_vma) insn, addr); - - return bfd_reloc_ok; -} - -/* special_function for R_860_SPLITn relocations. */ -static bfd_reloc_status_type -i860_howto_splitn_reloc (bfd *abfd, - arelent *reloc_entry, - asymbol *symbol, - void *data, - asection *input_section, - bfd *output_bfd, - char **error_message ATTRIBUTE_UNUSED) -{ - bfd_vma insn; - bfd_vma relocation; - bfd_byte *addr; - - if (output_bfd != NULL - && (symbol->flags & BSF_SECTION_SYM) == 0 - && (! reloc_entry->howto->partial_inplace - || reloc_entry->addend == 0)) - { - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - - /* Used elf32-mips.c as an example. */ - if (bfd_is_und_section (symbol->section) - && output_bfd == (bfd *) NULL) - return 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; - - addr = (bfd_byte *) data + reloc_entry->address; - insn = bfd_get_32 (abfd, addr); - - relocation = (((relocation & 0xf800) << 5) | (relocation & 0x7ff)) - & reloc_entry->howto->dst_mask; - insn = (insn & ~reloc_entry->howto->dst_mask) | relocation; - - bfd_put_32 (abfd, (bfd_vma) insn, addr); - - return bfd_reloc_ok; -} - -/* This howto table is preliminary. */ -static reloc_howto_type elf32_i860_howto_table [] = -{ - /* This relocation does nothing. */ - HOWTO (R_860_NONE, /* type */ - 0, /* rightshift */ - 3, /* size (0 = byte, 1 = short, 2 = long) */ - 0, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_860_NONE", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* A 32-bit absolute relocation. */ - HOWTO (R_860_32, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_860_32", /* name */ - FALSE, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_860_COPY, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_860_COPY", /* name */ - TRUE, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_860_GLOB_DAT, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_860_GLOB_DAT", /* name */ - TRUE, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_860_JUMP_SLOT, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_860_JUMP_SLOT", /* name */ - TRUE, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_860_RELATIVE, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_860_RELATIVE", /* name */ - TRUE, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* A 26-bit PC-relative relocation. */ - HOWTO (R_860_PC26, /* type */ - 2, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 26, /* bitsize */ - TRUE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - i860_howto_pc26_reloc, /* special_function */ - "R_860_PC26", /* name */ - FALSE, /* partial_inplace */ - 0x3ffffff, /* src_mask */ - 0x3ffffff, /* dst_mask */ - TRUE), /* pcrel_offset */ - - HOWTO (R_860_PLT26, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 26, /* bitsize */ - TRUE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_860_PLT26", /* name */ - TRUE, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - TRUE), /* pcrel_offset */ - - /* A 16-bit PC-relative relocation. */ - HOWTO (R_860_PC16, /* type */ - 2, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - TRUE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - i860_howto_pc16_reloc, /* special_function */ - "R_860_PC16", /* name */ - FALSE, /* partial_inplace */ - 0x1f07ff, /* src_mask */ - 0x1f07ff, /* dst_mask */ - TRUE), /* pcrel_offset */ - - HOWTO (R_860_LOW0, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_860_LOW0", /* name */ - FALSE, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_860_SPLIT0, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - i860_howto_splitn_reloc, /* special_function */ - "R_860_SPLIT0", /* name */ - FALSE, /* partial_inplace */ - 0x1f07ff, /* src_mask */ - 0x1f07ff, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_860_LOW1, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_860_LOW1", /* name */ - FALSE, /* partial_inplace */ - 0xfffe, /* src_mask */ - 0xfffe, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_860_SPLIT1, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - i860_howto_splitn_reloc, /* special_function */ - "R_860_SPLIT1", /* name */ - FALSE, /* partial_inplace */ - 0x1f07fe, /* src_mask */ - 0x1f07fe, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_860_LOW2, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_860_LOW2", /* name */ - FALSE, /* partial_inplace */ - 0xfffc, /* src_mask */ - 0xfffc, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_860_SPLIT2, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - i860_howto_splitn_reloc, /* special_function */ - "R_860_SPLIT2", /* name */ - FALSE, /* partial_inplace */ - 0x1f07fc, /* src_mask */ - 0x1f07fc, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_860_LOW3, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_860_LOW3", /* name */ - FALSE, /* partial_inplace */ - 0xfff8, /* src_mask */ - 0xfff8, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_860_LOGOT0, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_860_LOGOT0", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - TRUE), /* pcrel_offset */ - - HOWTO (R_860_SPGOT0, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_860_SPGOT0", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - TRUE), /* pcrel_offset */ - - HOWTO (R_860_LOGOT1, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_860_LOGOT1", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - TRUE), /* pcrel_offset */ - - HOWTO (R_860_SPGOT1, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_860_SPGOT1", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - TRUE), /* pcrel_offset */ - - HOWTO (R_860_LOGOTOFF0, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_860_LOGOTOFF0", /* name */ - TRUE, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_860_SPGOTOFF0, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_860_SPGOTOFF0", /* name */ - TRUE, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_860_LOGOTOFF1, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_860_LOGOTOFF1", /* name */ - TRUE, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_860_SPGOTOFF1, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_860_SPGOTOFF1", /* name */ - TRUE, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_860_LOGOTOFF2, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_860_LOGOTOFF2", /* name */ - TRUE, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_860_LOGOTOFF3, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_860_LOGOTOFF3", /* name */ - TRUE, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_860_LOPC, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - TRUE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_860_LOPC", /* name */ - FALSE, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - TRUE), /* pcrel_offset */ - - HOWTO (R_860_HIGHADJ, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - i860_howto_highadj_reloc, /* special_function */ - "R_860_HIGHADJ", /* name */ - FALSE, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_860_HAGOT, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_860_HAGOT", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - TRUE), /* pcrel_offset */ - - HOWTO (R_860_HAGOTOFF, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_860_HAGOTOFF", /* name */ - TRUE, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_860_HAPC, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - TRUE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_860_HAPC", /* name */ - FALSE, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - TRUE), /* pcrel_offset */ - - HOWTO (R_860_HIGH, /* type */ - 16, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_860_HIGH", /* name */ - FALSE, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_860_HIGOT, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_860_HIGOT", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - TRUE), /* pcrel_offset */ - - HOWTO (R_860_HIGOTOFF, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_860_HIGOTOFF", /* name */ - TRUE, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - FALSE), /* pcrel_offset */ -}; - -static unsigned char elf_code_to_howto_index[R_860_max + 1]; - -static reloc_howto_type * -lookup_howto (bfd *abfd, unsigned int rtype) -{ - static int initialized = 0; - int i; - int howto_tbl_size = (int) (sizeof (elf32_i860_howto_table) - / sizeof (elf32_i860_howto_table[0])); - reloc_howto_type *howto = NULL; - - if (! initialized) - { - initialized = 1; - memset (elf_code_to_howto_index, 0xff, - sizeof (elf_code_to_howto_index)); - for (i = 0; i < howto_tbl_size; i++) - elf_code_to_howto_index[elf32_i860_howto_table[i].type] = i; - } - - if (rtype < R_860_max) - { - i = elf_code_to_howto_index[rtype]; - if (i < howto_tbl_size) - howto = elf32_i860_howto_table + i; - } - if (howto == NULL) - { - _bfd_error_handler (_("%pB: unsupported relocation type %#x"), - abfd, rtype); - bfd_set_error (bfd_error_bad_value); - } - return howto; -} - -/* Given a BFD reloc, return the matching HOWTO structure. */ -static reloc_howto_type * -elf32_i860_reloc_type_lookup (bfd *abfd, bfd_reloc_code_real_type code) -{ - unsigned int rtype; - - switch (code) - { - case BFD_RELOC_NONE: - rtype = R_860_NONE; - break; - case BFD_RELOC_32: - rtype = R_860_32; - break; - case BFD_RELOC_860_COPY: - rtype = R_860_COPY; - break; - case BFD_RELOC_860_GLOB_DAT: - rtype = R_860_GLOB_DAT; - break; - case BFD_RELOC_860_JUMP_SLOT: - rtype = R_860_JUMP_SLOT; - break; - case BFD_RELOC_860_RELATIVE: - rtype = R_860_RELATIVE; - break; - case BFD_RELOC_860_PC26: - rtype = R_860_PC26; - break; - case BFD_RELOC_860_PLT26: - rtype = R_860_PLT26; - break; - case BFD_RELOC_860_PC16: - rtype = R_860_PC16; - break; - case BFD_RELOC_860_LOW0: - rtype = R_860_LOW0; - break; - case BFD_RELOC_860_SPLIT0: - rtype = R_860_SPLIT0; - break; - case BFD_RELOC_860_LOW1: - rtype = R_860_LOW1; - break; - case BFD_RELOC_860_SPLIT1: - rtype = R_860_SPLIT1; - break; - case BFD_RELOC_860_LOW2: - rtype = R_860_LOW2; - break; - case BFD_RELOC_860_SPLIT2: - rtype = R_860_SPLIT2; - break; - case BFD_RELOC_860_LOW3: - rtype = R_860_LOW3; - break; - case BFD_RELOC_860_LOGOT0: - rtype = R_860_LOGOT0; - break; - case BFD_RELOC_860_SPGOT0: - rtype = R_860_SPGOT0; - break; - case BFD_RELOC_860_LOGOT1: - rtype = R_860_LOGOT1; - break; - case BFD_RELOC_860_SPGOT1: - rtype = R_860_SPGOT1; - break; - case BFD_RELOC_860_LOGOTOFF0: - rtype = R_860_LOGOTOFF0; - break; - case BFD_RELOC_860_SPGOTOFF0: - rtype = R_860_SPGOTOFF0; - break; - case BFD_RELOC_860_LOGOTOFF1: - rtype = R_860_LOGOTOFF1; - break; - case BFD_RELOC_860_SPGOTOFF1: - rtype = R_860_SPGOTOFF1; - break; - case BFD_RELOC_860_LOGOTOFF2: - rtype = R_860_LOGOTOFF2; - break; - case BFD_RELOC_860_LOGOTOFF3: - rtype = R_860_LOGOTOFF3; - break; - case BFD_RELOC_860_LOPC: - rtype = R_860_LOPC; - break; - case BFD_RELOC_860_HIGHADJ: - rtype = R_860_HIGHADJ; - break; - case BFD_RELOC_860_HAGOT: - rtype = R_860_HAGOT; - break; - case BFD_RELOC_860_HAGOTOFF: - rtype = R_860_HAGOTOFF; - break; - case BFD_RELOC_860_HAPC: - rtype = R_860_HAPC; - break; - case BFD_RELOC_860_HIGH: - rtype = R_860_HIGH; - break; - case BFD_RELOC_860_HIGOT: - rtype = R_860_HIGOT; - break; - case BFD_RELOC_860_HIGOTOFF: - rtype = R_860_HIGOTOFF; - break; - default: - return NULL; - } - return lookup_howto (abfd, rtype); -} - -static reloc_howto_type * -elf32_i860_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, - const char *r_name) -{ - unsigned int i; - - for (i = 0; - i < (sizeof (elf32_i860_howto_table) - / sizeof (elf32_i860_howto_table[0])); - i++) - if (elf32_i860_howto_table[i].name != NULL - && strcasecmp (elf32_i860_howto_table[i].name, r_name) == 0) - return &elf32_i860_howto_table[i]; - - return NULL; -} - -/* Given a ELF reloc, return the matching HOWTO structure. */ - -static bfd_boolean -elf32_i860_info_to_howto_rela (bfd *abfd, - arelent *bfd_reloc, - Elf_Internal_Rela *elf_reloc) -{ - bfd_reloc->howto - = lookup_howto (abfd, (unsigned) ELF32_R_TYPE (elf_reloc->r_info)); - return bfd_reloc->howto != NULL; -} - -/* Specialized relocation handler for R_860_SPLITn. These relocations - involves a 16-bit field that is split into two contiguous parts. */ -static bfd_reloc_status_type -elf32_i860_relocate_splitn (bfd *input_bfd, - Elf_Internal_Rela *rello, - bfd_byte *contents, - bfd_vma value) -{ - bfd_vma insn; - reloc_howto_type *howto; - howto = lookup_howto (input_bfd, (unsigned) ELF32_R_TYPE (rello->r_info)); - insn = bfd_get_32 (input_bfd, contents + rello->r_offset); - - /* Relocate. */ - value += rello->r_addend; - - /* Separate the fields and insert. */ - value = (((value & 0xf800) << 5) | (value & 0x7ff)) & howto->dst_mask; - insn = (insn & ~howto->dst_mask) | value; - - bfd_put_32 (input_bfd, insn, contents + rello->r_offset); - return bfd_reloc_ok; -} - -/* Specialized relocation handler for R_860_PC16. This relocation - involves a 16-bit, PC-relative field that is split into two contiguous - parts. */ -static bfd_reloc_status_type -elf32_i860_relocate_pc16 (bfd *input_bfd, - asection *input_section, - Elf_Internal_Rela *rello, - bfd_byte *contents, - bfd_vma value) -{ - bfd_vma insn; - reloc_howto_type *howto; - howto = lookup_howto (input_bfd, (unsigned) ELF32_R_TYPE (rello->r_info)); - insn = bfd_get_32 (input_bfd, contents + rello->r_offset); - - /* Adjust for PC-relative relocation. */ - value -= (input_section->output_section->vma - + input_section->output_offset); - value -= rello->r_offset; - - /* Relocate. */ - value += rello->r_addend; - - /* Adjust the value by 4, then separate the fields and insert. */ - value = (value - 4) >> howto->rightshift; - value = (((value & 0xf800) << 5) | (value & 0x7ff)) & howto->dst_mask; - insn = (insn & ~howto->dst_mask) | value; - - bfd_put_32 (input_bfd, insn, contents + rello->r_offset); - return bfd_reloc_ok; - -} - -/* Specialized relocation handler for R_860_PC26. This relocation - involves a 26-bit, PC-relative field which must be adjusted by 4. */ -static bfd_reloc_status_type -elf32_i860_relocate_pc26 (bfd *input_bfd, - asection *input_section, - Elf_Internal_Rela *rello, - bfd_byte *contents, - bfd_vma value) -{ - bfd_vma insn; - reloc_howto_type *howto; - howto = lookup_howto (input_bfd, (unsigned) ELF32_R_TYPE (rello->r_info)); - insn = bfd_get_32 (input_bfd, contents + rello->r_offset); - - /* Adjust for PC-relative relocation. */ - value -= (input_section->output_section->vma - + input_section->output_offset); - value -= rello->r_offset; - - /* Relocate. */ - value += rello->r_addend; - - /* Adjust value by 4 and insert the field. */ - value = ((value - 4) >> howto->rightshift) & howto->dst_mask; - insn = (insn & ~howto->dst_mask) | value; - - bfd_put_32 (input_bfd, insn, contents + rello->r_offset); - return bfd_reloc_ok; - -} - -/* Specialized relocation handler for R_860_HIGHADJ. */ -static bfd_reloc_status_type -elf32_i860_relocate_highadj (bfd *input_bfd, - Elf_Internal_Rela *rel, - bfd_byte *contents, - bfd_vma value) -{ - bfd_vma insn; - - insn = bfd_get_32 (input_bfd, contents + rel->r_offset); - - value += rel->r_addend; - value += 0x8000; - value = ((value >> 16) & 0xffff); - - insn = (insn & 0xffff0000) | value; - - bfd_put_32 (input_bfd, insn, contents + rel->r_offset); - return bfd_reloc_ok; -} - -/* Perform a single relocation. By default we use the standard BFD - routines. However, we handle some specially. */ -static bfd_reloc_status_type -i860_final_link_relocate (reloc_howto_type *howto, - bfd *input_bfd, - asection *input_section, - bfd_byte *contents, - Elf_Internal_Rela *rel, - bfd_vma relocation) -{ - return _bfd_final_link_relocate (howto, input_bfd, input_section, - contents, rel->r_offset, relocation, - rel->r_addend); -} - -/* Relocate an i860 ELF section. - - This is boiler-plate code copied from fr30. - - The RELOCATE_SECTION function is called by the new ELF backend linker - to handle the relocations for a section. - - The relocs are always passed as Rela structures; if the section - actually uses Rel structures, the r_addend field will always be - zero. - - This function is responsible for adjusting the section contents as - necessary, and (if using Rela relocs and generating a relocatable - output file) adjusting the reloc addend as necessary. - - This function does not have to worry about setting the reloc - address or the reloc symbol index. - - LOCAL_SYMS is a pointer to the swapped in local symbols. - - LOCAL_SECTIONS is an array giving the section in the input file - corresponding to the st_shndx field of each local symbol. - - The global hash table entry for the global symbols can be found - via elf_sym_hashes (input_bfd). - - When generating relocatable output, this function must handle - STB_LOCAL/STT_SECTION symbols specially. The output symbol is - going to be the section symbol corresponding to the output - section, which means that the addend must be adjusted - accordingly. */ -static bfd_boolean -elf32_i860_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, - struct bfd_link_info *info, - bfd *input_bfd, - asection *input_section, - bfd_byte *contents, - Elf_Internal_Rela *relocs, - Elf_Internal_Sym *local_syms, - asection **local_sections) -{ - Elf_Internal_Shdr *symtab_hdr; - struct elf_link_hash_entry **sym_hashes; - Elf_Internal_Rela *rel; - Elf_Internal_Rela *relend; - - symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr; - sym_hashes = elf_sym_hashes (input_bfd); - relend = relocs + input_section->reloc_count; - - for (rel = relocs; rel < relend; rel ++) - { - reloc_howto_type * howto; - unsigned long r_symndx; - Elf_Internal_Sym * sym; - asection * sec; - struct elf_link_hash_entry * h; - bfd_vma relocation; - bfd_reloc_status_type r; - const char * name = NULL; - int r_type; - - r_type = ELF32_R_TYPE (rel->r_info); - r_symndx = ELF32_R_SYM (rel->r_info); - - howto = lookup_howto (input_bfd, (unsigned) ELF32_R_TYPE (rel->r_info)); - h = NULL; - sym = NULL; - sec = NULL; - - if (r_symndx < symtab_hdr->sh_info) - { - sym = local_syms + r_symndx; - sec = local_sections [r_symndx]; - relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); - - name = bfd_elf_string_from_elf_section - (input_bfd, symtab_hdr->sh_link, sym->st_name); - name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name; - } - else - { - bfd_boolean unresolved_reloc, warned, ignored; - - RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, - r_symndx, symtab_hdr, sym_hashes, - h, sec, relocation, - unresolved_reloc, warned, ignored); - } - - if (sec != NULL && discarded_section (sec)) - RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, - rel, 1, relend, howto, 0, contents); - - if (bfd_link_relocatable (info)) - continue; - - switch (r_type) - { - default: - r = i860_final_link_relocate (howto, input_bfd, input_section, - contents, rel, relocation); - break; - - case R_860_HIGHADJ: - r = elf32_i860_relocate_highadj (input_bfd, rel, contents, - relocation); - break; - - case R_860_PC16: - r = elf32_i860_relocate_pc16 (input_bfd, input_section, rel, - contents, relocation); - break; - - case R_860_PC26: - r = elf32_i860_relocate_pc26 (input_bfd, input_section, rel, - contents, relocation); - break; - - case R_860_SPLIT0: - case R_860_SPLIT1: - case R_860_SPLIT2: - r = elf32_i860_relocate_splitn (input_bfd, rel, contents, - relocation); - break; - - /* We do not yet handle GOT/PLT/Dynamic relocations. */ - case R_860_COPY: - case R_860_GLOB_DAT: - case R_860_JUMP_SLOT: - case R_860_RELATIVE: - case R_860_PLT26: - case R_860_LOGOT0: - case R_860_SPGOT0: - case R_860_LOGOT1: - case R_860_SPGOT1: - case R_860_LOGOTOFF0: - case R_860_SPGOTOFF0: - case R_860_LOGOTOFF1: - case R_860_SPGOTOFF1: - case R_860_LOGOTOFF2: - case R_860_LOGOTOFF3: - case R_860_LOPC: - case R_860_HAGOT: - case R_860_HAGOTOFF: - case R_860_HAPC: - case R_860_HIGOT: - case R_860_HIGOTOFF: - r = bfd_reloc_notsupported; - break; - } - - if (r != bfd_reloc_ok) - { - const char * msg = (const char *) NULL; - - switch (r) - { - case bfd_reloc_overflow: - (*info->callbacks->reloc_overflow) - (info, (h ? &h->root : NULL), name, howto->name, - (bfd_vma) 0, input_bfd, input_section, rel->r_offset); - break; - - case bfd_reloc_undefined: - (*info->callbacks->undefined_symbol) - (info, name, input_bfd, input_section, rel->r_offset, TRUE); - break; - - case bfd_reloc_outofrange: - msg = _("internal error: out of range error"); - break; - - case bfd_reloc_notsupported: - msg = _("internal error: unsupported relocation error"); - break; - - case bfd_reloc_dangerous: - msg = _("internal error: dangerous relocation"); - break; - - default: - msg = _("internal error: unknown error"); - break; - } - - if (msg) - (*info->callbacks->warning) (info, msg, name, input_bfd, - input_section, rel->r_offset); - } - } - - return TRUE; -} - -/* Return whether a symbol name implies a local label. SVR4/860 compilers - generate labels of the form ".ep.function_name" to denote the end of a - function prolog. These should be local. - ??? Do any other SVR4 compilers have this convention? If so, this should - be added to the generic routine. */ -static bfd_boolean -elf32_i860_is_local_label_name (bfd *abfd, const char *name) -{ - if (name[0] == '.' && name[1] == 'e' && name[2] == 'p' && name[3] == '.') - return TRUE; - - return _bfd_elf_is_local_label_name (abfd, name); -} - -#define TARGET_BIG_SYM i860_elf32_vec -#define TARGET_BIG_NAME "elf32-i860" -#define TARGET_LITTLE_SYM i860_elf32_le_vec -#define TARGET_LITTLE_NAME "elf32-i860-little" -#define ELF_ARCH bfd_arch_i860 -#define ELF_MACHINE_CODE EM_860 -#define ELF_MAXPAGESIZE 4096 - -#define elf_backend_rela_normal 1 -#define elf_info_to_howto_rel NULL -#define elf_info_to_howto elf32_i860_info_to_howto_rela -#define elf_backend_relocate_section elf32_i860_relocate_section -#define bfd_elf32_bfd_reloc_type_lookup elf32_i860_reloc_type_lookup -#define bfd_elf32_bfd_reloc_name_lookup elf32_i860_reloc_name_lookup -#define bfd_elf32_bfd_is_local_label_name elf32_i860_is_local_label_name - -#include "elf32-target.h" diff --git a/bfd/elf32-i960.c b/bfd/elf32-i960.c deleted file mode 100644 index 244e4ea..0000000 --- a/bfd/elf32-i960.c +++ /dev/null @@ -1,169 +0,0 @@ -/* Intel 960 specific support for 32-bit ELF - Copyright (C) 1999-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" -#include "libbfd.h" -#include "elf-bfd.h" -#include "elf/i960.h" - -#define USE_REL 1 - -#define bfd_elf32_bfd_reloc_type_lookup elf32_i960_reloc_type_lookup -#define bfd_elf32_bfd_reloc_name_lookup \ - elf32_i960_reloc_name_lookup -#define elf_info_to_howto NULL -#define elf_info_to_howto_rel elf32_i960_info_to_howto_rel - -/* ELF relocs are against symbols. 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 -elf32_i960_relocate (bfd *abfd ATTRIBUTE_UNUSED, - arelent *reloc_entry, - asymbol *symbol, - void * data ATTRIBUTE_UNUSED, - asection *input_section, - bfd *output_bfd, - char **error_message ATTRIBUTE_UNUSED) -{ - /* HACK: I think this first condition is necessary when producing - relocatable output. After the end of HACK, the code is identical - to bfd_elf_generic_reloc(). I would _guess_ the first change - belongs there rather than here. martindo 1998-10-23. */ - if (output_bfd != (bfd *) NULL - && reloc_entry->howto->pc_relative - && !reloc_entry->howto->pcrel_offset) - reloc_entry->addend -= symbol->value; - - /* This is more dubious. */ - else if (output_bfd != (bfd *) NULL - && (symbol->flags & BSF_SECTION_SYM) != 0) - reloc_entry->addend -= symbol->section->output_section->vma; - - else - { - /* ...end of HACK. */ - if (output_bfd != (bfd *) NULL - && (symbol->flags & BSF_SECTION_SYM) == 0 - && (! reloc_entry->howto->partial_inplace - || reloc_entry->addend == 0)) - { - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - } - - return bfd_reloc_continue; -} - -static reloc_howto_type elf_howto_table[]= -{ - HOWTO (R_960_NONE, 0, 3, 0, FALSE, 0, complain_overflow_dont, - elf32_i960_relocate, "R_960_NONE", TRUE, - 0x00000000, 0x00000000, FALSE), - EMPTY_HOWTO (1), - HOWTO (R_960_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, - elf32_i960_relocate, "R_960_32", TRUE, - 0xffffffff, 0xffffffff, FALSE), - HOWTO (R_960_IP24, 0, 2, 24, TRUE, 0, complain_overflow_signed, - elf32_i960_relocate, "R_960_IP24 ", TRUE, - 0x00ffffff, 0x00ffffff, FALSE), - EMPTY_HOWTO (4), - EMPTY_HOWTO (5), - EMPTY_HOWTO (6), - EMPTY_HOWTO (7) -}; - -static enum elf_i960_reloc_type -elf32_i960_bfd_to_reloc_type (bfd_reloc_code_real_type code) -{ - switch (code) - { - default: - return R_960_NONE; - case BFD_RELOC_I960_CALLJ: - return R_960_OPTCALL; - case BFD_RELOC_32: - case BFD_RELOC_CTOR: - return R_960_32; - case BFD_RELOC_24_PCREL: - return R_960_IP24; - } -} - -static bfd_boolean -elf32_i960_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED, - arelent *cache_ptr, - Elf_Internal_Rela *dst) -{ - enum elf_i960_reloc_type type; - - type = (enum elf_i960_reloc_type) ELF32_R_TYPE (dst->r_info); - - /* PR 17521: file: 9609b8d6. */ - if (type >= R_960_max) - { - /* xgettext:c-format */ - _bfd_error_handler (_("%pB: unsupported relocation type %#x"), - abfd, type); - bfd_set_error (bfd_error_bad_value); - return FALSE; - } - - cache_ptr->howto = &elf_howto_table[(int) type]; - return TRUE; -} - -static reloc_howto_type * -elf32_i960_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, - bfd_reloc_code_real_type code) -{ - return elf_howto_table + elf32_i960_bfd_to_reloc_type (code); -} - -static reloc_howto_type * -elf32_i960_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, - const char *r_name) -{ - unsigned int i; - - for (i = 0; i < sizeof (elf_howto_table) / sizeof (elf_howto_table[0]); i++) - if (elf_howto_table[i].name != NULL - && strcasecmp (elf_howto_table[i].name, r_name) == 0) - return &elf_howto_table[i]; - - return NULL; -} - -#define TARGET_LITTLE_SYM i960_elf32_vec -#define TARGET_LITTLE_NAME "elf32-i960" -#define ELF_ARCH bfd_arch_i960 -#define ELF_MACHINE_CODE EM_960 -#define ELF_MAXPAGESIZE 1 /* FIXME: This number is wrong, It should be the page size in bytes. */ - -#include "elf32-target.h" diff --git a/bfd/hosts/i860mach3.h b/bfd/hosts/i860mach3.h deleted file mode 100644 index f18ff37..0000000 --- a/bfd/hosts/i860mach3.h +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (C) 2007-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. */ - -/* This file was hacked from i386mach3.h [dolan@ssd.intel.com] */ - -#include <machine/vmparam.h> -#include <sys/param.h> - -/* This is an ugly way to hack around the incorrect - * definition of UPAGES in i386/machparam.h. - * - * The definition should specify the size reserved - * for "struct user" in core files in PAGES, - * but instead it gives it in 512-byte core-clicks - * for i386 and i860. UPAGES is used only in trad-core.c. - */ -#if UPAGES == 16 -#undef UPAGES -#define UPAGES 2 -#endif - -#if UPAGES != 2 -FIXME!! UPAGES is neither 2 nor 16 -#endif - -#define HOST_PAGE_SIZE 1 -#define HOST_SEGMENT_SIZE NBPG -#define HOST_MACHINE_ARCH bfd_arch_i860 -#define HOST_TEXT_START_ADDR USRTEXT -#define HOST_STACK_END_ADDR USRSTACK @@ -3567,34 +3567,6 @@ ieee_write_processor (bfd *abfd) return FALSE; break; - case bfd_arch_i960: - switch (arch->mach) - { - default: - case bfd_mach_i960_core: - case bfd_mach_i960_ka_sa: - if (! ieee_write_id (abfd, "80960KA")) - return FALSE; - break; - - case bfd_mach_i960_kb_sb: - if (! ieee_write_id (abfd, "80960KB")) - return FALSE; - break; - - case bfd_mach_i960_ca: - if (! ieee_write_id (abfd, "80960CA")) - return FALSE; - break; - - case bfd_mach_i960_mc: - case bfd_mach_i960_xa: - if (! ieee_write_id (abfd, "80960MC")) - return FALSE; - break; - } - break; - case bfd_arch_m68k: { const char *id; diff --git a/bfd/libbfd.h b/bfd/libbfd.h index 4af1019..5a087a7 100644 --- a/bfd/libbfd.h +++ b/bfd/libbfd.h @@ -981,7 +981,6 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@", "BFD_RELOC_LO10", "BFD_RELOC_GPREL16", "BFD_RELOC_GPREL32", - "BFD_RELOC_I960_CALLJ", "BFD_RELOC_NONE", "BFD_RELOC_SPARC_WDISP22", "BFD_RELOC_SPARC22", @@ -2588,38 +2587,6 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@", "BFD_RELOC_CRIS_16_TPREL", "BFD_RELOC_CRIS_DTPMOD", "BFD_RELOC_CRIS_32_IE", - "BFD_RELOC_860_COPY", - "BFD_RELOC_860_GLOB_DAT", - "BFD_RELOC_860_JUMP_SLOT", - "BFD_RELOC_860_RELATIVE", - "BFD_RELOC_860_PC26", - "BFD_RELOC_860_PLT26", - "BFD_RELOC_860_PC16", - "BFD_RELOC_860_LOW0", - "BFD_RELOC_860_SPLIT0", - "BFD_RELOC_860_LOW1", - "BFD_RELOC_860_SPLIT1", - "BFD_RELOC_860_LOW2", - "BFD_RELOC_860_SPLIT2", - "BFD_RELOC_860_LOW3", - "BFD_RELOC_860_LOGOT0", - "BFD_RELOC_860_SPGOT0", - "BFD_RELOC_860_LOGOT1", - "BFD_RELOC_860_SPGOT1", - "BFD_RELOC_860_LOGOTOFF0", - "BFD_RELOC_860_SPGOTOFF0", - "BFD_RELOC_860_LOGOTOFF1", - "BFD_RELOC_860_SPGOTOFF1", - "BFD_RELOC_860_LOGOTOFF2", - "BFD_RELOC_860_LOGOTOFF3", - "BFD_RELOC_860_LOPC", - "BFD_RELOC_860_HIGHADJ", - "BFD_RELOC_860_HAGOT", - "BFD_RELOC_860_HAGOTOFF", - "BFD_RELOC_860_HAPC", - "BFD_RELOC_860_HIGH", - "BFD_RELOC_860_HIGOT", - "BFD_RELOC_860_HIGOTOFF", "BFD_RELOC_OR1K_REL_26", "BFD_RELOC_OR1K_GOTPC_HI16", "BFD_RELOC_OR1K_GOTPC_LO16", diff --git a/bfd/mach-o.c b/bfd/mach-o.c index f26be0c..ded60cf 100644 --- a/bfd/mach-o.c +++ b/bfd/mach-o.c @@ -1047,9 +1047,6 @@ bfd_mach_o_convert_architecture (bfd_mach_o_cpu_type mtype, *type = bfd_arch_sparc; *subtype = bfd_mach_sparc; break; - case BFD_MACH_O_CPU_TYPE_I860: - *type = bfd_arch_i860; - break; case BFD_MACH_O_CPU_TYPE_ALPHA: *type = bfd_arch_alpha; break; @@ -5446,8 +5443,6 @@ bfd_mach_o_stack_addr (enum bfd_mach_o_cpu_type type) return 0xc0000000; case BFD_MACH_O_CPU_TYPE_SPARC: return 0xf0000000; - case BFD_MACH_O_CPU_TYPE_I860: - return 0; case BFD_MACH_O_CPU_TYPE_HPPA: return 0xc0000000 - 0x04000000; default: diff --git a/bfd/po/SRC-POTFILES.in b/bfd/po/SRC-POTFILES.in index 7ea56ca..afa459e 100644 --- a/bfd/po/SRC-POTFILES.in +++ b/bfd/po/SRC-POTFILES.in @@ -1,6 +1,5 @@ aix386-core.c aix5ppc-core.c -aout-adobe.c aout-arm.c aout-cris.c aout-ns32k.c @@ -20,7 +19,6 @@ bfd.c bfdio.c bfdwin.c binary.c -bout.c cache.c cf-i386lynx.c cf-sparclynx.c @@ -34,8 +32,6 @@ coff-go32.c coff-h8300.c coff-h8500.c coff-i386.c -coff-i860.c -coff-i960.c coff-m68k.c coff-m88k.c coff-mips.c @@ -83,8 +79,6 @@ cpu-h8500.c cpu-hppa.c cpu-i370.c cpu-i386.c -cpu-i860.c -cpu-i960.c cpu-ia64.c cpu-iamcu.c cpu-ip2k.c @@ -190,8 +184,6 @@ elf32-hppa.c elf32-hppa.h elf32-i370.c elf32-i386.c -elf32-i860.c -elf32-i960.c elf32-ip2k.c elf32-iq2000.c elf32-lm32.c diff --git a/bfd/reloc.c b/bfd/reloc.c index ca1d81c..9da9128 100644 --- a/bfd/reloc.c +++ b/bfd/reloc.c @@ -87,10 +87,9 @@ CODE_FRAGMENT . {* The symbol to relocate against was undefined. *} . bfd_reloc_undefined, . -. {* The relocation was performed, but may not be ok - presently -. generated only when linking i960 coff files with i960 b.out -. symbols. If this type is returned, the error_message argument -. to bfd_perform_relocation will be set. *} +. {* The relocation was performed, but may not be ok. If this type is +. returned, the error_message argument to bfd_perform_relocation +. will be set. *} . bfd_reloc_dangerous . } . bfd_reloc_status_type; @@ -318,8 +317,7 @@ CODE_FRAGMENT . . {* If this field is non null, then the supplied function is . called rather than the normal function. This allows really -. strange relocation methods to be accommodated (e.g., i960 callj -. instructions). *} +. strange relocation methods to be accommodated. *} . bfd_reloc_status_type (*special_function) . (bfd *, arelent *, struct bfd_symbol *, void *, asection *, . bfd *, char **); @@ -1739,8 +1737,6 @@ ENUMDOC of the relocation itself; sometimes they are relative to the start of the section containing the relocation. It depends on the specific target. -The 24-bit relocation is used in some Intel 960 configurations. - ENUM BFD_RELOC_32_SECREL ENUMDOC @@ -1892,11 +1888,6 @@ handled specially, because the value the register will have is decided relatively late. ENUM - BFD_RELOC_I960_CALLJ -ENUMDOC - Reloc types used for i960/b.out. - -ENUM BFD_RELOC_NONE ENUMX BFD_RELOC_SPARC_WDISP22 @@ -6225,73 +6216,6 @@ ENUMDOC Relocs used in TLS code for CRIS. ENUM - BFD_RELOC_860_COPY -ENUMX - BFD_RELOC_860_GLOB_DAT -ENUMX - BFD_RELOC_860_JUMP_SLOT -ENUMX - BFD_RELOC_860_RELATIVE -ENUMX - BFD_RELOC_860_PC26 -ENUMX - BFD_RELOC_860_PLT26 -ENUMX - BFD_RELOC_860_PC16 -ENUMX - BFD_RELOC_860_LOW0 -ENUMX - BFD_RELOC_860_SPLIT0 -ENUMX - BFD_RELOC_860_LOW1 -ENUMX - BFD_RELOC_860_SPLIT1 -ENUMX - BFD_RELOC_860_LOW2 -ENUMX - BFD_RELOC_860_SPLIT2 -ENUMX - BFD_RELOC_860_LOW3 -ENUMX - BFD_RELOC_860_LOGOT0 -ENUMX - BFD_RELOC_860_SPGOT0 -ENUMX - BFD_RELOC_860_LOGOT1 -ENUMX - BFD_RELOC_860_SPGOT1 -ENUMX - BFD_RELOC_860_LOGOTOFF0 -ENUMX - BFD_RELOC_860_SPGOTOFF0 -ENUMX - BFD_RELOC_860_LOGOTOFF1 -ENUMX - BFD_RELOC_860_SPGOTOFF1 -ENUMX - BFD_RELOC_860_LOGOTOFF2 -ENUMX - BFD_RELOC_860_LOGOTOFF3 -ENUMX - BFD_RELOC_860_LOPC -ENUMX - BFD_RELOC_860_HIGHADJ -ENUMX - BFD_RELOC_860_HAGOT -ENUMX - BFD_RELOC_860_HAGOTOFF -ENUMX - BFD_RELOC_860_HAPC -ENUMX - BFD_RELOC_860_HIGH -ENUMX - BFD_RELOC_860_HIGOT -ENUMX - BFD_RELOC_860_HIGOTOFF -ENUMDOC - Intel i860 Relocations. - -ENUM BFD_RELOC_OR1K_REL_26 ENUMX BFD_RELOC_OR1K_GOTPC_HI16 diff --git a/bfd/targets.c b/bfd/targets.c index 43102d4..34169c5 100644 --- a/bfd/targets.c +++ b/bfd/targets.c @@ -601,7 +601,6 @@ extern const bfd_target am33_elf32_linux_vec; extern const bfd_target aout0_be_vec; extern const bfd_target aout64_vec; extern const bfd_target aout_vec; -extern const bfd_target aout_adobe_vec; extern const bfd_target arc_elf32_be_vec; extern const bfd_target arc_elf32_le_vec; extern const bfd_target arm_aout_be_vec; @@ -634,8 +633,6 @@ extern const bfd_target arm_pei_wince_le_vec; extern const bfd_target avr_elf32_vec; extern const bfd_target bfin_elf32_vec; extern const bfd_target bfin_elf32_fdpic_vec; -extern const bfd_target bout_be_vec; -extern const bfd_target bout_le_vec; extern const bfd_target cr16_elf32_vec; extern const bfd_target cr16c_elf32_vec; extern const bfd_target cris_aout_vec; @@ -688,10 +685,6 @@ extern const bfd_target i386_nlm32_vec; extern const bfd_target i386_pe_vec; extern const bfd_target i386_pei_vec; extern const bfd_target iamcu_elf32_vec; -extern const bfd_target i860_coff_vec; -extern const bfd_target i860_elf32_vec; -extern const bfd_target i860_elf32_le_vec; -extern const bfd_target i960_elf32_vec; extern const bfd_target ia64_elf32_be_vec; extern const bfd_target ia64_elf32_hpux_be_vec; extern const bfd_target ia64_elf64_be_vec; @@ -699,8 +692,6 @@ extern const bfd_target ia64_elf64_le_vec; extern const bfd_target ia64_elf64_hpux_be_vec; extern const bfd_target ia64_elf64_vms_vec; extern const bfd_target ia64_pei_vec; -extern const bfd_target icoff_be_vec; -extern const bfd_target icoff_le_vec; extern const bfd_target ieee_vec; extern const bfd_target ip2k_elf32_vec; extern const bfd_target iq2000_elf32_vec; @@ -1002,7 +993,6 @@ static const bfd_target * const _bfd_target_vector[] = which kind of a.out file it is. */ &aout_vec, #endif - &aout_adobe_vec, &arc_elf32_be_vec, &arc_elf32_le_vec, @@ -1044,9 +1034,6 @@ static const bfd_target * const _bfd_target_vector[] = &bfin_elf32_vec, &bfin_elf32_fdpic_vec, - &bout_be_vec, - &bout_le_vec, - &cr16_elf32_vec, &cr16c_elf32_vec, @@ -1130,12 +1117,6 @@ static const bfd_target * const _bfd_target_vector[] = &iamcu_elf32_vec, - &i860_coff_vec, - &i860_elf32_vec, - &i860_elf32_le_vec, - - &i960_elf32_vec, - #ifdef BFD64 #if 0 &ia64_elf32_be_vec, @@ -1148,9 +1129,6 @@ static const bfd_target * const _bfd_target_vector[] = &ia64_pei_vec, #endif - &icoff_be_vec, - &icoff_le_vec, - &ieee_vec, &ip2k_elf32_vec, |