]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/binutils/include/aout/encap.h
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / binutils / include / aout / encap.h
1 /* Yet Another Try at encapsulating bsd object files in coff.
2    Copyright 1988, 1989, 1991 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@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 2 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, MA 02110-1301, USA.  */
21
22 /*
23  * We only use the coff headers to tell the kernel
24  * how to exec the file.  Therefore, the only fields that need to 
25  * be filled in are the scnptr and vaddr for the text and data
26  * sections, and the vaddr for the bss.  As far as coff is concerned,
27  * there is no symbol table, relocation, or line numbers.
28  *
29  * A normal bsd header (struct exec) is placed after the coff headers,
30  * and before the real text.  I defined a the new fields 'a_machtype'
31  * and a_flags.  If a_machtype is M_386, and a_flags & A_ENCAP is
32  * true, then the bsd header is preceeded by a coff header.  Macros
33  * like N_TXTOFF and N_TXTADDR use this field to find the bsd header.
34  * 
35  * The only problem is to track down the bsd exec header.  The
36  * macros HEADER_OFFSET, etc do this.
37  */
38
39 #define N_FLAGS_COFF_ENCAPSULATE 0x20 /* coff header precedes bsd header */
40
41 /* Describe the COFF header used for encapsulation.  */
42
43 struct coffheader
44 {
45   /* filehdr */
46   unsigned short f_magic;
47   unsigned short f_nscns;
48   long f_timdat;
49   long f_symptr;
50   long f_nsyms;
51   unsigned short f_opthdr;
52   unsigned short f_flags;
53   /* aouthdr */
54   short magic;
55   short vstamp;
56   long tsize;
57   long dsize;
58   long bsize;
59   long entry;
60   long text_start;
61   long data_start;
62   struct coffscn
63     {
64       char s_name[8];
65       long s_paddr;
66       long s_vaddr;
67       long s_size;
68       long s_scnptr;
69       long s_relptr;
70       long s_lnnoptr;
71       unsigned short s_nreloc;
72       unsigned short s_nlnno;
73       long s_flags;
74     } scns[3];
75 };
76 \f
77 /* Describe some of the parameters of the encapsulation,
78    including how to find the encapsulated BSD header.  */
79
80 /* FIXME, this is dumb.  The same tools can't handle a.outs for different
81    architectures, just because COFF_MAGIC is different; so you need a
82    separate GNU nm for every architecture!!?  Unfortunately, it needs to
83    be this way, since the COFF_MAGIC value is determined by the kernel
84    we're trying to fool here.  */
85    
86 #define COFF_MAGIC_I386 0514 /* I386MAGIC */
87 #define COFF_MAGIC_M68K 0520 /* MC68MAGIC */
88
89 #ifdef COFF_MAGIC
90 short __header_offset_temp;
91 #define HEADER_OFFSET(f) \
92         (__header_offset_temp = 0, \
93          fread ((char *)&__header_offset_temp, sizeof (short), 1, (f)), \
94          fseek ((f), -sizeof (short), 1), \
95          __header_offset_temp==COFF_MAGIC ? sizeof(struct coffheader) : 0)
96 #else
97 #define HEADER_OFFSET(f) 0
98 #endif
99
100 #define HEADER_SEEK(f) (fseek ((f), HEADER_OFFSET((f)), 1))
101 \f
102 /* Describe the characteristics of the BSD header
103    that appears inside the encapsulation.  */
104
105 /* Encapsulated coff files that are linked ZMAGIC have a text segment
106    offset just past the header (and a matching TXTADDR), excluding
107    the headers from the text segment proper but keeping the physical
108    layout and the virtual memory layout page-aligned.
109
110    Non-encapsulated a.out files that are linked ZMAGIC have a text
111    segment that starts at 0 and an N_TXTADR similarly offset to 0.
112    They too are page-aligned with each other, but they include the
113    a.out header as part of the text. 
114
115    The _N_HDROFF gets sizeof struct exec added to it, so we have
116    to compensate here.  See <a.out.gnu.h>.  */
117
118 #undef _N_HDROFF
119 #undef N_TXTADDR
120 #undef N_DATADDR
121
122 #define _N_HDROFF(x) ((N_FLAGS(x) & N_FLAGS_COFF_ENCAPSULATE) ? \
123                       sizeof (struct coffheader) : 0)
124
125 /* Address of text segment in memory after it is loaded.  */
126 #define N_TXTADDR(x) \
127         ((N_FLAGS(x) & N_FLAGS_COFF_ENCAPSULATE) ? \
128          sizeof (struct coffheader) + sizeof (struct exec) : 0)
129 #define SEGMENT_SIZE 0x400000
130
131 #define N_DATADDR(x) \
132         ((N_FLAGS(x) & N_FLAGS_COFF_ENCAPSULATE) ? \
133          (SEGMENT_SIZE + ((N_TXTADDR(x)+(x).a_text-1) & ~(SEGMENT_SIZE-1))) : \
134          (N_TXTADDR(x)+(x).a_text))