{subsection: "Statically-Linked"}
 
-...
+Because the OS-provided information on (in-memory) segment boundaries is frequently (but inconsistently) wrong, the checkpointer must guess them.  Because it runs in the signal handler, it is impossibly tricky to handle segfaults; therefore, it must guess them correctly.  To make this possible, a standard universe application must keep all its voilatile data on the stack or in the .data segment, and it must be laid out in memory as follows.
+
+<html><pre>
+
+---------------
+| environment |
+|-------------| <- guessed; may be an unmapped page here
+|  the stack  |
+|             |
+|--\/\/\/\/\/-| <- guessed
+|             |
+|-/\/\/\/\/\--| <- sbrk
+|    .data    |
+|-------------|
+| .bss&.bzero |
+|-------------| <- _data_start (linker symbol)
+|    .text    |
+---------------
+
+</pre></html>
+
+This layout is known to Linux as the "vm compat" personality.  To force an application to run this way, you can use the _setarch_ program.  (To run a standard universe program in stand-alone mode, _setarch <arch> -L -B -R_.)  The standard universe starter will otherwise take care of this.
+
+These general requirements have some specific consequences:
+
+{subsubsection: No calls to mmap().}
+
+Because the kernel lies about segment boundaries, we can't permit calls to mmap().  (With one exception: requests for anonymous segments can be satisfied by sbrk().)  We can't just intercept calls to mmap() and record the results because _ldd_ has its own mmap() implementation.  This implies the following.
+
+{subsubsection: No dynamic linking.}
+
+Obvious, but also includes calls to dlopen().  This implies patches to Ulrich Drepper's glibc, because it likes to dlopen() libnss (to get different resolvers).  The patches allows glibc to be built entirely statically, but necessitate our own copy.
+
+{subsubsection: The gcc and g++ runtimes must also be static.}
+
+This is implied by the above, but worth calling out because it can require you to recompile the compiler.  Many distributions now have (optional) packages that include the static runtimes, instead.
+
+{subsubsection: "VM compat" layout.}
+
+As mentioned above, the application must be laid out in memory in a specific way; in particular, the .bss (and/or .bzero) segments must (directly) abut the .data segment.  This used to always be true; hence the 'compat' in the personality name.
+
+{subsubsection: No VA randomization or ExecShield.}
+
+Both virtual address randomization and ExecShield (which used to be but no longer are the same thing, apparently) screw up the required in-memory layout and can not be used.
+
+{subsubsection: Consistent .vdso section address.}
+
+The .vdso segment -- used by Linux to speed system calls -- is not checkpointed (being kernel memory space) but must be mapped at the exact same address on restart.
+
+{subsection: RPCs}