Back to index

cell-binutils  2.17cvs20070401
i386os9k.c
Go to the documentation of this file.
00001 /* BFD back-end for os9000 i386 binaries.
00002    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2001, 2002,
00003    2004, 2005, 2006, 2007 Free Software Foundation, Inc.
00004    Written by Cygnus Support.
00005 
00006 This file is part of BFD, the Binary File Descriptor library.
00007 
00008 This program is free software; you can redistribute it and/or modify
00009 it under the terms of the GNU General Public License as published by
00010 the Free Software Foundation; either version 2 of the License, or
00011 (at your option) any later version.
00012 
00013 This program is distributed in the hope that it will be useful,
00014 but WITHOUT ANY WARRANTY; without even the implied warranty of
00015 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016 GNU General Public License for more details.
00017 
00018 You should have received a copy of the GNU General Public License
00019 along with this program; if not, write to the Free Software
00020 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
00021 
00022 
00023 #include "bfd.h"
00024 #include "sysdep.h"
00025 #include "libbfd.h"
00026 #include "bfdlink.h"
00027 #include "libaout.h"        /* BFD a.out internal data structures */
00028 #include "os9k.h"
00029 
00030 /* Swaps the information in an executable header taken from a raw byte
00031    stream memory image, into the internal exec_header structure.  */
00032 static bfd_boolean
00033 os9k_swap_exec_header_in (bfd *abfd,
00034                        mh_com *raw_bytes,
00035                        struct internal_exec *execp)
00036 {
00037   mh_com *bytes = (mh_com *) raw_bytes;
00038   unsigned int dload, dmemsize, dmemstart;
00039 
00040   /* Now fill in fields in the execp, from the bytes in the raw data.  */
00041   execp->a_info = H_GET_16 (abfd, bytes->m_sync);
00042   execp->a_syms = 0;
00043   execp->a_entry = H_GET_32 (abfd, bytes->m_exec);
00044   execp->a_talign = 2;
00045   execp->a_dalign = 2;
00046   execp->a_balign = 2;
00047 
00048   dload = H_GET_32 (abfd, bytes->m_idata);
00049   execp->a_data = dload + 8;
00050 
00051   if (bfd_seek (abfd, (file_ptr) dload, SEEK_SET) != 0
00052       || (bfd_bread (&dmemstart, (bfd_size_type) sizeof (dmemstart), abfd)
00053          != sizeof (dmemstart))
00054       || (bfd_bread (&dmemsize, (bfd_size_type) sizeof (dmemsize), abfd)
00055          != sizeof (dmemsize)))
00056     return FALSE;
00057 
00058   execp->a_tload = 0;
00059   execp->a_dload = H_GET_32 (abfd, (unsigned char *) &dmemstart);
00060   execp->a_text = dload - execp->a_tload;
00061   execp->a_data = H_GET_32 (abfd, (unsigned char *) &dmemsize);
00062   execp->a_bss = H_GET_32 (abfd, bytes->m_data) - execp->a_data;
00063 
00064   execp->a_trsize = 0;
00065   execp->a_drsize = 0;
00066 
00067   return TRUE;
00068 }
00069 
00070 
00071 /* Finish up the opening of a b.out file for reading.  Fill in all the
00072    fields that are not handled by common code.  */
00073 
00074 static const bfd_target *
00075 os9k_callback (bfd *abfd)
00076 {
00077   struct internal_exec *execp = exec_hdr (abfd);
00078   unsigned long bss_start;
00079 
00080   /* Architecture and machine type.  */
00081   bfd_set_arch_mach (abfd, bfd_arch_i386, 0);
00082 
00083   /* The positions of the string table and symbol table.  */
00084   obj_str_filepos (abfd) = 0;
00085   obj_sym_filepos (abfd) = 0;
00086 
00087   /* The alignments of the sections.  */
00088   obj_textsec (abfd)->alignment_power = execp->a_talign;
00089   obj_datasec (abfd)->alignment_power = execp->a_dalign;
00090   obj_bsssec (abfd)->alignment_power = execp->a_balign;
00091 
00092   /* The starting addresses of the sections.  */
00093   obj_textsec (abfd)->vma = execp->a_tload;
00094   obj_datasec (abfd)->vma = execp->a_dload;
00095 
00096   /* And reload the sizes, since the aout module zaps them.  */
00097   obj_textsec (abfd)->size = execp->a_text;
00098 
00099   bss_start = execp->a_dload + execp->a_data;    /* BSS = end of data section.  */
00100   obj_bsssec (abfd)->vma = align_power (bss_start, execp->a_balign);
00101 
00102   /* The file positions of the sections.  */
00103   obj_textsec (abfd)->filepos = execp->a_entry;
00104   obj_datasec (abfd)->filepos = execp->a_dload;
00105 
00106   /* The file positions of the relocation info ***
00107   obj_textsec (abfd)->rel_filepos = N_TROFF(*execp);
00108   obj_datasec (abfd)->rel_filepos =  N_DROFF(*execp);  */
00109 
00110   adata (abfd).page_size = 1;      /* Not applicable.  */
00111   adata (abfd).segment_size = 1;/* Not applicable.  */
00112   adata (abfd).exec_bytes_size = MHCOM_BYTES_SIZE;
00113 
00114   return abfd->xvec;
00115 }
00116 
00117 static const bfd_target *
00118 os9k_object_p (bfd *abfd)
00119 {
00120   struct internal_exec anexec;
00121   mh_com exec_bytes;
00122 
00123   if (bfd_bread ((PTR) &exec_bytes, (bfd_size_type) MHCOM_BYTES_SIZE, abfd)
00124       != MHCOM_BYTES_SIZE)
00125     {
00126       if (bfd_get_error () != bfd_error_system_call)
00127        bfd_set_error (bfd_error_wrong_format);
00128       return 0;
00129     }
00130 
00131   anexec.a_info = H_GET_16 (abfd, exec_bytes.m_sync);
00132   if (N_BADMAG (anexec))
00133     {
00134       bfd_set_error (bfd_error_wrong_format);
00135       return 0;
00136     }
00137 
00138   if (! os9k_swap_exec_header_in (abfd, &exec_bytes, &anexec))
00139     {
00140       if (bfd_get_error () != bfd_error_system_call)
00141        bfd_set_error (bfd_error_wrong_format);
00142       return NULL;
00143     }
00144   return aout_32_some_aout_object_p (abfd, &anexec, os9k_callback);
00145 }
00146 
00147 static int
00148 os9k_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED,
00149                    struct bfd_link_info *info ATTRIBUTE_UNUSED)
00150 {
00151   return sizeof (struct internal_exec);
00152 }
00153 
00154 
00155 
00156 #define aout_32_close_and_cleanup aout_32_bfd_free_cached_info
00157 
00158 #define aout_32_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
00159 
00160 #define aout_32_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
00161 #define aout_32_bfd_reloc_name_lookup _bfd_norelocs_bfd_reloc_name_lookup
00162 
00163 #define aout_32_get_section_contents_in_window \
00164   _bfd_generic_get_section_contents_in_window
00165 
00166 #define os9k_bfd_get_relocated_section_contents \
00167   bfd_generic_get_relocated_section_contents
00168 #define os9k_bfd_relax_section bfd_generic_relax_section
00169 #define os9k_bfd_gc_sections bfd_generic_gc_sections
00170 #define os9k_bfd_merge_sections bfd_generic_merge_sections
00171 #define os9k_bfd_is_group_section bfd_generic_is_group_section
00172 #define os9k_bfd_discard_group bfd_generic_discard_group
00173 #define os9k_section_already_linked \
00174   _bfd_generic_section_already_linked
00175 #define os9k_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
00176 #define os9k_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
00177 #define os9k_bfd_link_add_symbols _bfd_generic_link_add_symbols
00178 #define os9k_bfd_link_just_syms _bfd_generic_link_just_syms
00179 #define os9k_bfd_final_link _bfd_generic_final_link
00180 #define os9k_bfd_link_split_section  _bfd_generic_link_split_section
00181 
00182 const bfd_target i386os9k_vec =
00183   {
00184     "i386os9k",                    /* name */
00185     bfd_target_os9k_flavour,
00186     BFD_ENDIAN_LITTLE,             /* data byte order is little */
00187     BFD_ENDIAN_LITTLE,             /* hdr byte order is little */
00188     (HAS_RELOC | EXEC_P | WP_TEXT),       /* object flags */
00189     (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD),   /* section flags */
00190     0,                      /* symbol leading char */
00191     ' ',                           /* ar_pad_char */
00192     16,                            /* ar_max_namelen */
00193 
00194     bfd_getl64, bfd_getl_signed_64, bfd_putl64,
00195     bfd_getl32, bfd_getl_signed_32, bfd_putl32,
00196     bfd_getl16, bfd_getl_signed_16, bfd_putl16,  /* data */
00197     bfd_getl64, bfd_getl_signed_64, bfd_putl64,
00198     bfd_getl32, bfd_getl_signed_32, bfd_putl32,
00199     bfd_getl16, bfd_getl_signed_16, bfd_putl16,  /* hdrs */
00200     {_bfd_dummy_target, os9k_object_p,    /* bfd_check_format */
00201      bfd_generic_archive_p, _bfd_dummy_target},
00202     {bfd_false, bfd_false,  /* bfd_set_format */
00203      _bfd_generic_mkarchive, bfd_false},
00204     {bfd_false, bfd_false,  /* bfd_write_contents */
00205      _bfd_write_archive_contents, bfd_false},
00206 
00207     BFD_JUMP_TABLE_GENERIC (aout_32),
00208     BFD_JUMP_TABLE_COPY (_bfd_generic),
00209     BFD_JUMP_TABLE_CORE (_bfd_nocore),
00210     BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_bsd),
00211     BFD_JUMP_TABLE_SYMBOLS (aout_32),
00212     BFD_JUMP_TABLE_RELOCS (aout_32),
00213     BFD_JUMP_TABLE_WRITE (aout_32),
00214     BFD_JUMP_TABLE_LINK (os9k),
00215     BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
00216 
00217     NULL,
00218 
00219     (PTR) 0,
00220   };