Compiling 32-bit programs on a 64-bit host (and cross-compilation in general) In theory, SymCC can use clang to cross-compile programs for any architecture that LLVM supports. Note, however, that this requires cross-compiling the symbolic backend and its dependencies as well, and then linking the right backend into the target programs. We currently provide automatic handling only for the common case of compiling 32-bit libraries and programs on a 64-bit host machine. In all other cases, we recommend building SymCC on the target machine, so that cross-compilation is not needed. Let's assume that you're running SymCC on a 64-bit x86 machine, wanting to create 32-bit binaries from some code under test. First of all, make sure that 32-bit versions of the backend's dependencies are available: LLVM (usually obtainable via packages of your Linux distribution) and Z3 (which is reasonably easy to build following its CMake instructions and exporting CFLAGS="-m32" and CXXFLAGS="-m32"). Beware of Z3 version 4.8.7 - it contains a bug that breaks the 32-bit build with an error related to "__builtin_ctz" (see https://github.com/Z3Prover/z3/issues/2727). If you build Z3 yourself, note that it is sufficient to point SymCC to the build directory - there is no need to install the 32-bit version of Z3 in your system. Once the dependencies for 32-bit SymCC are available (as well as the 64-bit dependencies mentioned in the main README), configure and build SymCC as usual but add "-DTARGET_32BIT=ON" to the CMake invocation. If the build system doesn't find your 32-bit versions of LLVM and Z3, and specify their locations with "-DLLVM_32BIT_DIR=/some/path" and "-DZ3_32BIT_DIR=/some/other/path", respectively - analogously to how you would hint at the 64-bit versions. The resulting "symcc" and "sym++" scripts work like regular SymCC, but they additionally understand the "-m32" switch, which tells Clang to build 32-bit artifacts. If you build anything with "-m32", SymCC will make sure that the 32-bit version of the symbolic backend is linked to it instead of the 64-bit variant that would normally be used. Note that, in order to compile C++ code with "sym++" in 32-bit mode, you also need to build a 32-bit version of libc++ (following the instructions for the 64-bit build from docs/C++.txt but additionally passing "-DLLVM_BUILD_32_BITS=ON" to CMake); communicate its location to SymCC via the environment variable SYMCC_LIBCXX_32BIT_PATH. If your 64-bit host is equipped to run 32-bit binaries, you can simply execute the instrumented programs produced by SymCC like any other program.