Home | History | Annotate | Download | only in aout
      1 /* Yet Another Try at encapsulating bfd object files in coff.
      2    Copyright (C) 1988-2014 Free Software Foundation, Inc.
      3    Written by Pace Willisson 12/9/88
      4 
      5    This file is obsolete.  It needs to be converted to just define a bunch
      6    of stuff that BFD can use to do coff-encapsulated files.  --gnu (at) cygnus.com
      7 
      8    This program is free software; you can redistribute it and/or modify
      9    it under the terms of the GNU General Public License as published by
     10    the Free Software Foundation; either version 3 of the License, or
     11    (at your option) any later version.
     12 
     13    This program is distributed in the hope that it will be useful,
     14    but WITHOUT ANY WARRANTY; without even the implied warranty of
     15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16    GNU General Public License for more details.
     17 
     18    You should have received a copy of the GNU General Public License
     19    along with this program; if not, write to the Free Software
     20    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     21    MA 02110-1301, USA.  */
     22 
     23 /*
     24  * We only use the coff headers to tell the kernel
     25  * how to exec the file.  Therefore, the only fields that need to
     26  * be filled in are the scnptr and vaddr for the text and data
     27  * sections, and the vaddr for the bss.  As far as coff is concerned,
     28  * there is no symbol table, relocation, or line numbers.
     29  *
     30  * A normal bsd header (struct exec) is placed after the coff headers,
     31  * and before the real text.  I defined a the new fields 'a_machtype'
     32  * and a_flags.  If a_machtype is M_386, and a_flags & A_ENCAP is
     33  * true, then the bsd header is preceeded by a coff header.  Macros
     34  * like N_TXTOFF and N_TXTADDR use this field to find the bsd header.
     35  *
     36  * The only problem is to track down the bsd exec header.  The
     37  * macros HEADER_OFFSET, etc do this.
     38  */
     39 
     40 #define N_FLAGS_COFF_ENCAPSULATE 0x20 /* coff header precedes bsd header */
     41 
     42 /* Describe the COFF header used for encapsulation.  */
     43 
     44 struct coffheader
     45 {
     46   /* filehdr */
     47   unsigned short f_magic;
     48   unsigned short f_nscns;
     49   long f_timdat;
     50   long f_symptr;
     51   long f_nsyms;
     52   unsigned short f_opthdr;
     53   unsigned short f_flags;
     54   /* aouthdr */
     55   short magic;
     56   short vstamp;
     57   long tsize;
     58   long dsize;
     59   long bsize;
     60   long entry;
     61   long text_start;
     62   long data_start;
     63   struct coffscn
     64     {
     65       char s_name[8];
     66       long s_paddr;
     67       long s_vaddr;
     68       long s_size;
     69       long s_scnptr;
     70       long s_relptr;
     71       long s_lnnoptr;
     72       unsigned short s_nreloc;
     73       unsigned short s_nlnno;
     74       long s_flags;
     75     } scns[3];
     76 };
     77 
     78 /* Describe some of the parameters of the encapsulation,
     80    including how to find the encapsulated BSD header.  */
     81 
     82 /* FIXME, this is dumb.  The same tools can't handle a.outs for different
     83    architectures, just because COFF_MAGIC is different; so you need a
     84    separate GNU nm for every architecture!!?  Unfortunately, it needs to
     85    be this way, since the COFF_MAGIC value is determined by the kernel
     86    we're trying to fool here.  */
     87 
     88 #define COFF_MAGIC_I386 0514 /* I386MAGIC */
     89 #define COFF_MAGIC_M68K 0520 /* MC68MAGIC */
     90 
     91 #ifdef COFF_MAGIC
     92 short __header_offset_temp;
     93 #define HEADER_OFFSET(f) \
     94 	(__header_offset_temp = 0, \
     95 	 fread ((char *)&__header_offset_temp, sizeof (short), 1, (f)), \
     96 	 fseek ((f), -sizeof (short), 1), \
     97 	 __header_offset_temp==COFF_MAGIC ? sizeof(struct coffheader) : 0)
     98 #else
     99 #define HEADER_OFFSET(f) 0
    100 #endif
    101 
    102 #define HEADER_SEEK(f) (fseek ((f), HEADER_OFFSET((f)), 1))
    103 
    104 /* Describe the characteristics of the BSD header
    106    that appears inside the encapsulation.  */
    107 
    108 /* Encapsulated coff files that are linked ZMAGIC have a text segment
    109    offset just past the header (and a matching TXTADDR), excluding
    110    the headers from the text segment proper but keeping the physical
    111    layout and the virtual memory layout page-aligned.
    112 
    113    Non-encapsulated a.out files that are linked ZMAGIC have a text
    114    segment that starts at 0 and an N_TXTADR similarly offset to 0.
    115    They too are page-aligned with each other, but they include the
    116    a.out header as part of the text.
    117 
    118    The _N_HDROFF gets sizeof struct exec added to it, so we have
    119    to compensate here.  See <a.out.gnu.h>.  */
    120 
    121 #undef _N_HDROFF
    122 #undef N_TXTADDR
    123 #undef N_DATADDR
    124 
    125 #define _N_HDROFF(x) ((N_FLAGS(x) & N_FLAGS_COFF_ENCAPSULATE) ? \
    126 		      sizeof (struct coffheader) : 0)
    127 
    128 /* Address of text segment in memory after it is loaded.  */
    129 #define N_TXTADDR(x) \
    130 	((N_FLAGS(x) & N_FLAGS_COFF_ENCAPSULATE) ? \
    131 	 sizeof (struct coffheader) + sizeof (struct exec) : 0)
    132 #define SEGMENT_SIZE 0x400000
    133 
    134 #define N_DATADDR(x) \
    135 	((N_FLAGS(x) & N_FLAGS_COFF_ENCAPSULATE) ? \
    136 	 (SEGMENT_SIZE + ((N_TXTADDR(x)+(x).a_text-1) & ~(SEGMENT_SIZE-1))) : \
    137 	 (N_TXTADDR(x)+(x).a_text))
    138