Copyright (c) 2012 Konstantin Belousov <kib@FreeBSD.org> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or o...
NAMEaout - kernel support for executing binary files in legacy a.out format
DESCRIPTIONThe a.out5 executable format was used before the release of Fx 3.0 . Since i386 was the only supported architecture at that time, a.out5 executables can only be activated on platforms that support execution of i386 code, such as i386, amd64 and (partially) ia64.
To add kernel support for old syscalls and old syscall invocation methods, place the following options in the kernel configuration file:
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.out5 image activator:
Alternatively, to load the module at boot time, place the following line in loader.conf5:
The a.out5 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) tunables are useful for this:
- Set to 1 to allow mapping of process pages at address 0. Some very old ZMAGIC executable images require text mapping at address 0.
- Old versions of Fx used signed 16-bit type for Vt pid_t . Current kernels use 32-bit type for Vt pid_t , and allow process id's up to 99999. Such values cannot be represented by old Vt pid_t , mostly causing issues for processes using wait(2) syscalls, for example shells. Set the sysctl to 30000 to work around the problem.
- 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.