A.out: Difference between revisions

2,599 bytes added ,  5 years ago
m
Added basic description
[unchecked revision][unchecked revision]
m (+ file formats infobox)
m (Added basic description)
Line 3:
 
A.OUT is the "original" binary format for Unix machines. It is considered obsolete today because of several shortcomings. However, as it is extremely simple and supported by many compilers/assemblers, it may be a good choice if you're willing to develop your own format or have more information than 'raw binary' for your bootloader.
 
==Structure==
An a.out binary file consists of up to 7 sections. In order, these sections are:
{| class="wikitable"
|-
! Section
! Description
|-
|exec header
|Contains parameters used by the kernel to load a binary file into memory and execute it, and by the link editor ld to combine a binary file with other binary files. This section is the only mandatory one.
|-
|text segment
|Contains machine code and related data that are loaded into memory when a program executes. Should be loaded read-only.
|-
|data segment
|Contains initialized data; always loaded into writable memory.
|-
|text relocations
|Contains records used by the link editor to update pointers in the text segment when combining binary files.
|-
|data relocations
|Like the text relocation section, but for data segment pointers.
|-
|symbol table
|Contains records used by the link editor to cross reference the addresses of named variables and functions (`symbols') between binary files.
|-
|string table
|Contains the character strings corresponding to the symbol names.
|}
===The exec header===
Every binary file begins with an exec structure:
<source lang="c">
struct exec {
unsigned long a_midmag;
unsigned long a_text;
unsigned long a_data;
unsigned long a_bss;
unsigned long a_syms;
unsigned long a_entry;
unsigned long a_trsize;
unsigned long a_drsize;
};
</source>
The fields have the following functions:
{| class="wikitable"
|-
! Field
! Description
|-
|a_midmag
|This field is stored in network byte-order so that binaries for machines with alternative byte orders can be distinguished. It has a number of sub-components accessed by the macros N_GETFLAG(), N_GETMID(), and N_GETMAGIC(), and set by the macro N_SETMAGIC().
|-
|a_text
|Contains the size of the text segment in bytes.
|-
|a_data
|Contains the size of the data segment in bytes.
|-
|a_bss
|Contains the number of bytes in the `bss segment'. The kernel loads the program so that this amount of writable memory appears to follow the data segment and initially reads as zeroes.
|-
|a_syms
|Contains the size in bytes of the symbol table section.
|-
|a_entry
|Contains the address in memory of the entry point of the program after the kernel has loaded it; the kernel starts the execution of the program from the machine instruction at this address.
|-
|a_trsize
|Contains the size in bytes of the text relocation table.
|-
|a_drsize
|Contains the size in bytes of the data relocation table.
|}
 
==See Also==
*[http://www.nondot.org/sabre/os/files/Executables/OpenBSD-a.out.txt OSRC #1]
*[http://www.nondot.org/sabre/os/files/Executables/a.out.txt OSRC #2]
*[https://www.freebsd.org/cgi/man.cgi?query=a.out&apropos=0&sektion=0&manpath=NetBSD+1.4&format=html NetBSD man page on a.out]
 
[[Category:Executable Formats]]
Anonymous user