diff options
author | Alan Modra <amodra@gmail.com> | 2018-04-16 15:31:36 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2018-04-16 15:31:36 +0930 |
commit | dc12032bca08554cf0a72d224e44f755f7789ff3 (patch) | |
tree | 4366214b6cac7beb93cab44b1eb44868623e66a2 /bfd/oasys.c | |
parent | 211dc24b8744ed14ee5c293e7ac164d02e1fa1fe (diff) | |
download | gdb-dc12032bca08554cf0a72d224e44f755f7789ff3.zip gdb-dc12032bca08554cf0a72d224e44f755f7789ff3.tar.gz gdb-dc12032bca08554cf0a72d224e44f755f7789ff3.tar.bz2 |
Remove m68k-aout and m68k-coff support
include/
* aout/host.h: Remove m68k-aout and m68k-coff support.
* aout/hp300hpux.h: Delete.
* coff/apollo.h: Delete.
* coff/aux-coff.h: Delete.
* coff/m68k.h: Delete.
bfd/
* Makefile.am: Remove m68k-aout and m68k-coff support.
* aoutf1.h: Likewise.
* aoutx.h: Likewise.
* archive.c: Likewise.
* bfd-in.h: Likewise.
* bfd.c: Likewise.
* coffcode.h: Likewise.
* coffswap.h: Likewise.
* config.bfd: Likewise.
* configure.ac: Likewise.
* configure.host: Likewise.
* doc/bfd.texinfo: Likewise.
* doc/bfdint.texi: Likewise.
* freebsd.h: Likewise.
* gen-aout.c: Likewise.
* hpux-core.c: Likewise.
* libaout.h: Likewise.
* libbfd-in.h: Likewise.
* pdp11.c: Likewise.
* peicode.h: Likewise.
* riscix.c: Likewise.
* targets.c: Likewise.
* aout0.c: Delete.
* coff-apollo.c: Delete.
* coff-aux.c: Delete.
* coff-m68k.c: Delete.
* coff-svm68k.c: Delete.
* coff-u68k.c: Delete.
* hosts/delta68.h: Delete.
* hosts/hp300bsd.h: Delete.
* hosts/m68kaux.h: Delete.
* hosts/news.h: Delete.
* hp300bsd.c: Delete.
* hp300hpux.c: Delete.
* liboasys.h: Delete.
* m68k4knetbsd.c: Delete.
* m68klinux.c: Delete.
* m68knetbsd.c: Delete.
* oasys.c: Delete.
* versados.c: Delete.
* Makefile.in: Regenerate.
* bfd-in2.h: Regenerate.
* configure: Regenerate.
* libbfd.h: Regenerate.
* po/SRC-POTFILES.in: Regenerate.
binutils/
* testsuite/binutils-all/copy-2.d: Remove m68k-aout and m68k-coff
support.
* testsuite/binutils-all/copy-3.d: Likewise.
* testsuite/binutils-all/objcopy.exp: Likewise.
* testsuite/lib/binutils-common.exp: Likewise.
gas/
* Makefile.am: Remove m68k-aout and m68k-coff support.
* config/tc-m68k.c: Likewise.
* config/tc-m68k.h: Likewise.
* configure.ac: Likewise.
* configure.tgt: Likewise.
* testsuite/gas/all/weakref1u.d: Likewise.
* testsuite/gas/m68k/all.exp: Likewise.
* testsuite/gas/m68k/br-isaa.d: Likewise.
* testsuite/gas/m68k/br-isab.d: Likewise.
* testsuite/gas/m68k/br-isac.d: Likewise.
* config/te-psos.h: Delete.
* config/te-sun3.h: Delete.
* testsuite/gas/m68k-coff/gas.exp: Delete.
* testsuite/gas/m68k-coff/p2389.s: Delete.
* testsuite/gas/m68k-coff/p2389a.s: Delete.
* testsuite/gas/m68k-coff/p2430.s: Delete.
* testsuite/gas/m68k-coff/p2430a.s: Delete.
* testsuite/gas/m68k-coff/t1.s: Delete.
* testsuite/gas/m68k/p3041.d: Delete.
* testsuite/gas/m68k/p3041.s: Delete.
* testsuite/gas/m68k/p3041data.d: Delete.
* testsuite/gas/m68k/p3041data.s: Delete.
* testsuite/gas/m68k/p3041pcrel.d: Delete.
* testsuite/gas/m68k/p3041pcrel.s: Delete.
* testsuite/gas/m68k/t2.d: Delete.
* Makefile.in: Regenerate.
* config.in: Regenerate.
* configure: Regenerate.
* po/POTFILES.in: Regenerate.
ld/
* Makefile.am: Remove m68k-aout and m68k-coff support.
* configure.tgt: Likewise.
* emultempl/m68kelf.em: Likewise.
* ld.texinfo: Likewise.
* mri.c: Likewise.
* emulparams/delta68.sh: Delete.
* emulparams/hp300bsd.sh: Delete.
* emulparams/hp3hpux.sh: Delete.
* emulparams/m68k4knbsd.sh: Delete.
* emulparams/m68kaout.sh: Delete.
* emulparams/m68kaux.sh: Delete.
* emulparams/m68kcoff.sh: Delete.
* emulparams/m68klinux.sh: Delete.
* emulparams/m68knbsd.sh: Delete.
* emulparams/m68kpsos.sh: Delete.
* emulparams/sun3.sh: Delete.
* emultempl/m68kcoff.em: Delete.
* scripttempl/delta68.sc: Delete.
* scripttempl/m68kaux.sc: Delete.
* scripttempl/m68kcoff.sc: Delete.
* scripttempl/psos.sc: Delete.
* testsuite/ld-versados/t1-1.ro: Delete.
* testsuite/ld-versados/t1-2.ro: Delete.
* testsuite/ld-versados/t1.ld: Delete.
* testsuite/ld-versados/t1.ook: Delete.
* testsuite/ld-versados/t2-1.ro: Delete.
* testsuite/ld-versados/t2-2.ro: Delete.
* testsuite/ld-versados/t2-3.ro: Delete.
* testsuite/ld-versados/t2.ld: Delete.
* testsuite/ld-versados/t2.ook: Delete.
* testsuite/ld-versados/versados.exp: Delete.
* Makefile.in: Regenerate.
* po/BLD-POTFILES.in: Regenerate.
Diffstat (limited to 'bfd/oasys.c')
-rw-r--r-- | bfd/oasys.c | 1254 |
1 files changed, 0 insertions, 1254 deletions
diff --git a/bfd/oasys.c b/bfd/oasys.c deleted file mode 100644 index d76e712..0000000 --- a/bfd/oasys.c +++ /dev/null @@ -1,1254 +0,0 @@ -/* BFD back-end for oasys objects. - Copyright (C) 1990-2018 Free Software Foundation, Inc. - Written by Steve Chamberlain of Cygnus Support, <sac@cygnus.com>. - - This file is part of BFD, the Binary File Descriptor library. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, - MA 02110-1301, USA. */ - -#define UNDERSCORE_HACK 1 -#include "sysdep.h" -#include "bfd.h" -#include "safe-ctype.h" -#include "libbfd.h" -#include "oasys.h" -#include "liboasys.h" -#include "libiberty.h" - -/* Read in all the section data and relocation stuff too. */ - -static bfd_boolean -oasys_read_record (bfd *abfd, oasys_record_union_type *record) -{ - bfd_size_type amt = sizeof (record->header); - - if (bfd_bread ((void *) record, amt, abfd) != amt) - return FALSE; - - amt = record->header.length - sizeof (record->header); - if ((long) amt <= 0) - return TRUE; - if (bfd_bread ((void *) ((char *) record + sizeof (record->header)), amt, abfd) - != amt) - return FALSE; - return TRUE; -} - -static size_t -oasys_string_length (oasys_record_union_type *record) -{ - return record->header.length - - ((char *) record->symbol.name - (char *) record); -} - -/* Slurp the symbol table by reading in all the records at the start file - till we get to the first section record. - - We'll sort the symbolss into two lists, defined and undefined. The - undefined symbols will be placed into the table according to their - refno. - - We do this by placing all undefined symbols at the front of the table - moving in, and the defined symbols at the end of the table moving back. */ - -static bfd_boolean -oasys_slurp_symbol_table (bfd *const abfd) -{ - oasys_record_union_type record; - oasys_data_type *data = OASYS_DATA (abfd); - bfd_boolean loop = TRUE; - asymbol *dest_defined; - asymbol *dest; - char *string_ptr; - bfd_size_type amt; - - if (data->symbols != NULL) - return TRUE; - - /* Buy enough memory for all the symbols and all the names. */ - amt = abfd->symcount; - amt *= sizeof (asymbol); - data->symbols = bfd_alloc (abfd, amt); - - amt = data->symbol_string_length; -#ifdef UNDERSCORE_HACK - /* Buy 1 more char for each symbol to keep the underscore in. */ - amt += abfd->symcount; -#endif - data->strings = bfd_alloc (abfd, amt); - - if (!data->symbols || !data->strings) - return FALSE; - - dest_defined = data->symbols + abfd->symcount - 1; - - string_ptr = data->strings; - if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0) - return FALSE; - while (loop) - { - if (! oasys_read_record (abfd, &record)) - return FALSE; - - switch (record.header.type) - { - case oasys_record_is_header_enum: - break; - case oasys_record_is_local_enum: - case oasys_record_is_symbol_enum: - { - int flag = record.header.type == (int) oasys_record_is_local_enum ? - (BSF_LOCAL) : (BSF_GLOBAL | BSF_EXPORT); - - size_t length = oasys_string_length (&record); - switch (record.symbol.relb & RELOCATION_TYPE_BITS) - { - case RELOCATION_TYPE_ABS: - dest = dest_defined--; - dest->section = bfd_abs_section_ptr; - dest->flags = 0; - - break; - case RELOCATION_TYPE_REL: - dest = dest_defined--; - dest->section = - OASYS_DATA (abfd)->sections[record.symbol.relb & - RELOCATION_SECT_BITS]; - if (record.header.type == (int) oasys_record_is_local_enum) - { - dest->flags = BSF_LOCAL; - if (dest->section == (asection *) (~0)) - { - /* It seems that sometimes internal symbols are tied up, but - still get output, even though there is no - section */ - dest->section = 0; - } - } - else - dest->flags = flag; - break; - case RELOCATION_TYPE_UND: - dest = data->symbols + H_GET_16 (abfd, record.symbol.refno); - dest->section = bfd_und_section_ptr; - break; - case RELOCATION_TYPE_COM: - dest = dest_defined--; - dest->name = string_ptr; - dest->the_bfd = abfd; - dest->section = bfd_com_section_ptr; - break; - default: - dest = dest_defined--; - BFD_ASSERT (FALSE); - break; - } - dest->name = string_ptr; - dest->the_bfd = abfd; - dest->udata.p = NULL; - dest->value = H_GET_32 (abfd, record.symbol.value); - -#ifdef UNDERSCORE_HACK - if (record.symbol.name[0] != '_') - { - string_ptr[0] = '_'; - string_ptr++; - } -#endif - memcpy (string_ptr, record.symbol.name, length); - - string_ptr[length] = 0; - string_ptr += length + 1; - } - break; - default: - loop = FALSE; - } - } - return TRUE; -} - -static long -oasys_get_symtab_upper_bound (bfd *const abfd) -{ - if (! oasys_slurp_symbol_table (abfd)) - return -1; - - return (abfd->symcount + 1) * (sizeof (oasys_symbol_type *)); -} - -extern const bfd_target oasys_vec; - -static long -oasys_canonicalize_symtab (bfd *abfd, asymbol **location) -{ - asymbol *symbase; - unsigned int counter; - - if (! oasys_slurp_symbol_table (abfd)) - return -1; - - symbase = OASYS_DATA (abfd)->symbols; - for (counter = 0; counter < abfd->symcount; counter++) - *(location++) = symbase++; - - *location = 0; - return abfd->symcount; -} - -/* Archive stuff. */ - -static const bfd_target * -oasys_archive_p (bfd *abfd) -{ - oasys_archive_header_type header; - oasys_extarchive_header_type header_ext; - unsigned int i; - file_ptr filepos; - bfd_size_type amt; - - amt = sizeof (header_ext); - if (bfd_seek (abfd, (file_ptr) 0, 0) != 0 - || bfd_bread ((void *) &header_ext, amt, abfd) != amt) - { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - - header.version = H_GET_32 (abfd, header_ext.version); - header.mod_count = H_GET_32 (abfd, header_ext.mod_count); - header.mod_tbl_offset = H_GET_32 (abfd, header_ext.mod_tbl_offset); - header.sym_tbl_size = H_GET_32 (abfd, header_ext.sym_tbl_size); - header.sym_count = H_GET_32 (abfd, header_ext.sym_count); - header.sym_tbl_offset = H_GET_32 (abfd, header_ext.sym_tbl_offset); - header.xref_count = H_GET_32 (abfd, header_ext.xref_count); - header.xref_lst_offset = H_GET_32 (abfd, header_ext.xref_lst_offset); - - /* There isn't a magic number in an Oasys archive, so the best we - can do to verify reasonableness is to make sure that the values in - the header are too weird. */ - - if (header.version > 10000 - || header.mod_count > 10000 - || header.sym_count > 100000 - || header.xref_count > 100000) - return NULL; - - /* That all worked, let's buy the space for the header and read in - the headers. */ - { - oasys_ar_data_type *ar; - oasys_module_info_type *module; - oasys_module_table_type record; - - amt = sizeof (oasys_ar_data_type); - ar = bfd_alloc (abfd, amt); - - amt = header.mod_count; - amt *= sizeof (oasys_module_info_type); - module = bfd_alloc (abfd, amt); - - if (!ar || !module) - return NULL; - - abfd->tdata.oasys_ar_data = ar; - ar->module = module; - ar->module_count = header.mod_count; - - filepos = header.mod_tbl_offset; - for (i = 0; i < header.mod_count; i++) - { - oasys_extmodule_table_type_b_type record_ext; - - if (bfd_seek (abfd, filepos, SEEK_SET) != 0) - return NULL; - - /* There are two ways of specifying the archive header. */ - amt = sizeof (record_ext); - if (bfd_bread ((void *) &record_ext, amt, abfd) != amt) - return NULL; - - record.mod_size = H_GET_32 (abfd, record_ext.mod_size); - record.file_offset = H_GET_32 (abfd, record_ext.file_offset); - - record.dep_count = H_GET_32 (abfd, record_ext.dep_count); - record.depee_count = H_GET_32 (abfd, record_ext.depee_count); - record.sect_count = H_GET_32 (abfd, record_ext.sect_count); - record.module_name_size = H_GET_32 (abfd, - record_ext.mod_name_length); - - amt = record.module_name_size; - module[i].name = bfd_alloc (abfd, amt + 1); - if (!module[i].name) - return NULL; - if (bfd_bread ((void *) module[i].name, amt, abfd) != amt) - return NULL; - module[i].name[record.module_name_size] = 0; - filepos += (sizeof (record_ext) - + record.dep_count * 4 - + record.module_name_size + 1); - - module[i].size = record.mod_size; - module[i].pos = record.file_offset; - module[i].abfd = 0; - } - } - return abfd->xvec; -} - -static bfd_boolean -oasys_mkobject (bfd *abfd) -{ - bfd_size_type amt = sizeof (oasys_data_type); - - abfd->tdata.oasys_obj_data = bfd_alloc (abfd, amt); - - return abfd->tdata.oasys_obj_data != NULL; -} - -/* The howto table is build using the top two bits of a reloc byte to - index into it. The bits are PCREL,WORD/LONG. */ - -static reloc_howto_type howto_table[] = -{ - - HOWTO (0, 0, 1, 16, FALSE, 0, complain_overflow_bitfield, 0, "abs16", TRUE, 0x0000ffff, 0x0000ffff, FALSE), - HOWTO (0, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, 0, "abs32", TRUE, 0xffffffff, 0xffffffff, FALSE), - HOWTO (0, 0, 1, 16, TRUE, 0, complain_overflow_signed, 0, "pcrel16", TRUE, 0x0000ffff, 0x0000ffff, FALSE), - HOWTO (0, 0, 2, 32, TRUE, 0, complain_overflow_signed, 0, "pcrel32", TRUE, 0xffffffff, 0xffffffff, FALSE) -}; - -/* Read in all the section data and relocation stuff too. */ - -static bfd_boolean -oasys_slurp_section_data (bfd *const abfd) -{ - oasys_record_union_type record; - oasys_data_type *data = OASYS_DATA (abfd); - bfd_boolean loop = TRUE; - oasys_per_section_type *per; - asection *s; - bfd_size_type amt; - - /* See if the data has been slurped already. */ - for (s = abfd->sections; s != NULL; s = s->next) - { - per = oasys_per_section (s); - if (per->initialized) - return TRUE; - } - - if (data->first_data_record == 0) - return TRUE; - - if (bfd_seek (abfd, data->first_data_record, SEEK_SET) != 0) - return FALSE; - - while (loop) - { - if (! oasys_read_record (abfd, &record)) - return FALSE; - - switch (record.header.type) - { - case oasys_record_is_header_enum: - break; - case oasys_record_is_data_enum: - { - bfd_byte *src = record.data.data; - bfd_byte *end_src = ((bfd_byte *) & record) + record.header.length; - bfd_byte *dst_ptr; - bfd_byte *dst_base_ptr; - unsigned int relbit; - unsigned int count; - asection *section = - data->sections[record.data.relb & RELOCATION_SECT_BITS]; - bfd_vma dst_offset; - - per = oasys_per_section (section); - - if (! per->initialized) - { - arelent **relpp; - - per->data = bfd_zalloc (abfd, section->size); - if (!per->data) - return FALSE; - relpp = §ion->relocation; - per->reloc_tail_ptr = (oasys_reloc_type **) relpp; - per->had_vma = FALSE; - per->initialized = TRUE; - section->reloc_count = 0; - section->flags = SEC_ALLOC; - } - - dst_offset = H_GET_32 (abfd, record.data.addr); - if (! per->had_vma) - { - /* Take the first vma we see as the base. */ - section->vma = dst_offset; - per->had_vma = TRUE; - } - - dst_offset -= section->vma; - - dst_base_ptr = oasys_per_section (section)->data; - dst_ptr = oasys_per_section (section)->data + - dst_offset; - - if (src < end_src) - section->flags |= SEC_LOAD | SEC_HAS_CONTENTS; - - while (src < end_src) - { - unsigned char mod_byte = *src++; - size_t gap = end_src - src; - - count = 8; - if (mod_byte == 0 && gap >= 8) - { - dst_ptr[0] = src[0]; - dst_ptr[1] = src[1]; - dst_ptr[2] = src[2]; - dst_ptr[3] = src[3]; - dst_ptr[4] = src[4]; - dst_ptr[5] = src[5]; - dst_ptr[6] = src[6]; - dst_ptr[7] = src[7]; - dst_ptr += 8; - src += 8; - } - else - { - for (relbit = 1; count-- != 0 && src < end_src; relbit <<= 1) - { - if (relbit & mod_byte) - { - unsigned char reloc = *src; - /* This item needs to be relocated. */ - switch (reloc & RELOCATION_TYPE_BITS) - { - case RELOCATION_TYPE_ABS: - break; - - case RELOCATION_TYPE_REL: - { - /* Relocate the item relative to the section. */ - oasys_reloc_type *r; - - amt = sizeof (oasys_reloc_type); - r = bfd_alloc (abfd, amt); - if (!r) - return FALSE; - *(per->reloc_tail_ptr) = r; - per->reloc_tail_ptr = &r->next; - r->next = NULL; - /* Reference to undefined symbol. */ - src++; - /* There is no symbol. */ - r->symbol = 0; - /* Work out the howto. */ - abort (); - r->relent.address = dst_ptr - dst_base_ptr; - r->relent.howto = &howto_table[reloc >> 6]; - r->relent.sym_ptr_ptr = NULL; - section->reloc_count++; - - /* Fake up the data to look like - it's got the -ve pc in it, this - makes it much easier to convert - into other formats. This is done - by hitting the addend. */ - if (r->relent.howto->pc_relative) - r->relent.addend -= dst_ptr - dst_base_ptr; - } - break; - - case RELOCATION_TYPE_UND: - { - oasys_reloc_type *r; - - amt = sizeof (oasys_reloc_type); - r = bfd_alloc (abfd, amt); - if (!r) - return FALSE; - *(per->reloc_tail_ptr) = r; - per->reloc_tail_ptr = &r->next; - r->next = NULL; - /* Reference to undefined symbol. */ - src++; - /* Get symbol number. */ - r->symbol = (src[0] << 8) | src[1]; - /* Work out the howto. */ - abort (); - - r->relent.addend = 0; - r->relent.address = dst_ptr - dst_base_ptr; - r->relent.howto = &howto_table[reloc >> 6]; - r->relent.sym_ptr_ptr = NULL; - section->reloc_count++; - - src += 2; - /* Fake up the data to look like - it's got the -ve pc in it, this - makes it much easier to convert - into other formats. This is done - by hitting the addend. */ - if (r->relent.howto->pc_relative) - r->relent.addend -= dst_ptr - dst_base_ptr; - } - break; - case RELOCATION_TYPE_COM: - BFD_FAIL (); - } - } - *dst_ptr++ = *src++; - } - } - } - } - break; - case oasys_record_is_local_enum: - case oasys_record_is_symbol_enum: - case oasys_record_is_section_enum: - break; - default: - loop = FALSE; - } - } - - return TRUE; - -} - -#define MAX_SECS 16 - -static const bfd_target * -oasys_object_p (bfd *abfd) -{ - oasys_data_type *oasys; - oasys_data_type *save = OASYS_DATA (abfd); - bfd_boolean loop = TRUE; - bfd_boolean had_usefull = FALSE; - - abfd->tdata.oasys_obj_data = 0; - oasys_mkobject (abfd); - oasys = OASYS_DATA (abfd); - memset ((void *) oasys->sections, 0xff, sizeof (oasys->sections)); - - /* Point to the start of the file. */ - if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0) - goto fail; - oasys->symbol_string_length = 0; - - /* Inspect the records, but only keep the section info - - remember the size of the symbols. */ - oasys->first_data_record = 0; - while (loop) - { - oasys_record_union_type record; - if (! oasys_read_record (abfd, &record)) - goto fail; - if ((size_t) record.header.length < (size_t) sizeof (record.header)) - goto fail; - - switch ((oasys_record_enum_type) (record.header.type)) - { - case oasys_record_is_header_enum: - had_usefull = TRUE; - break; - case oasys_record_is_symbol_enum: - case oasys_record_is_local_enum: - /* Count symbols and remember their size for a future malloc. */ - abfd->symcount++; - oasys->symbol_string_length += 1 + oasys_string_length (&record); - had_usefull = TRUE; - break; - case oasys_record_is_section_enum: - { - asection *s; - char *buffer; - unsigned int section_number; - - if (record.section.header.length != sizeof (record.section)) - goto fail; - - buffer = bfd_alloc (abfd, (bfd_size_type) 3); - if (!buffer) - goto fail; - section_number = record.section.relb & RELOCATION_SECT_BITS; - sprintf (buffer, "%u", section_number); - s = bfd_make_section (abfd, buffer); - oasys->sections[section_number] = s; - switch (record.section.relb & RELOCATION_TYPE_BITS) - { - case RELOCATION_TYPE_ABS: - case RELOCATION_TYPE_REL: - break; - case RELOCATION_TYPE_UND: - case RELOCATION_TYPE_COM: - BFD_FAIL (); - } - - s->size = H_GET_32 (abfd, record.section.value); - s->vma = H_GET_32 (abfd, record.section.vma); - s->flags = 0; - had_usefull = TRUE; - } - break; - case oasys_record_is_data_enum: - oasys->first_data_record = bfd_tell (abfd) - record.header.length; - /* Fall through. */ - case oasys_record_is_debug_enum: - case oasys_record_is_module_enum: - case oasys_record_is_named_section_enum: - case oasys_record_is_end_enum: - if (! had_usefull) - goto fail; - loop = FALSE; - break; - default: - goto fail; - } - } - oasys->symbols = NULL; - - /* Oasys support several architectures, but I can't see a simple way - to discover which one is in a particular file - we'll guess. */ - bfd_default_set_arch_mach (abfd, bfd_arch_m68k, 0); - if (abfd->symcount != 0) - abfd->flags |= HAS_SYMS; - - /* We don't know if a section has data until we've read it. */ - oasys_slurp_section_data (abfd); - - return abfd->xvec; - -fail: - (void) bfd_release (abfd, oasys); - abfd->tdata.oasys_obj_data = save; - return NULL; -} - - -static void -oasys_get_symbol_info (bfd *ignore_abfd ATTRIBUTE_UNUSED, - asymbol *symbol, - symbol_info *ret) -{ - bfd_symbol_info (symbol, ret); - - if (!symbol->section) - ret->type = (symbol->flags & BSF_LOCAL) ? 'a' : 'A'; -} - -static void -oasys_print_symbol (bfd *abfd, void * afile, asymbol *symbol, bfd_print_symbol_type how) -{ - FILE *file = (FILE *) afile; - - switch (how) - { - case bfd_print_symbol_name: - case bfd_print_symbol_more: - fprintf (file, "%s", symbol->name); - break; - case bfd_print_symbol_all: - { - const char *section_name = symbol->section == NULL ? - (const char *) "*abs" : symbol->section->name; - - bfd_print_symbol_vandf (abfd, (void *) file, symbol); - - fprintf (file, " %-5s %s", - section_name, - symbol->name); - } - break; - } -} - -static bfd_boolean -oasys_new_section_hook (bfd *abfd, asection *newsect) -{ - if (!newsect->used_by_bfd) - { - newsect->used_by_bfd - = bfd_alloc (abfd, (bfd_size_type) sizeof (oasys_per_section_type)); - if (!newsect->used_by_bfd) - return FALSE; - } - oasys_per_section (newsect)->data = NULL; - oasys_per_section (newsect)->section = newsect; - oasys_per_section (newsect)->offset = 0; - oasys_per_section (newsect)->initialized = FALSE; - newsect->alignment_power = 1; - - /* Turn the section string into an index. */ - sscanf (newsect->name, "%u", &newsect->target_index); - - return _bfd_generic_new_section_hook (abfd, newsect); -} - - -static long -oasys_get_reloc_upper_bound (bfd *abfd, sec_ptr asect) -{ - if (! oasys_slurp_section_data (abfd)) - return -1; - return (asect->reloc_count + 1) * sizeof (arelent *); -} - -static bfd_boolean -oasys_get_section_contents (bfd *abfd, - sec_ptr section, - void * location, - file_ptr offset, - bfd_size_type count) -{ - oasys_per_section_type *p = oasys_per_section (section); - - oasys_slurp_section_data (abfd); - - if (! p->initialized) - (void) memset (location, 0, (size_t) count); - else - (void) memcpy (location, (void *) (p->data + offset), (size_t) count); - - return TRUE; -} - -static long -oasys_canonicalize_reloc (bfd *ignore_abfd ATTRIBUTE_UNUSED, - sec_ptr section, - arelent **relptr, - asymbol **symbols ATTRIBUTE_UNUSED) -{ - unsigned int reloc_count = 0; - oasys_reloc_type *src = (oasys_reloc_type *) (section->relocation); - - if (src != NULL) - abort (); - - *relptr = NULL; - return section->reloc_count = reloc_count; -} - - -/* Writing. */ - -/* Calculate the checksum and write one record. */ - -static bfd_boolean -oasys_write_record (bfd *abfd, - oasys_record_enum_type type, - oasys_record_union_type *record, - size_t size) -{ - int checksum; - size_t i; - unsigned char *ptr; - - record->header.length = size; - record->header.type = (int) type; - record->header.check_sum = 0; - record->header.fill = 0; - ptr = (unsigned char *) &record->pad[0]; - checksum = 0; - for (i = 0; i < size; i++) - checksum += *ptr++; - record->header.check_sum = 0xff & (-checksum); - if (bfd_bwrite ((void *) record, (bfd_size_type) size, abfd) != size) - return FALSE; - return TRUE; -} - - -/* Write out all the symbols. */ - -static bfd_boolean -oasys_write_syms (bfd *abfd) -{ - unsigned int count; - asymbol **generic = bfd_get_outsymbols (abfd); - unsigned int sym_index = 0; - - for (count = 0; count < bfd_get_symcount (abfd); count++) - { - oasys_symbol_record_type symbol; - asymbol *const g = generic[count]; - const char *src = g->name; - char *dst = symbol.name; - unsigned int l = 0; - - if (bfd_is_com_section (g->section)) - { - symbol.relb = RELOCATION_TYPE_COM; - H_PUT_16 (abfd, sym_index, symbol.refno); - sym_index++; - } - else if (bfd_is_abs_section (g->section)) - { - symbol.relb = RELOCATION_TYPE_ABS; - H_PUT_16 (abfd, 0, symbol.refno); - } - else if (bfd_is_und_section (g->section)) - { - symbol.relb = RELOCATION_TYPE_UND; - H_PUT_16 (abfd, sym_index, symbol.refno); - /* Overload the value field with the output sym_index number */ - sym_index++; - } - else if (g->flags & BSF_DEBUGGING) - /* Throw it away. */ - continue; - else - { - if (g->section == NULL) - /* Sometime, the oasys tools give out a symbol with illegal - bits in it, we'll output it in the same broken way. */ - symbol.relb = RELOCATION_TYPE_REL | 0; - else - symbol.relb = RELOCATION_TYPE_REL | g->section->output_section->target_index; - - H_PUT_16 (abfd, 0, symbol.refno); - } - -#ifdef UNDERSCORE_HACK - if (src[l] == '_') - dst[l++] = '.'; -#endif - while (src[l]) - { - dst[l] = src[l]; - l++; - } - - H_PUT_32 (abfd, g->value, symbol.value); - - if (g->flags & BSF_LOCAL) - { - if (! oasys_write_record (abfd, - oasys_record_is_local_enum, - (oasys_record_union_type *) & symbol, - offsetof (oasys_symbol_record_type, - name[0]) + l)) - return FALSE; - } - else - { - if (! oasys_write_record (abfd, - oasys_record_is_symbol_enum, - (oasys_record_union_type *) & symbol, - offsetof (oasys_symbol_record_type, - name[0]) + l)) - return FALSE; - } - g->value = sym_index - 1; - } - - return TRUE; -} - -/* Write a section header for each section. */ - -static bfd_boolean -oasys_write_sections (bfd *abfd) -{ - asection *s; - static oasys_section_record_type out; - - for (s = abfd->sections; s != NULL; s = s->next) - { - if (!ISDIGIT (s->name[0])) - { - _bfd_error_handler - /* xgettext:c-format */ - (_("%pB: can not represent section `%pA' in oasys"), abfd, s); - bfd_set_error (bfd_error_nonrepresentable_section); - return FALSE; - } - out.relb = RELOCATION_TYPE_REL | s->target_index; - H_PUT_32 (abfd, s->size, out.value); - H_PUT_32 (abfd, s->vma, out.vma); - - if (! oasys_write_record (abfd, - oasys_record_is_section_enum, - (oasys_record_union_type *) & out, - sizeof (out))) - return FALSE; - } - return TRUE; -} - -static bfd_boolean -oasys_write_header (bfd *abfd) -{ - /* Create and write the header. */ - oasys_header_record_type r; - size_t length = strlen (abfd->filename); - - if (length > (size_t) sizeof (r.module_name)) - length = sizeof (r.module_name); - else if (length < (size_t) sizeof (r.module_name)) - (void) memset (r.module_name + length, ' ', - sizeof (r.module_name) - length); - - (void) memcpy (r.module_name, abfd->filename, length); - - r.version_number = OASYS_VERSION_NUMBER; - r.rev_number = OASYS_REV_NUMBER; - - return oasys_write_record (abfd, oasys_record_is_header_enum, - (oasys_record_union_type *) & r, - offsetof (oasys_header_record_type, - description[0])); -} - -static bfd_boolean -oasys_write_end (bfd *abfd) -{ - oasys_end_record_type end; - unsigned char null = 0; - - end.relb = RELOCATION_TYPE_ABS; - H_PUT_32 (abfd, abfd->start_address, end.entry); - H_PUT_16 (abfd, 0, end.fill); - end.zero = 0; - if (! oasys_write_record (abfd, - oasys_record_is_end_enum, - (oasys_record_union_type *) & end, - sizeof (end))) - return FALSE; - - return bfd_bwrite ((void *) &null, (bfd_size_type) 1, abfd) == 1; -} - -static int -comp (const void * ap, const void * bp) -{ - arelent *a = *((arelent **) ap); - arelent *b = *((arelent **) bp); - - return a->address - b->address; -} - -static bfd_boolean -oasys_write_data (bfd *abfd) -{ - asection *s; - - for (s = abfd->sections; s != NULL; s = s->next) - { - if (s->flags & SEC_LOAD) - { - bfd_byte *raw_data = oasys_per_section (s)->data; - oasys_data_record_type processed_data; - bfd_size_type current_byte_index = 0; - unsigned int relocs_to_go = s->reloc_count; - arelent **p = s->orelocation; - - if (s->reloc_count != 0) - /* Sort the reloc records so it's easy to insert the relocs into the - data. */ - qsort (s->orelocation, s->reloc_count, sizeof (arelent **), comp); - - current_byte_index = 0; - processed_data.relb = s->target_index | RELOCATION_TYPE_REL; - - while (current_byte_index < s->size) - { - /* Scan forwards by eight bytes or however much is left and see if - there are any relocations going on. */ - bfd_byte *mod = &processed_data.data[0]; - bfd_byte *dst = &processed_data.data[1]; - - unsigned int i = 0; - *mod = 0; - - H_PUT_32 (abfd, s->vma + current_byte_index, - processed_data.addr); - - /* Don't start a relocation unless you're sure you can finish it - within the same data record. The worst case relocation is a - 4-byte relocatable value which is split across two modification - bytes (1 relocation byte + 2 symbol reference bytes + 2 data + - 1 modification byte + 2 data = 8 bytes total). That's where - the magic number 8 comes from. */ - while (current_byte_index < s->size && dst <= - & processed_data.data[sizeof (processed_data.data) - 8]) - { - if (relocs_to_go != 0) - { - arelent *r = *p; - - /* There is a relocation, is it for this byte ? */ - if (r->address == current_byte_index) - abort (); - } - - /* If this is coming from an unloadable section then copy - zeros. */ - if (raw_data == NULL) - *dst++ = 0; - else - *dst++ = *raw_data++; - - if (++i >= 8) - { - i = 0; - mod = dst++; - *mod = 0; - } - current_byte_index++; - } - - /* Don't write a useless null modification byte. */ - if (dst == mod + 1) - --dst; - - if (! (oasys_write_record - (abfd, oasys_record_is_data_enum, - ((oasys_record_union_type *) &processed_data), - (size_t) (dst - (bfd_byte *) &processed_data)))) - return FALSE; - } - } - } - - return TRUE; -} - -static bfd_boolean -oasys_write_object_contents (bfd *abfd) -{ - if (! oasys_write_header (abfd)) - return FALSE; - if (! oasys_write_syms (abfd)) - return FALSE; - if (! oasys_write_sections (abfd)) - return FALSE; - if (! oasys_write_data (abfd)) - return FALSE; - if (! oasys_write_end (abfd)) - return FALSE; - return TRUE; -} - -/* Set section contents is complicated with OASYS since the format is - not a byte image, but a record stream. */ - -static bfd_boolean -oasys_set_section_contents (bfd *abfd, - sec_ptr section, - const void * location, - file_ptr offset, - bfd_size_type count) -{ - if (count != 0) - { - if (oasys_per_section (section)->data == NULL) - { - oasys_per_section (section)->data = bfd_alloc (abfd, section->size); - if (!oasys_per_section (section)->data) - return FALSE; - } - (void) memcpy ((void *) (oasys_per_section (section)->data + offset), - location, (size_t) count); - } - return TRUE; -} - - - -/* Native-level interface to symbols. */ - -/* We read the symbols into a buffer, which is discarded when this - function exits. We read the strings into a buffer large enough to - hold them all plus all the cached symbol entries. */ - -static asymbol * -oasys_make_empty_symbol (bfd *abfd) -{ - bfd_size_type amt = sizeof (oasys_symbol_type); - oasys_symbol_type *new_symbol_type = bfd_zalloc (abfd, amt); - - if (!new_symbol_type) - return NULL; - new_symbol_type->symbol.the_bfd = abfd; - return &new_symbol_type->symbol; -} - -/* User should have checked the file flags; perhaps we should return - BFD_NO_MORE_SYMBOLS if there are none? */ - -static bfd * -oasys_openr_next_archived_file (bfd *arch, bfd *prev) -{ - oasys_ar_data_type *ar = OASYS_AR_DATA (arch); - oasys_module_info_type *p; - - /* Take the next one from the arch state, or reset. */ - if (prev == NULL) - /* Reset the index - the first two entries are bogus. */ - ar->module_index = 0; - - p = ar->module + ar->module_index; - ar->module_index++; - - if (ar->module_index <= ar->module_count) - { - if (p->abfd == NULL) - { - p->abfd = _bfd_create_empty_archive_element_shell (arch); - p->abfd->origin = p->pos; - p->abfd->filename = xstrdup (p->name); - - /* Fixup a pointer to this element for the member. */ - p->abfd->arelt_data = (void *) p; - } - return p->abfd; - } - - bfd_set_error (bfd_error_no_more_archived_files); - return NULL; -} - -#define oasys_find_nearest_line _bfd_nosymbols_find_nearest_line -#define oasys_find_line _bfd_nosymbols_find_line -#define oasys_find_inliner_info _bfd_nosymbols_find_inliner_info - -static int -oasys_generic_stat_arch_elt (bfd *abfd, struct stat *buf) -{ - oasys_module_info_type *mod = (oasys_module_info_type *) abfd->arelt_data; - - if (mod == NULL) - { - bfd_set_error (bfd_error_invalid_operation); - return -1; - } - - buf->st_size = mod->size; - buf->st_mode = 0666; - return 0; -} - -static int -oasys_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED, - struct bfd_link_info *info ATTRIBUTE_UNUSED) -{ - return 0; -} - -#define oasys_close_and_cleanup _bfd_generic_close_and_cleanup -#define oasys_bfd_free_cached_info _bfd_generic_bfd_free_cached_info -#define oasys_slurp_armap _bfd_bool_bfd_true -#define oasys_slurp_extended_name_table _bfd_bool_bfd_true -#define oasys_construct_extended_name_table \ - _bfd_noarchive_construct_extended_name_table -#define oasys_truncate_arname bfd_dont_truncate_arname -#define oasys_write_armap _bfd_noarchive_write_armap -#define oasys_read_ar_hdr _bfd_ptr_bfd_null_error -#define oasys_write_ar_hdr _bfd_noarchive_write_ar_hdr -#define oasys_get_elt_at_index _bfd_generic_get_elt_at_index -#define oasys_update_armap_timestamp _bfd_bool_bfd_true -#define oasys_bfd_is_local_label_name bfd_generic_is_local_label_name -#define oasys_bfd_is_target_special_symbol _bfd_bool_bfd_asymbol_false -#define oasys_get_lineno _bfd_nosymbols_get_lineno -#define oasys_get_symbol_version_string _bfd_nosymbols_get_symbol_version_string -#define oasys_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol -#define oasys_read_minisymbols _bfd_generic_read_minisymbols -#define oasys_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol -#define oasys_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup -#define oasys_bfd_reloc_name_lookup _bfd_norelocs_bfd_reloc_name_lookup -#define oasys_set_arch_mach bfd_default_set_arch_mach -#define oasys_get_section_contents_in_window _bfd_generic_get_section_contents_in_window -#define oasys_bfd_get_relocated_section_contents bfd_generic_get_relocated_section_contents -#define oasys_bfd_relax_section bfd_generic_relax_section -#define oasys_bfd_gc_sections bfd_generic_gc_sections -#define oasys_bfd_lookup_section_flags bfd_generic_lookup_section_flags -#define oasys_bfd_merge_sections bfd_generic_merge_sections -#define oasys_bfd_is_group_section bfd_generic_is_group_section -#define oasys_bfd_discard_group bfd_generic_discard_group -#define oasys_section_already_linked _bfd_generic_section_already_linked -#define oasys_bfd_define_common_symbol bfd_generic_define_common_symbol -#define oasys_bfd_define_start_stop bfd_generic_define_start_stop -#define oasys_bfd_link_hash_table_create _bfd_generic_link_hash_table_create -#define oasys_bfd_link_add_symbols _bfd_generic_link_add_symbols -#define oasys_bfd_link_just_syms _bfd_generic_link_just_syms -#define oasys_bfd_copy_link_hash_symbol_type \ - _bfd_generic_copy_link_hash_symbol_type -#define oasys_bfd_final_link _bfd_generic_final_link -#define oasys_bfd_link_split_section _bfd_generic_link_split_section -#define oasys_bfd_link_check_relocs _bfd_generic_link_check_relocs -#define oasys_set_reloc _bfd_generic_set_reloc - -const bfd_target oasys_vec = -{ - "oasys", /* Name. */ - bfd_target_oasys_flavour, - BFD_ENDIAN_BIG, /* Target byte order. */ - BFD_ENDIAN_BIG, /* Target headers byte order. */ - (HAS_RELOC | EXEC_P | /* Object flags. */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - (SEC_CODE | SEC_DATA | SEC_ROM | SEC_HAS_CONTENTS - | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* Section flags. */ - 0, /* Leading underscore. */ - ' ', /* 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_dummy_target, - oasys_object_p, /* bfd_check_format. */ - oasys_archive_p, - _bfd_dummy_target, - }, - { /* bfd_set_format. */ - _bfd_bool_bfd_false_error, - oasys_mkobject, - _bfd_generic_mkarchive, - _bfd_bool_bfd_false_error - }, - { /* bfd_write_contents. */ - _bfd_bool_bfd_false_error, - oasys_write_object_contents, - _bfd_write_archive_contents, - _bfd_bool_bfd_false_error, - }, - - BFD_JUMP_TABLE_GENERIC (oasys), - BFD_JUMP_TABLE_COPY (_bfd_generic), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (oasys), - BFD_JUMP_TABLE_SYMBOLS (oasys), - BFD_JUMP_TABLE_RELOCS (oasys), - BFD_JUMP_TABLE_WRITE (oasys), - BFD_JUMP_TABLE_LINK (oasys), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - NULL, - - NULL -}; |