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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 | |
---|
77 |
|
---|
78 | /* Describe some of the parameters of the encapsulation,
|
---|
79 | including how to find the encapsulated BSD header. */
|
---|
80 |
|
---|
81 | /* FIXME, this is dumb. The same tools can't handle a.outs for different
|
---|
82 | architectures, just because COFF_MAGIC is different; so you need a
|
---|
83 | separate GNU nm for every architecture!!? Unfortunately, it needs to
|
---|
84 | be this way, since the COFF_MAGIC value is determined by the kernel
|
---|
85 | we're trying to fool here. */
|
---|
86 |
|
---|
87 | #define COFF_MAGIC_I386 0514 /* I386MAGIC */
|
---|
88 | #define COFF_MAGIC_M68K 0520 /* MC68MAGIC */
|
---|
89 | #define COFF_MAGIC_A29K 0x17A /* Used by asm29k cross-tools */
|
---|
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 |
|
---|
105 | /* 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))
|
---|