1 |
227 |
jeremybenn |
@section a.out backends
|
2 |
|
|
|
3 |
|
|
|
4 |
|
|
@strong{Description}@*
|
5 |
|
|
BFD supports a number of different flavours of a.out format,
|
6 |
|
|
though the major differences are only the sizes of the
|
7 |
|
|
structures on disk, and the shape of the relocation
|
8 |
|
|
information.
|
9 |
|
|
|
10 |
|
|
The support is split into a basic support file @file{aoutx.h}
|
11 |
|
|
and other files which derive functions from the base. One
|
12 |
|
|
derivation file is @file{aoutf1.h} (for a.out flavour 1), and
|
13 |
|
|
adds to the basic a.out functions support for sun3, sun4, 386
|
14 |
|
|
and 29k a.out files, to create a target jump vector for a
|
15 |
|
|
specific target.
|
16 |
|
|
|
17 |
|
|
This information is further split out into more specific files
|
18 |
|
|
for each machine, including @file{sunos.c} for sun3 and sun4,
|
19 |
|
|
@file{newsos3.c} for the Sony NEWS, and @file{demo64.c} for a
|
20 |
|
|
demonstration of a 64 bit a.out format.
|
21 |
|
|
|
22 |
|
|
The base file @file{aoutx.h} defines general mechanisms for
|
23 |
|
|
reading and writing records to and from disk and various
|
24 |
|
|
other methods which BFD requires. It is included by
|
25 |
|
|
@file{aout32.c} and @file{aout64.c} to form the names
|
26 |
|
|
@code{aout_32_swap_exec_header_in}, @code{aout_64_swap_exec_header_in}, etc.
|
27 |
|
|
|
28 |
|
|
As an example, this is what goes on to make the back end for a
|
29 |
|
|
sun4, from @file{aout32.c}:
|
30 |
|
|
|
31 |
|
|
@example
|
32 |
|
|
#define ARCH_SIZE 32
|
33 |
|
|
#include "aoutx.h"
|
34 |
|
|
@end example
|
35 |
|
|
|
36 |
|
|
Which exports names:
|
37 |
|
|
|
38 |
|
|
@example
|
39 |
|
|
...
|
40 |
|
|
aout_32_canonicalize_reloc
|
41 |
|
|
aout_32_find_nearest_line
|
42 |
|
|
aout_32_get_lineno
|
43 |
|
|
aout_32_get_reloc_upper_bound
|
44 |
|
|
...
|
45 |
|
|
@end example
|
46 |
|
|
|
47 |
|
|
from @file{sunos.c}:
|
48 |
|
|
|
49 |
|
|
@example
|
50 |
|
|
#define TARGET_NAME "a.out-sunos-big"
|
51 |
|
|
#define VECNAME sunos_big_vec
|
52 |
|
|
#include "aoutf1.h"
|
53 |
|
|
@end example
|
54 |
|
|
|
55 |
|
|
requires all the names from @file{aout32.c}, and produces the jump vector
|
56 |
|
|
|
57 |
|
|
@example
|
58 |
|
|
sunos_big_vec
|
59 |
|
|
@end example
|
60 |
|
|
|
61 |
|
|
The file @file{host-aout.c} is a special case. It is for a large set
|
62 |
|
|
of hosts that use ``more or less standard'' a.out files, and
|
63 |
|
|
for which cross-debugging is not interesting. It uses the
|
64 |
|
|
standard 32-bit a.out support routines, but determines the
|
65 |
|
|
file offsets and addresses of the text, data, and BSS
|
66 |
|
|
sections, the machine architecture and machine type, and the
|
67 |
|
|
entry point address, in a host-dependent manner. Once these
|
68 |
|
|
values have been determined, generic code is used to handle
|
69 |
|
|
the object file.
|
70 |
|
|
|
71 |
|
|
When porting it to run on a new system, you must supply:
|
72 |
|
|
|
73 |
|
|
@example
|
74 |
|
|
HOST_PAGE_SIZE
|
75 |
|
|
HOST_SEGMENT_SIZE
|
76 |
|
|
HOST_MACHINE_ARCH (optional)
|
77 |
|
|
HOST_MACHINE_MACHINE (optional)
|
78 |
|
|
HOST_TEXT_START_ADDR
|
79 |
|
|
HOST_STACK_END_ADDR
|
80 |
|
|
@end example
|
81 |
|
|
|
82 |
|
|
in the file @file{../include/sys/h-@var{XXX}.h} (for your host). These
|
83 |
|
|
values, plus the structures and macros defined in @file{a.out.h} on
|
84 |
|
|
your host system, will produce a BFD target that will access
|
85 |
|
|
ordinary a.out files on your host. To configure a new machine
|
86 |
|
|
to use @file{host-aout.c}, specify:
|
87 |
|
|
|
88 |
|
|
@example
|
89 |
|
|
TDEFAULTS = -DDEFAULT_VECTOR=host_aout_big_vec
|
90 |
|
|
TDEPFILES= host-aout.o trad-core.o
|
91 |
|
|
@end example
|
92 |
|
|
|
93 |
|
|
in the @file{config/@var{XXX}.mt} file, and modify @file{configure.in}
|
94 |
|
|
to use the
|
95 |
|
|
@file{@var{XXX}.mt} file (by setting "@code{bfd_target=XXX}") when your
|
96 |
|
|
configuration is selected.
|
97 |
|
|
|
98 |
|
|
@subsection Relocations
|
99 |
|
|
|
100 |
|
|
|
101 |
|
|
@strong{Description}@*
|
102 |
|
|
The file @file{aoutx.h} provides for both the @emph{standard}
|
103 |
|
|
and @emph{extended} forms of a.out relocation records.
|
104 |
|
|
|
105 |
|
|
The standard records contain only an
|
106 |
|
|
address, a symbol index, and a type field. The extended records
|
107 |
|
|
(used on 29ks and sparcs) also have a full integer for an
|
108 |
|
|
addend.
|
109 |
|
|
|
110 |
|
|
@subsection Internal entry points
|
111 |
|
|
|
112 |
|
|
|
113 |
|
|
@strong{Description}@*
|
114 |
|
|
@file{aoutx.h} exports several routines for accessing the
|
115 |
|
|
contents of an a.out file, which are gathered and exported in
|
116 |
|
|
turn by various format specific files (eg sunos.c).
|
117 |
|
|
|
118 |
|
|
@findex aout_@var{size}_swap_exec_header_in
|
119 |
|
|
@subsubsection @code{aout_@var{size}_swap_exec_header_in}
|
120 |
|
|
@strong{Synopsis}
|
121 |
|
|
@example
|
122 |
|
|
void aout_@var{size}_swap_exec_header_in,
|
123 |
|
|
(bfd *abfd,
|
124 |
|
|
struct external_exec *bytes,
|
125 |
|
|
struct internal_exec *execp);
|
126 |
|
|
@end example
|
127 |
|
|
@strong{Description}@*
|
128 |
|
|
Swap the information in an executable header @var{raw_bytes} taken
|
129 |
|
|
from a raw byte stream memory image into the internal exec header
|
130 |
|
|
structure @var{execp}.
|
131 |
|
|
|
132 |
|
|
@findex aout_@var{size}_swap_exec_header_out
|
133 |
|
|
@subsubsection @code{aout_@var{size}_swap_exec_header_out}
|
134 |
|
|
@strong{Synopsis}
|
135 |
|
|
@example
|
136 |
|
|
void aout_@var{size}_swap_exec_header_out
|
137 |
|
|
(bfd *abfd,
|
138 |
|
|
struct internal_exec *execp,
|
139 |
|
|
struct external_exec *raw_bytes);
|
140 |
|
|
@end example
|
141 |
|
|
@strong{Description}@*
|
142 |
|
|
Swap the information in an internal exec header structure
|
143 |
|
|
@var{execp} into the buffer @var{raw_bytes} ready for writing to disk.
|
144 |
|
|
|
145 |
|
|
@findex aout_@var{size}_some_aout_object_p
|
146 |
|
|
@subsubsection @code{aout_@var{size}_some_aout_object_p}
|
147 |
|
|
@strong{Synopsis}
|
148 |
|
|
@example
|
149 |
|
|
const bfd_target *aout_@var{size}_some_aout_object_p
|
150 |
|
|
(bfd *abfd,
|
151 |
|
|
struct internal_exec *execp,
|
152 |
|
|
const bfd_target *(*callback_to_real_object_p) (bfd *));
|
153 |
|
|
@end example
|
154 |
|
|
@strong{Description}@*
|
155 |
|
|
Some a.out variant thinks that the file open in @var{abfd}
|
156 |
|
|
checking is an a.out file. Do some more checking, and set up
|
157 |
|
|
for access if it really is. Call back to the calling
|
158 |
|
|
environment's "finish up" function just before returning, to
|
159 |
|
|
handle any last-minute setup.
|
160 |
|
|
|
161 |
|
|
@findex aout_@var{size}_mkobject
|
162 |
|
|
@subsubsection @code{aout_@var{size}_mkobject}
|
163 |
|
|
@strong{Synopsis}
|
164 |
|
|
@example
|
165 |
|
|
bfd_boolean aout_@var{size}_mkobject, (bfd *abfd);
|
166 |
|
|
@end example
|
167 |
|
|
@strong{Description}@*
|
168 |
|
|
Initialize BFD @var{abfd} for use with a.out files.
|
169 |
|
|
|
170 |
|
|
@findex aout_@var{size}_machine_type
|
171 |
|
|
@subsubsection @code{aout_@var{size}_machine_type}
|
172 |
|
|
@strong{Synopsis}
|
173 |
|
|
@example
|
174 |
|
|
enum machine_type aout_@var{size}_machine_type
|
175 |
|
|
(enum bfd_architecture arch,
|
176 |
|
|
unsigned long machine,
|
177 |
|
|
bfd_boolean *unknown);
|
178 |
|
|
@end example
|
179 |
|
|
@strong{Description}@*
|
180 |
|
|
Keep track of machine architecture and machine type for
|
181 |
|
|
a.out's. Return the @code{machine_type} for a particular
|
182 |
|
|
architecture and machine, or @code{M_UNKNOWN} if that exact architecture
|
183 |
|
|
and machine can't be represented in a.out format.
|
184 |
|
|
|
185 |
|
|
If the architecture is understood, machine type 0 (default)
|
186 |
|
|
is always understood.
|
187 |
|
|
|
188 |
|
|
@findex aout_@var{size}_set_arch_mach
|
189 |
|
|
@subsubsection @code{aout_@var{size}_set_arch_mach}
|
190 |
|
|
@strong{Synopsis}
|
191 |
|
|
@example
|
192 |
|
|
bfd_boolean aout_@var{size}_set_arch_mach,
|
193 |
|
|
(bfd *,
|
194 |
|
|
enum bfd_architecture arch,
|
195 |
|
|
unsigned long machine);
|
196 |
|
|
@end example
|
197 |
|
|
@strong{Description}@*
|
198 |
|
|
Set the architecture and the machine of the BFD @var{abfd} to the
|
199 |
|
|
values @var{arch} and @var{machine}. Verify that @var{abfd}'s format
|
200 |
|
|
can support the architecture required.
|
201 |
|
|
|
202 |
|
|
@findex aout_@var{size}_new_section_hook
|
203 |
|
|
@subsubsection @code{aout_@var{size}_new_section_hook}
|
204 |
|
|
@strong{Synopsis}
|
205 |
|
|
@example
|
206 |
|
|
bfd_boolean aout_@var{size}_new_section_hook,
|
207 |
|
|
(bfd *abfd,
|
208 |
|
|
asection *newsect);
|
209 |
|
|
@end example
|
210 |
|
|
@strong{Description}@*
|
211 |
|
|
Called by the BFD in response to a @code{bfd_make_section}
|
212 |
|
|
request.
|
213 |
|
|
|