Linking of SML/NJ programs involves executing the code of each of the
concerned compilation units. The code of each compilation unit is
technically a closed function; all its imports have been turned into
arguments and all exports have been turned into return values.

For ordinary programs, this process is under control of CM; CM will
take care of properly passing the exports of one compilation unit to
the imports of the next.

When booting a stand-alone program, though, there is no CM available
yet. Thus, executing module-level code and passing exports to imports
has to be done by the (bare) runtime system. The runtime system
understands enough about the layout of binfiles and library files so
that it can do that--provided there is a special bootlist
file that contains instructions about which modules to load in what
order.

The bootlist mechanism is not restricted to building SML/NJ. Ordinary
ML code can also be turned into stand-alone programs, and as far as the
runtime system is concerned, the mechanisms are the same. The
bootlist file used by such ordinary stand-alone ML programs will be
constructed by CM; only in the case of bootstrapping SML/NJ itself it
will be constructed by CMB.

The name of the bootlist file is BOOTLIST, and it is located at
the root of the directory tree that contains stable files (i.e., its
name is .boot. arch- os/BOOTLIST).