| 1 | @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 *raw_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 | const bfd_target *(*callback_to_real_object_p) ()); | 
|---|
| 152 | @end example | 
|---|
| 153 | @strong{Description}@* | 
|---|
| 154 | Some a.out variant thinks that the file open in @var{abfd} | 
|---|
| 155 | checking is an a.out file.  Do some more checking, and set up | 
|---|
| 156 | for access if it really is.  Call back to the calling | 
|---|
| 157 | environment's "finish up" function just before returning, to | 
|---|
| 158 | handle any last-minute setup. | 
|---|
| 159 |  | 
|---|
| 160 | @findex aout_@var{size}_mkobject | 
|---|
| 161 | @subsubsection @code{aout_@var{size}_mkobject} | 
|---|
| 162 | @strong{Synopsis} | 
|---|
| 163 | @example | 
|---|
| 164 | bfd_boolean aout_@var{size}_mkobject, (bfd *abfd); | 
|---|
| 165 | @end example | 
|---|
| 166 | @strong{Description}@* | 
|---|
| 167 | Initialize BFD @var{abfd} for use with a.out files. | 
|---|
| 168 |  | 
|---|
| 169 | @findex aout_@var{size}_machine_type | 
|---|
| 170 | @subsubsection @code{aout_@var{size}_machine_type} | 
|---|
| 171 | @strong{Synopsis} | 
|---|
| 172 | @example | 
|---|
| 173 | enum machine_type  aout_@var{size}_machine_type | 
|---|
| 174 | (enum bfd_architecture arch, | 
|---|
| 175 | unsigned long machine)); | 
|---|
| 176 | @end example | 
|---|
| 177 | @strong{Description}@* | 
|---|
| 178 | Keep track of machine architecture and machine type for | 
|---|
| 179 | a.out's. Return the @code{machine_type} for a particular | 
|---|
| 180 | architecture and machine, or @code{M_UNKNOWN} if that exact architecture | 
|---|
| 181 | and machine can't be represented in a.out format. | 
|---|
| 182 |  | 
|---|
| 183 | If the architecture is understood, machine type 0 (default) | 
|---|
| 184 | is always understood. | 
|---|
| 185 |  | 
|---|
| 186 | @findex aout_@var{size}_set_arch_mach | 
|---|
| 187 | @subsubsection @code{aout_@var{size}_set_arch_mach} | 
|---|
| 188 | @strong{Synopsis} | 
|---|
| 189 | @example | 
|---|
| 190 | bfd_boolean aout_@var{size}_set_arch_mach, | 
|---|
| 191 | (bfd *, | 
|---|
| 192 | enum bfd_architecture arch, | 
|---|
| 193 | unsigned long machine)); | 
|---|
| 194 | @end example | 
|---|
| 195 | @strong{Description}@* | 
|---|
| 196 | Set the architecture and the machine of the BFD @var{abfd} to the | 
|---|
| 197 | values @var{arch} and @var{machine}.  Verify that @var{abfd}'s format | 
|---|
| 198 | can support the architecture required. | 
|---|
| 199 |  | 
|---|
| 200 | @findex aout_@var{size}_new_section_hook | 
|---|
| 201 | @subsubsection @code{aout_@var{size}_new_section_hook} | 
|---|
| 202 | @strong{Synopsis} | 
|---|
| 203 | @example | 
|---|
| 204 | bfd_boolean aout_@var{size}_new_section_hook, | 
|---|
| 205 | (bfd *abfd, | 
|---|
| 206 | asection *newsect)); | 
|---|
| 207 | @end example | 
|---|
| 208 | @strong{Description}@* | 
|---|
| 209 | Called by the BFD in response to a @code{bfd_make_section} | 
|---|
| 210 | request. | 
|---|
| 211 |  | 
|---|