a.out backends
==============

Description

BFD supports a number of different flavours of a.out format, though the major differences are only the sizes of the structures on disk, and the shape of the relocation information.

The support is split into a basic support file aoutx.h and other files which derive functions from the base. One derivation file is aoutf1.h (for a.out flavour 1), and adds to the basic a.out functions support for sun3, sun4, and 386 a.out files, to create a target jump vector for a specific target.

This information is further split out into more specific files for each machine, including sunos.c for sun3 and sun4, and demo64.c for a demonstration of a 64 bit a.out format.

The base file aoutx.h defines general mechanisms for reading and writing records to and from disk and various other methods which BFD requires. It is included by aout32.c and aout64.c to form the names aout_32_swap_exec_header_in, aout_64_swap_exec_header_in, etc.

As an example, this is what goes on to make the back end for a sun4, from aout32.c:

            #define ARCH_SIZE 32
            #include "aoutx.h"

Which exports names:

            ...
            aout_32_canonicalize_reloc
            aout_32_find_nearest_line
            aout_32_get_lineno
            aout_32_get_reloc_upper_bound
            ...

from sunos.c:

            #define TARGET_NAME "a.out-sunos-big"
            #define VECNAME    sparc_aout_sunos_be_vec
            #include "aoutf1.h"

requires all the names from aout32.c, and produces the jump vector

            sparc_aout_sunos_be_vec

The file host-aout.c is a special case.  It is for a large set of hosts that use ``more or less standard'' a.out files, and for which cross-debugging is not interesting.  It uses the standard 32-bit a.out support routines, but determines the file offsets and addresses of the text, data, and BSS sections, the machine architecture and machine type, and the entry point address, in a host-dependent manner.  Once these values have been determined, generic code is used to handle the  object file.

When porting it to run on a new system, you must supply:

             HOST_PAGE_SIZE
             HOST_SEGMENT_SIZE
             HOST_MACHINE_ARCH       (optional)
             HOST_MACHINE_MACHINE    (optional)
             HOST_TEXT_START_ADDR
             HOST_STACK_END_ADDR

in the file ../include/sys/h-XXX.h (for your host).  These values, plus the structures and macros defined in a.out.h on your host system, will produce a BFD target that will access ordinary a.out files on your host. To configure a new machine to use host-aout.c, specify:

            TDEFAULTS = -DDEFAULT_VECTOR=host_aout_big_vec
            TDEPFILES= host-aout.o trad-core.o

in the config/XXX.mt file, and modify configure.ac to use the XXX.mt file (by setting "bfd_target=XXX") when your configuration is selected.

Relocations
-----------

Description

The file aoutx.h provides for both the standard and extended forms of a.out relocation records.

The standard records contain only an address, a symbol index, and a type field.  The extended records also have a full integer for an addend.

Internal entry points
---------------------

Description

aoutx.h exports several routines for accessing the contents of an a.out file, which are gathered and exported in turn by various format specific files (eg sunos.c).

aout_SIZE_swap_exec_header_in
.............................

Synopsis

     void aout_SIZE_swap_exec_header_in,
        (bfd *abfd,
         struct external_exec *bytes,
         struct internal_exec *execp);

Description

Swap the information in an executable header RAW_BYTES taken from a raw byte stream memory image into the internal exec header structure EXECP.

aout_SIZE_swap_exec_header_out
..............................

Synopsis

     void aout_SIZE_swap_exec_header_out
        (bfd *abfd,
         struct internal_exec *execp,
         struct external_exec *raw_bytes);

Description

Swap the information in an internal exec header structure EXECP into the buffer RAW_BYTES ready for writing to disk.

aout_SIZE_some_aout_object_p
............................

Synopsis

     const bfd_target *aout_SIZE_some_aout_object_p
        (bfd *abfd,
         struct internal_exec *execp,
         const bfd_target *(*callback_to_real_object_p) (bfd *));

Description

Some a.out variant thinks that the file open in ABFD checking is an a.out file.  Do some more checking, and set up for access if it really is.  Call back to the calling environment's "finish up" function just before returning, to handle any last-minute setup.

aout_SIZE_mkobject
..................

Synopsis

     bool aout_SIZE_mkobject, (bfd *abfd);

Description

Initialize BFD ABFD for use with a.out files.

aout_SIZE_machine_type
......................

Synopsis

     enum machine_type  aout_SIZE_machine_type
        (enum bfd_architecture arch,
         unsigned long machine,
         bool *unknown);

Description

Keep track of machine architecture and machine type for a.out's. Return the machine_type for a particular architecture and machine, or M_UNKNOWN if that exact architecture and machine can't be represented in a.out format.

If the architecture is understood, machine type 0 (default) is always understood.

aout_SIZE_set_arch_mach
.......................

Synopsis

     bool aout_SIZE_set_arch_mach,
        (bfd *,
         enum bfd_architecture arch,
         unsigned long machine);

Description

Set the architecture and the machine of the BFD ABFD to the values ARCH and MACHINE.  Verify that ABFD's format can support the architecture required.

aout_SIZE_new_section_hook
..........................

Synopsis

     bool aout_SIZE_new_section_hook,
        (bfd *abfd,
         asection *newsect);

Description

Called by the BFD in response to a bfd_make_section request.