&linux; Binary CompatibilityJimMockRestructured and parts updated by Brian N.HandyOriginally contributed by RichMurpheySynopsisLinux binary compatibilitybinary compatibilityLinux&os; provides binary compatibility with &linux;,
allowing users to install and run most &linux; binaries
on a &os; system without having to first modify the binary. It
has even been reported that, in some situations, &linux;
binaries perform better on &os; than they do on &linux;.However, some &linux;-specific operating system features
are not supported under &os;. For example, &linux; binaries
will not work on &os; if they overly use &i386; specific calls,
such as enabling virtual 8086 mode.Support for 64-bit binary compatibility with &linux; was
added in &os; 10.3.After reading this chapter, you will know:How to enable &linux; binary compatibility on a &os;
system.How to install additional &linux; shared
libraries.How to install &linux; applications on a &os;
system.The implementation details of &linux; compatibility in
&os;.Before reading this chapter, you should:Know how to install additional
third-party software.Configuring &linux; Binary CompatibilityPorts CollectionBy default, &linux; libraries are not installed and &linux;
binary compatibility is not enabled. &linux; libraries can
either be installed manually or from the &os; Ports
Collection.Before attempting to build the port, load the &linux; kernel
module, otherwise the build will fail:&prompt.root; kldload linuxFor 64-bit compatibility:&prompt.root; kldload linux64To verify that the module is loaded:&prompt.user; kldstat
Id Refs Address Size Name
1 2 0xc0100000 16bdb8 kernel
7 1 0xc24db000 d000 linux.koThe emulators/linux_base-c6 package or
port is the easiest way to install a base set of &linux;
libraries and binaries on a &os; system. To install the
port:&prompt.root; printf "compat.linux.osrelease=2.6.18\n" >> /etc/sysctl.conf
&prompt.root; sysctl compat.linux.osrelease=2.6.18
&prompt.root; pkg install emulators/linux_base-c6For &linux; compatibility to be enabled at boot time,
add this line to /etc/rc.conf:linux_enable="YES"On 64-bit machines, /etc/rc.d/abi will
automatically load the module for 64-bit emulation.kernel optionsCOMPAT_LINUXUsers who prefer to statically link &linux; binary
compatibility into a custom kernel should add
options COMPAT_LINUX to their custom kernel
configuration file. Compile and install the new kernel as
described in .Installing Additional Libraries Manuallyshared librariesIf a &linux; application complains about missing shared
libraries after configuring &linux; binary compatibility,
determine which shared libraries the &linux; binary needs and
install them manually.From a &linux; system, ldd can be used
to determine which shared libraries the application needs.
For example, to check which shared libraries
linuxdoom needs, run this command from a
&linux; system that has Doom
installed:&prompt.user; ldd linuxdoom
libXt.so.3 (DLL Jump 3.1) => /usr/X11/lib/libXt.so.3.1.0
libX11.so.3 (DLL Jump 3.1) => /usr/X11/lib/libX11.so.3.1.0
libc.so.4 (DLL Jump 4.5pl26) => /lib/libc.so.4.6.29symbolic linksThen, copy all the files in the last column of the output
from the &linux; system into
/compat/linux on the &os; system. Once
copied, create symbolic links to the names in the first
column. This example will result in the following files on
the &os; system:/compat/linux/usr/X11/lib/libXt.so.3.1.0
/compat/linux/usr/X11/lib/libXt.so.3 -> libXt.so.3.1.0
/compat/linux/usr/X11/lib/libX11.so.3.1.0
/compat/linux/usr/X11/lib/libX11.so.3 -> libX11.so.3.1.0
/compat/linux/lib/libc.so.4.6.29
/compat/linux/lib/libc.so.4 -> libc.so.4.6.29If a &linux; shared library already exists with a
matching major revision number to the first column of the
ldd output, it does not need to be copied
to the file named in the last column, as the existing library
should work. It is advisable to copy the shared library if it
is a newer version, though. The old one can be removed, as
long as the symbolic link points to the new one.For example, these libraries already exist on the &os;
system:/compat/linux/lib/libc.so.4.6.27
/compat/linux/lib/libc.so.4 -> libc.so.4.6.27and ldd indicates that a binary
requires a later version:libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29Since the existing library is only one or two versions out
of date in the last digit, the program should still work with
the slightly older version. However, it is safe to replace
the existing libc.so with the newer
version:/compat/linux/lib/libc.so.4.6.29
/compat/linux/lib/libc.so.4 -> libc.so.4.6.29Generally, one will need to look for the shared libraries
that &linux; binaries depend on only the first few times that
a &linux; program is installed on &os;. After a while, there
will be a sufficient set of &linux; shared libraries on the
system to be able to run newly installed &linux; binaries
without any extra work.Installing &linux; ELF
BinariesLinuxELF binariesELF binaries sometimes require an extra
step. When an unbranded ELF binary is
executed, it will generate an error message:&prompt.user; ./my-linux-elf-binary
ELF binary type not known
AbortTo help the &os; kernel distinguish between a &os;
ELF binary and a &linux; binary, use
&man.brandelf.1;:&prompt.user; brandelf -t Linux my-linux-elf-binaryGNU toolchainSince the GNU toolchain places the appropriate branding
information into ELF binaries
automatically, this step is usually not necessary.Installing a &linux; RPM Based
ApplicationTo install a &linux; RPM-based
application, first install the
archivers/rpm4 package or port. Once
installed, root can
use this command to install a
.rpm:&prompt.root; cd /compat/linux
&prompt.root; rpm2cpio < /path/to/linux.archive.rpm | cpio -idIf necessary, brandelf the installed
ELF binaries. Note that this will prevent
a clean uninstall.Configuring the Hostname ResolverIf DNS does not work or this error
appears:resolv+: "bind" is an invalid keyword resolv+:
"hosts" is an invalid keywordconfigure /compat/linux/etc/host.conf
as follows:order hosts, bind
multi onThis specifies that /etc/hosts is
searched first and DNS is searched second.
When /compat/linux/etc/host.conf does not
exist, &linux; applications use
/etc/host.conf and complain about the
incompatible &os; syntax. Remove bind if a
name server is not configured using
/etc/resolv.conf.BorisHollasUpdated for Mathematica 5.X by Installing &mathematica;applicationsMathematicaThis section describes the process of installing the &linux;
version of &mathematica; 9.X onto a
&os; system. &mathematica; is a
commercial, computational software program used in scientific,
engineering, and mathematical fields. A 30 day trial version is
available for download from wolfram.com/mathematica.Running the &mathematica; InstallerBefore installing &mathematica;, make sure that the
textproc/linux-c6-aspell
package or port is installed and that the &man.linprocfs.5;
file system is mounted.&prompt.root; sysctl kern.fallback_elf_brand=3&os; will now assume that unbranded ELF binaries use the
&linux; ABI which should allow the
installer to execute from the CDROM.The downloaded file will be saved to
/tmp/Mathematica_9.0.1_LINUX.sh. Become
the superuser and run this installer file:&prompt.root; sh /tmp/Mathematica_9.0.1_LINUX.sh
Mathematica Secured 9.0.1 for LINUX Installer Archive
Verifying archive integrity.
Extracting installer. ...
Wolfram Mathematica 9 Installer
Copyright (c) 1988-2013 Wolfram Research, Inc. All rights reserved.
WARNING: Wolfram Mathematica is protected by copyright law and international treaties. Unauthorized
reproduction or distribution may result in severe civil and criminal
penalties and will be prosecuted to the maximum extent possible under law.
Enter the installation directory, or press ENTER to select /usr/local/Wolfram/Mathematica/9.0:
>
Now installing...
***********************
Installation complete.Running the &mathematica; Frontend over a Network&mathematica; uses some special
fonts to display characters not present in any of the standard
font sets. Xorg requires these
fonts to be installed locally. This means that these fonts
need to be copied from the CDROM or from a host with
&mathematica; installed to the
local machine. These fonts are normally stored in /cdrom/Unix/Files/SystemFiles/Fonts
on the CDROM, or /usr/local/mathematica/SystemFiles/Fonts
on the hard drive. The actual fonts are in the subdirectories
Type1 and
X. There are several
ways to use them, as described below.The first way is to copy the fonts into one of the
existing font directories in /usr/local/lib/X11/fonts then
running &man.mkfontdir.1; within the directory containing the
new fonts.The second way to do this is to copy the directories to
/usr/local/lib/X11/fonts:&prompt.root; cd /usr/local/lib/X11/fonts
&prompt.root; mkdir X
&prompt.root; mkdir MathType1
&prompt.root; cd /cdrom/Unix/Files/SystemFiles/Fonts
&prompt.root; cp X/* /usr/local/lib/X11/fonts/X
&prompt.root; cp Type1/* /usr/local/lib/X11/fonts/MathType1
&prompt.root; cd /usr/local/lib/X11/fonts/X
&prompt.root; mkfontdir
&prompt.root; cd ../MathType1
&prompt.root; mkfontdirNow add the new font directories to the font path:&prompt.root; xset fp+ /usr/local/lib/X11/fonts/X
&prompt.root; xset fp+ /usr/local/lib/X11/fonts/MathType1
&prompt.root; xset fp rehashWhen using the &xorg; server,
these font directories can be loaded automatically by adding
them to /etc/X11/xorg.conf.fontsIf /usr/local/lib/X11/fonts/Type1
does not already exist, change the name of the MathType1 directory in the
example above to Type1.
-->