---
name: "aout"
section: "4"
platform: "freebsd"
package: "base"
version: "16.0-CURRENT-20261027-61c70dc16a79"
release: "FreeBSD 16.0-CURRENT (2026-10-27)"
platforms: ["freebsd"]
url: "https://new.carta.tech/aout"
---

# aout(4)

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

## NAME

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

## SYNOPSIS

```
kldload a.out
```

## DESCRIPTION

The [a.out(5)](/a.out/5.md) executable format was used before the release of FreeBSD 3.0. Since i386 was the only supported architecture at that time, [a.out(5)](/a.out/5.md) 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)](/kldload/8.md) utility in order to support the [a.out(5)](/a.out/5.md) image activator:

**kldload** **aout**

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

```
aout_load="YES"
```

The [a.out(5)](/a.out/5.md) 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 binaries.

The following [sysctl(8)](/sysctl/8.md) 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)](/wait/2.md) 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)](/mmap/2.md). 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.

## SEE ALSO

[execve(2)](/execve/2.md), [a.out(5)](/a.out/5.md), [elf(5)](/elf/5.md), [sysctl(8)](/sysctl/8.md)

## HISTORY

The [a.out(5)](/a.out/5.md) 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)](/elf/5.md).

## AUTHORS

The **aout** manual page was written by Konstantin Belousov ⟨*kib@FreeBSD.org*⟩.

## BUGS

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