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).