Provided by: freebsd-manpages_12.2-1_all bug


     aout — kernel support for executing binary files in legacy a.out format


           kldload a.out


     The a.out(5) executable format was used before the release of FreeBSD 3.0.  Since i386 was
     the only supported architecture at that time, a.out(5) executables can only be activated on
     platforms that support execution of i386 code, such as i386 and amd64.

     To add kernel support for old syscalls and old syscall invocation methods, place the
     following options in the kernel configuration file:

           options COMPAT_43
           options COMPAT_FREEBSD32

     The COMPAT_FREEBSD32 option is only required on 64-bit CPU architectures.

     The aout.ko module needs to be loaded with the kldload(8) utility in order to support the
     a.out(5) image activator:

           kldload aout

     Alternatively, to load the module at boot time, place the following line in loader.conf(5):


     The a.out(5) format was mainstream quite a long time ago.  Reasonable default settings and
     security requirements of modern operating systems today contradict the default environment
     of that time and require adjustments of the system to mimic natural environment for old

     The following sysctl(8) tunables are useful for this:

           security.bsd.map_at_zero   Set to 1 to allow mapping of process pages at address 0.
                                      Some very old ZMAGIC executable images require text mapping
                                      at address 0.

           kern.pid_max               Old versions of FreeBSD used signed 16-bit type for pid_t.
                                      Current kernels use 32-bit type for pid_t, and allow
                                      process id's up to 99999.  Such values cannot be
                                      represented by old pid_t, mostly causing issues for
                                      processes using wait(2) syscalls, for example shells.  Set
                                      the sysctl to 30000 to work around the problem.

           kern.elf32.read_exec       Set to 1 to force any accessible memory mapping performed
                                      by 32-bit process to allow execution, see mmap(2).  Old
                                      i386 CPUs did not have a bit in PTE which disallowed
                                      execution from the page, so many old programs did not
                                      specify PROT_EXEC even for mapping of executable code.  The
                                      sysctl forces PROT_EXEC if mapping has any access allowed
                                      at all.  The setting is only needed if the host
                                      architecture allows non-executable mappings.


     execve(2), a.out(5), elf(5), sysctl(8)


     The a.out(5) executable format was used on ancient AT&T UNIX and served as the main
     executable format for FreeBSD from the beginning up to FreeBSD 2.2.9.  In FreeBSD 3.0 it was
     superseded by elf(5).


     The aout manual page was written by Konstantin Belousov <>.


     On 64bit architectures, not all wrappers for older syscalls are implemented.