Reid Kleckner c9d382b5a4 [msan] intercept dlopen and clear shadow for it
Summary:
The loader does not call mmap() through the PLT because it has to
bootstrap the process before libc is present.  Hooking dlopen() isn't
enough either because the loader runs module initializers before
returning, and they could run arbitrary msan instrumented code.

If msandr is present, then we can intercept the mmaps from dlopen at the
syscall layer and clear the shadow there.  If msandr is missing, we
clear the shadow after dlopen() and hope any initializers are trivial.

Reviewers: eugenis

CC: kcc, llvm-commits

Differential Revision: http://llvm-reviews.chandlerc.com/D509

llvm-svn: 176818
2013-03-11 18:07:42 +00:00
..

Experimental DynamoRIO-MSAN plugin (codename "MSanDR").
Supports Linux/x86_64 only.

Building:
  1. First, download and build DynamoRIO:
     (svn co https://dynamorio.googlecode.com/svn/trunk dr && \
      cd dr && mkdir build && cd build && \
      cmake -DDR_EXT_DRMGR_STATIC=ON -DDR_EXT_DRSYMS_STATIC=ON \
            -DDR_EXT_DRUTIL_STATIC=ON -DDR_EXT_DRWRAP_STATIC=ON .. && \
      make -j10 && make install)

  2. Download and build DrMemory (for DrSyscall extension)
     (svn co http://drmemory.googlecode.com/svn/trunk/ drmemory && \
      cd drmemory && mkdir build && cd build && \
      cmake -DDynamoRIO_DIR=`pwd`/../../dr/exports/cmake .. && \
      make -j10 && make install)

  NOTE: The line above will build a shared DrSyscall library in a non-standard
  location. This will require the use of LD_LIBRARY_PATH when running MSanDR.
  To build a static DrSyscall library (and link it into MSanDR), add
  -DDR_EXT_DRSYSCALL_STATIC=ON to the CMake invocation above, but
  beware: DrSyscall is LGPL.

  3. Now, build LLVM with two extra CMake flags:
       -DDynamoRIO_DIR=<path_to_dynamorio>/exports/cmake
       -DDrMemoryFramework_DIR=<path_to_drmemory>/exports64/drmf

  This will build a lib/clang/$VERSION/lib/linux/libclang_rt.msandr-x86_64.so

Running:
  <path_to_dynamorio>/exports/bin64/drrun -c lib/clang/$VERSION/lib/linux/libclang_rt.msandr-x86_64.so -- test_binary

MSan unit tests contain several tests for MSanDR (use MemorySanitizerDr.* gtest filter).