COMPAT_FREEBSD
option enabled.
A lot of programs are dynamically linked. This means, that you will
also need the
FreeBSD
shared libraries that the program depends on, and the runtime
linker. Also, you will need to create a
``shadow root''
directory for
FreeBSD
binaries on your
NetBSD
system. This directory
is named
/emul/freebsd
.
Any file operations done by
FreeBSD
programs run under
NetBSD
will look in this directory first.
So, if a
FreeBSD
program opens, for example,
/etc/passwd
,
NetBSD
will
first try to open
/emul/freebsd/etc/passwd
,
and if that does not exist open the
`real'
/etc/passwd
file.
It is recommended that you install
FreeBSD
packages that include configuration files, etc under
/emul/freebsd
,
to avoid naming conflicts with possible
NetBSD
counterparts. Shared
libraries should also be installed in the shadow tree.
Generally, you will need to look for the shared libraries that FreeBSD binaries depend on only the first few times that you install a FreeBSD program on your NetBSD system. After a while, you will have a sufficient set of FreeBSD shared libraries on your system to be able to run newly imported FreeBSD binaries without any extra work.
/usr/local/lib/SimCity/res/sim: -lXext.6 => /usr/X11R6/lib/libXext.so.6.0 (0x100c1000) -lX11.6 => /usr/X11R6/lib/libX11.so.6.0 (0x100c9000) -lc.2 => /usr/lib/libc.so.2.1 (0x10144000) -lm.2 => /usr/lib/libm.so.2.0 (0x101a7000) -lgcc.261 => /usr/lib/libgcc.so.261.0 (0x101bf000)
You would need go get all the files from the last column, and
put them under
/emul/freebsd
.
This means you eventually have these files on your
NetBSD
system:
/emul/freebsd/usr/X11R6/lib/libXext.so.6.0
/emul/freebsd/usr/X11R6/lib/libX11.so.6.0
/emul/freebsd/usr/lib/libc.so.2.1
/emul/freebsd/usr/lib/libm.so.2.0
/emul/freebsd/usr/lib/libgcc.so.261.0
Note that if you already have a FreeBSD shared library with a matching major revision number to the first column of the ldd output, you won't need to copy the file named in the last column to your system, the one you already have should work. It is advisable to copy the shared library anyway if it is a newer version, though. You can remove the old one. So, if you have these libraries on your system:
/emul/freebsd/usr/lib/libc.so.2.0
and you find that the ldd output for a new binary you want to install is:
-lc.2 => /usr/lib/libc.so.2.1 (0x10144000)
You won't need to worry about copying
/usr/lib/libc.so.2.1
too, because the program should work fine with the slightly older version.
You can decide to replace the libc.so anyway, and that should leave
you with:
/emul/freebsd/usr/lib/libc.so.2.1
Finally, you must make sure that you have the
FreeBSD
runtime linker and its config files on your system.
You should copy these files from the
FreeBSD
system to their appropriate place on your
NetBSD
system (in the
/emul/freebsd
tree):
usr/libexec/ld.so
var/run/ld.so.hints
Retrieve the following files (from _one_ ftp site to avoid
any version mismatches), and install them under
/emul/freebsd
(i.e.
foo/bar
is installed as
/emul/freebsd/foo/bar
):
sbin/ldconfig
usr/bin/ldd
usr/lib/libc.so.x.y.z
usr/libexec/ld.so
ldconfig
and
ldd
don't necessarily need to be under
/emul/freebsd
,
you can install them elsewhere in the system too. Just make sure
they don't conflict with their
NetBSD
counterparts.
A good idea would be to install them in
/usr/local/bin
as
ldconfig-freebsd
and
ldd-freebsd.
Run the
FreeBSD
ldconfig program with directory arguments in which the
FreeBSD
runtime linker should look for shared libs.
/usr/lib
are standard, you could run like the following:
Note that argument directories of ldconfig are
mapped to
/emul/freebsd/XXXX
by
NetBSD's
compat code, and should exist as such on your system.
Make sure
/emul/freebsd/var/run/ld.so.hints
is existing when you run
FreeBSD's
ldconfig, if not, you may lose
NetBSD's
/var/run/ld.so.hints
.
FreeBSD
ldconfig
should be statically
linked, so it doesn't need any shared libraries by itself.
It will create the file
/emul/freebsd/var/run/ld.so.hints
.
You should rerun the
FreeBSD
version of the ldconfig program each time you add a new shared library.
You should now be set up for FreeBSD binaries which only need a shared libc. You can test this by running the FreeBSD ldd on itself. Suppose that you have it installed as ldd-freebsd, it should produce something like:
/usr/local/bin/ldd-freebsd: -lc.2 => /usr/lib/libc.so.2.1 (0x1001a000)
This being done, you are ready to install new
FreeBSD
binaries.
Whenever you install a new
FreeBSD
program, you should check if it needs shared libraries, and if so,
whether you have them installed in the
/emul/freebsd
tree.
To do this, you run the
FreeBSD
version
ldd
on the new program, and watch its output.
ldd
(see also the manual page for
ldd(1))
will print a list
of shared libraries that the program depends on, in the
form -l<majorname> => <fullname>.
If it prints ``not found'' instead of <fullname> it means that you need an extra library. Which library this is, is shown in <majorname>, which will be of the form XXXX.<N> You will need to find a libXXXX.so.<N>.<mm> on a FreeBSD ftp site, and install it on your system. The XXXX (name) and <N> (major revision number) should match; the minor number(s) <mm> are less important, though it is advised to take the most recent version.
/dev/ttyv0
for ioctls. In this case, create a symbolic link from
/emul/freebsd/dev/ttyv0
to a
wscons(4)
device file like
/dev/ttyE0
.
You will need to have at least
options WSDISPLAY_COMPAT_SYSCONS
and probably also
options WSDISPLAY_COMPAT_USL
in your kernel (see
options(4)
and
wscons(4)).
The FreeBSD distribution is available on a lot of ftp sites. Sometimes the files are unpacked, and you can get the individual files you need, but mostly they are stored in distribution sets, usually consisting of subdirectories with gzipped tar files in them. The primary ftp sites for the distributions are:
ftp.freebsd.org:/pub/FreeBSD
Mirror sites are described on:
ftp.freebsd.org:/pub/FreeBSD/MIRROR.SITES
This distribution consists of a number of tar-ed and gzipped files, Normally, they're controlled by an install program, but you can retrieve files ``by hand'' too. The way to look something up is to retrieve all the files in the distribution, and ``tar ztvf'' through them for the file you need. Here is an example of a list of files that you might need.
Needed Files
ld.so 2.0-RELEASE/bindist/bindist.??
ldconfig 2.0-RELEASE/bindist/bindist.??
ldd 2.0-RELEASE/bindist/bindist.??
libc.so.2 2.0-RELEASE/bindist/bindist.??
libX11.so.6.0 2.0-RELEASE/XFree86-3.1/XFree86-3.1-bin.tar.gz
libX11.so.6.0 XFree86-3.1.1/X311bin.tgz
libXt.so.6.0 2.0-RELEASE/XFree86-3.1/XFree86-3.1-bin.tar.gz
libXt.so.6.0 XFree86-3.1.1/X311bin.tgz
The files called ``bindist.??'' are tar-ed, gzipped and split, so you can extract contents by ``cat bindist.?? | tar zpxf -''.
Extract the files from these gzipped tarfiles in your
/emul/freebsd
directory (possibly omitting or afterwards removing files you don't
need), and you are done.