summaryrefslogtreecommitdiff
path: root/static/freebsd/man5/a.out.5 3.html
diff options
context:
space:
mode:
Diffstat (limited to 'static/freebsd/man5/a.out.5 3.html')
-rw-r--r--static/freebsd/man5/a.out.5 3.html354
1 files changed, 354 insertions, 0 deletions
diff --git a/static/freebsd/man5/a.out.5 3.html b/static/freebsd/man5/a.out.5 3.html
new file mode 100644
index 00000000..f4fb643b
--- /dev/null
+++ b/static/freebsd/man5/a.out.5 3.html
@@ -0,0 +1,354 @@
+<table class="head">
+ <tr>
+ <td class="head-ltitle">A.OUT(5)</td>
+ <td class="head-vol">File Formats Manual</td>
+ <td class="head-rtitle">A.OUT(5)</td>
+ </tr>
+</table>
+<div class="manual-text">
+<section class="Sh">
+<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1>
+<p class="Pp"><code class="Nm">a.out</code> &#x2014; <span class="Nd">format of
+ executable binary files</span></p>
+</section>
+<section class="Sh">
+<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1>
+<p class="Pp"><code class="In">#include
+ &lt;<a class="In">a.out.h</a>&gt;</code></p>
+</section>
+<section class="Sh">
+<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1>
+<p class="Pp">The include file
+ <code class="In">&lt;<a class="In">a.out.h</a>&gt;</code> declares three
+ structures and several macros. The structures describe the format of
+ executable machine code files (&#x2018;binaries&#x2019;) on the system.</p>
+<p class="Pp">A binary file consists of up to 7 sections. In order, these
+ sections are:</p>
+<dl class="Bl-tag">
+ <dt>exec header</dt>
+ <dd>Contains parameters used by the kernel to load a binary file into memory
+ and execute it, and by the link editor <a class="Xr">ld(1)</a> to combine
+ a binary file with other binary files. This section is the only mandatory
+ one.</dd>
+ <dt>text segment</dt>
+ <dd>Contains machine code and related data that are loaded into memory when a
+ program executes. May be loaded read-only.</dd>
+ <dt>data segment</dt>
+ <dd>Contains initialized data; always loaded into writable memory.</dd>
+ <dt>text relocations</dt>
+ <dd>Contains records used by the link editor to update pointers in the text
+ segment when combining binary files.</dd>
+ <dt>data relocations</dt>
+ <dd>Like the text relocation section, but for data segment pointers.</dd>
+ <dt>symbol table</dt>
+ <dd>Contains records used by the link editor to cross reference the addresses
+ of named variables and functions (&#x2018;symbols&#x2019;) between binary
+ files.</dd>
+ <dt>string table</dt>
+ <dd>Contains the character strings corresponding to the symbol names.</dd>
+</dl>
+<p class="Pp">Every binary file begins with an <var class="Fa">exec</var>
+ structure:</p>
+<div class="Bd Pp Bd-indent Li">
+<pre>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;
+};</pre>
+</div>
+<p class="Pp">The fields have the following functions:</p>
+<dl class="Bl-tag">
+ <dt id="N_GETFLAG"><var class="Fa">a_midmag</var></dt>
+ <dd>This field is stored in host byte-order. It has a number of sub-components
+ accessed by the macros
+ <a class="permalink" href="#N_GETFLAG"><code class="Fn">N_GETFLAG</code></a>(),
+ <code class="Fn">N_GETMID</code>(), and
+ <code class="Fn">N_GETMAGIC</code>(), and set by the macro
+ <a class="permalink" href="#N_SETMAGIC"><code class="Fn" id="N_SETMAGIC">N_SETMAGIC</code></a>().
+ <p class="Pp" id="N_GETFLAG~2">The macro
+ <a class="permalink" href="#N_GETFLAG~2"><code class="Fn">N_GETFLAG</code></a>()
+ returns a few flags:</p>
+ <dl class="Bl-tag">
+ <dt id="EX_DYNAMIC"><a class="permalink" href="#EX_DYNAMIC"><code class="Dv">EX_DYNAMIC</code></a></dt>
+ <dd>indicates that the executable requires the services of the run-time
+ link editor.</dd>
+ <dt id="EX_PIC"><a class="permalink" href="#EX_PIC"><code class="Dv">EX_PIC</code></a></dt>
+ <dd>indicates that the object contains position independent code. This
+ flag is set by <a class="Xr">as(1)</a> when given the
+ &#x2018;-k&#x2019; flag and is preserved by <a class="Xr">ld(1)</a> if
+ necessary.</dd>
+ </dl>
+ <p class="Pp">If both EX_DYNAMIC and EX_PIC are set, the object file is a
+ position independent executable image (e.g. a shared library), which is
+ to be loaded into the process address space by the run-time link
+ editor.</p>
+ <p class="Pp" id="N_GETMID">The macro
+ <a class="permalink" href="#N_GETMID"><code class="Fn">N_GETMID</code></a>()
+ returns the machine-id. This indicates which machine(s) the binary is
+ intended to run on.</p>
+ <p class="Pp" id="N_GETMAGIC"><a class="permalink" href="#N_GETMAGIC"><code class="Fn">N_GETMAGIC</code></a>()
+ specifies the magic number, which uniquely identifies binary files and
+ distinguishes different loading conventions. The field must contain one
+ of the following values:</p>
+ <dl class="Bl-tag">
+ <dt id="OMAGIC"><a class="permalink" href="#OMAGIC"><code class="Dv">OMAGIC</code></a></dt>
+ <dd>The text and data segments immediately follow the header and are
+ contiguous. The kernel loads both text and data segments into writable
+ memory.</dd>
+ <dt id="NMAGIC"><a class="permalink" href="#NMAGIC"><code class="Dv">NMAGIC</code></a></dt>
+ <dd>As with <code class="Dv">OMAGIC</code>, text and data segments
+ immediately follow the header and are contiguous. However, the kernel
+ loads the text into read-only memory and loads the data into writable
+ memory at the next page boundary after the text.</dd>
+ <dt id="ZMAGIC"><a class="permalink" href="#ZMAGIC"><code class="Dv">ZMAGIC</code></a></dt>
+ <dd>The kernel loads individual pages on demand from the binary. The
+ header, text segment and data segment are all padded by the link
+ editor to a multiple of the page size. Pages that the kernel loads
+ from the text segment are read-only, while pages from the data segment
+ are writable.</dd>
+ </dl>
+ </dd>
+ <dt><var class="Fa">a_text</var></dt>
+ <dd>Contains the size of the text segment in bytes.</dd>
+ <dt><var class="Fa">a_data</var></dt>
+ <dd>Contains the size of the data segment in bytes.</dd>
+ <dt id="bss"><var class="Fa">a_bss</var></dt>
+ <dd>Contains the number of bytes in the &#x2018;bss segment&#x2019; and is
+ used by the kernel to set the initial break (<a class="Xr">brk(2)</a>)
+ after the data 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 class="permalink" href="#bss"><i class="Em">bss</i></a> =
+ block started by symbol)</dd>
+ <dt><var class="Fa">a_syms</var></dt>
+ <dd>Contains the size in bytes of the symbol table section.</dd>
+ <dt><var class="Fa">a_entry</var></dt>
+ <dd>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.</dd>
+ <dt><var class="Fa">a_trsize</var></dt>
+ <dd>Contains the size in bytes of the text relocation table.</dd>
+ <dt><var class="Fa">a_drsize</var></dt>
+ <dd>Contains the size in bytes of the data relocation table.</dd>
+</dl>
+<p class="Pp">The <code class="In">&lt;<a class="In">a.out.h</a>&gt;</code>
+ include file defines several macros which use an <var class="Fa">exec</var>
+ structure to test consistency or to locate section offsets in the binary
+ file.</p>
+<dl class="Bl-tag">
+ <dt id="N_BADMAG"><a class="permalink" href="#N_BADMAG"><code class="Fn">N_BADMAG</code></a>(<var class="Fa">exec</var>)</dt>
+ <dd>Nonzero if the <var class="Fa">a_magic</var> field does not contain a
+ recognized value.</dd>
+ <dt id="N_TXTOFF"><a class="permalink" href="#N_TXTOFF"><code class="Fn">N_TXTOFF</code></a>(<var class="Fa">exec</var>)</dt>
+ <dd>The byte offset in the binary file of the beginning of the text
+ segment.</dd>
+ <dt id="N_SYMOFF"><a class="permalink" href="#N_SYMOFF"><code class="Fn">N_SYMOFF</code></a>(<var class="Fa">exec</var>)</dt>
+ <dd>The byte offset of the beginning of the symbol table.</dd>
+ <dt id="N_STROFF"><a class="permalink" href="#N_STROFF"><code class="Fn">N_STROFF</code></a>(<var class="Fa">exec</var>)</dt>
+ <dd>The byte offset of the beginning of the string table.</dd>
+</dl>
+<p class="Pp">Relocation records have a standard format which is described by
+ the <var class="Fa">relocation_info</var> structure:</p>
+<div class="Bd Pp Bd-indent Li">
+<pre>struct relocation_info {
+ int r_address;
+ unsigned int r_symbolnum : 24,
+ r_pcrel : 1,
+ r_length : 2,
+ r_extern : 1,
+ r_baserel : 1,
+ r_jmptable : 1,
+ r_relative : 1,
+ r_copy : 1;
+};</pre>
+</div>
+<p class="Pp">The <var class="Fa">relocation_info</var> fields are used as
+ follows:</p>
+<dl class="Bl-tag">
+ <dt><var class="Fa">r_address</var></dt>
+ <dd>Contains the byte offset of a pointer that needs to be link-edited. Text
+ relocation offsets are reckoned from the start of the text segment, and
+ data relocation offsets from the start of the data segment. The link
+ editor adds the value that is already stored at this offset into the new
+ value that it computes using this relocation record.</dd>
+ <dt id="not"><var class="Fa">r_symbolnum</var></dt>
+ <dd>Contains the ordinal number of a symbol structure in the symbol table (it
+ is <a class="permalink" href="#not"><i class="Em">not</i></a> a byte
+ offset). After the link editor resolves the absolute address for this
+ symbol, it adds that address to the pointer that is undergoing relocation.
+ (If the <var class="Fa">r_extern</var> bit is clear, the situation is
+ different; see below.)</dd>
+ <dt><var class="Fa">r_pcrel</var></dt>
+ <dd>If this is set, the link editor assumes that it is updating a pointer that
+ is part of a machine code instruction using pc-relative addressing. The
+ address of the relocated pointer is implicitly added to its value when the
+ running program uses it.</dd>
+ <dt><var class="Fa">r_length</var></dt>
+ <dd>Contains the log base 2 of the length of the pointer in bytes; 0 for
+ 1-byte displacements, 1 for 2-byte displacements, 2 for 4-byte
+ displacements.</dd>
+ <dt><var class="Fa">r_extern</var></dt>
+ <dd>Set if this relocation requires an external reference; the link editor
+ must use a symbol address to update the pointer. When the
+ <var class="Fa">r_extern</var> bit is clear, the relocation is
+ &#x2018;local&#x2019;; the link editor updates the pointer to reflect
+ changes in the load addresses of the various segments, rather than changes
+ in the value of a symbol (except when <var class="Fa">r_baserel</var> is
+ also set (see below). In this case, the content of the
+ <var class="Fa">r_symbolnum</var> field is an <var class="Fa">n_type</var>
+ value (see below); this type field tells the link editor what segment the
+ relocated pointer points into.</dd>
+ <dt><var class="Fa">r_baserel</var></dt>
+ <dd>If set, the symbol, as identified by the <var class="Fa">r_symbolnum</var>
+ field, is to be relocated to an offset into the Global Offset Table. At
+ run-time, the entry in the Global Offset Table at this offset is set to be
+ the address of the symbol.</dd>
+ <dt><var class="Fa">r_jmptable</var></dt>
+ <dd>If set, the symbol, as identified by the <var class="Fa">r_symbolnum</var>
+ field, is to be relocated to an offset into the Procedure Linkage
+ Table.</dd>
+ <dt><var class="Fa">r_relative</var></dt>
+ <dd>If set, this relocation is relative to the (run-time) load address of the
+ image this object file is going to be a part of. This type of relocation
+ only occurs in shared objects.</dd>
+ <dt><var class="Fa">r_copy</var></dt>
+ <dd>If set, this relocation record identifies a symbol whose contents should
+ be copied to the location given in <var class="Fa">r_address</var>. The
+ copying is done by the run-time link-editor from a suitable data item in a
+ shared object.</dd>
+</dl>
+<p class="Pp">Symbols map names to addresses (or more generally, strings to
+ values). Since the link-editor adjusts addresses, a symbol's name must be
+ used to stand for its address until an absolute value has been assigned.
+ Symbols consist of a fixed-length record in the symbol table and a
+ variable-length name in the string table. The symbol table is an array of
+ <var class="Fa">nlist</var> structures:</p>
+<div class="Bd Pp Bd-indent Li">
+<pre>struct nlist {
+ union {
+ const char *n_name;
+ long n_strx;
+ } n_un;
+ unsigned char n_type;
+ char n_other;
+ short n_desc;
+ unsigned long n_value;
+};</pre>
+</div>
+<p class="Pp">The fields are used as follows:</p>
+<dl class="Bl-tag">
+ <dt><var class="Fa">n_un.n_strx</var></dt>
+ <dd>Contains a byte offset into the string table for the name of this symbol.
+ When a program accesses a symbol table with the <a class="Xr">nlist(3)</a>
+ function, this field is replaced with the
+ <var class="Fa">n_un.n_name</var> field, which is a pointer to the string
+ in memory.</dd>
+ <dt><var class="Fa">n_type</var></dt>
+ <dd>Used by the link editor to determine how to update the symbol's value. The
+ <var class="Fa">n_type</var> field is broken down into three sub-fields
+ using bitmasks. The link editor treats symbols with the
+ <code class="Dv">N_EXT</code> type bit set as &#x2018;external&#x2019;
+ symbols and permits references to them from other binary files. The
+ <code class="Dv">N_TYPE</code> mask selects bits of interest to the link
+ editor:
+ <dl class="Bl-tag">
+ <dt id="N_UNDF"><a class="permalink" href="#N_UNDF"><code class="Dv">N_UNDF</code></a></dt>
+ <dd>An undefined symbol. The link editor must locate an external symbol
+ with the same name in another binary file to determine the absolute
+ value of this symbol. As a special case, if the
+ <var class="Fa">n_value</var> field is nonzero and no binary file in
+ the link-edit defines this symbol, the link-editor will resolve this
+ symbol to an address in the bss segment, reserving an amount of bytes
+ equal to <var class="Fa">n_value</var>. If this symbol is undefined in
+ more than one binary file and the binary files do not agree on the
+ size, the link editor chooses the greatest size found across all
+ binaries.</dd>
+ <dt id="N_ABS"><a class="permalink" href="#N_ABS"><code class="Dv">N_ABS</code></a></dt>
+ <dd>An absolute symbol. The link editor does not update an absolute
+ symbol.</dd>
+ <dt id="N_TEXT"><a class="permalink" href="#N_TEXT"><code class="Dv">N_TEXT</code></a></dt>
+ <dd>A text symbol. This symbol's value is a text address and the link
+ editor will update it when it merges binary files.</dd>
+ <dt id="N_DATA"><a class="permalink" href="#N_DATA"><code class="Dv">N_DATA</code></a></dt>
+ <dd>A data symbol; similar to <code class="Dv">N_TEXT</code> but for data
+ addresses. The values for text and data symbols are not file offsets
+ but addresses; to recover the file offsets, it is necessary to
+ identify the loaded address of the beginning of the corresponding
+ section and subtract it, then add the offset of the section.</dd>
+ <dt id="N_BSS"><a class="permalink" href="#N_BSS"><code class="Dv">N_BSS</code></a></dt>
+ <dd>A bss symbol; like text or data symbols but has no corresponding
+ offset in the binary file.</dd>
+ <dt id="N_FN"><a class="permalink" href="#N_FN"><code class="Dv">N_FN</code></a></dt>
+ <dd>A filename symbol. The link editor inserts this symbol before the
+ other symbols from a binary file when merging binary files. The name
+ of the symbol is the filename given to the link editor, and its value
+ is the first text address from that binary file. Filename symbols are
+ not needed for link-editing or loading, but are useful for
+ debuggers.</dd>
+ </dl>
+ <p class="Pp">The <code class="Dv">N_STAB</code> mask selects bits of
+ interest to symbolic debuggers such as <a class="Xr">gdb(1)</a>
+ (<span class="Pa">ports/devel/gdb</span>); the values are described in
+ <a class="Xr">stab(5)</a>.</p>
+ </dd>
+ <dt><var class="Fa">n_other</var></dt>
+ <dd>This field provides information on the nature of the symbol independent of
+ the symbol's location in terms of segments as determined by the
+ <var class="Fa">n_type</var> field. Currently, the lower 4 bits of the
+ <var class="Fa">n_other</var> field hold one of two values:
+ <code class="Dv">AUX_FUNC</code> and <code class="Dv">AUX_OBJECT</code>
+ (see <code class="In">&lt;<a class="In">link.h</a>&gt;</code> for their
+ definitions). <code class="Dv">AUX_FUNC</code> associates the symbol with
+ a callable function, while <code class="Dv">AUX_OBJECT</code> associates
+ the symbol with data, irrespective of their locations in either the text
+ or the data segment. This field is intended to be used by
+ <a class="Xr">ld(1)</a> for the construction of dynamic executables.</dd>
+ <dt><var class="Fa">n_desc</var></dt>
+ <dd>Reserved for use by debuggers; passed untouched by the link editor.
+ Different debuggers use this field for different purposes.</dd>
+ <dt><var class="Fa">n_value</var></dt>
+ <dd>Contains the value of the symbol. For text, data and bss symbols, this is
+ an address; for other symbols (such as debugger symbols), the value may be
+ arbitrary.</dd>
+</dl>
+<p class="Pp" id="unsigned">The string table consists of an
+ <a class="permalink" href="#unsigned"><i class="Em">unsigned long</i></a>
+ length followed by null-terminated symbol strings. The length represents the
+ size of the entire table in bytes, so its minimum value (or the offset of
+ the first string) is always 4 on 32-bit machines.</p>
+</section>
+<section class="Sh">
+<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE
+ ALSO</a></h1>
+<p class="Pp"><a class="Xr">as(1)</a>, <a class="Xr">gdb(1)</a>
+ (<span class="Pa">ports/devel/gdb</span>), <a class="Xr">ld(1)</a>,
+ <a class="Xr">brk(2)</a>, <a class="Xr">execve(2)</a>,
+ <a class="Xr">nlist(3)</a>, <a class="Xr">core(5)</a>,
+ <a class="Xr">elf(5)</a>, <a class="Xr">link(5)</a>,
+ <a class="Xr">stab(5)</a></p>
+</section>
+<section class="Sh">
+<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1>
+<p class="Pp">The <code class="In">&lt;<a class="In">a.out.h</a>&gt;</code>
+ include file appeared in <span class="Ux">Version&#x00A0;7 AT&amp;T
+ UNIX</span>.</p>
+</section>
+<section class="Sh">
+<h1 class="Sh" id="BUGS"><a class="permalink" href="#BUGS">BUGS</a></h1>
+<p class="Pp">Since not all of the supported architectures use the
+ <var class="Fa">a_midmag</var> field, it can be difficult to determine what
+ architecture a binary will execute on without examining its actual machine
+ code. Even with a machine identifier, the byte order of the
+ <var class="Fa">exec</var> header is machine-dependent.</p>
+</section>
+</div>
+<table class="foot">
+ <tr>
+ <td class="foot-date">June 10, 2010</td>
+ <td class="foot-os">FreeBSD 15.0</td>
+ </tr>
+</table>