Build address sanitizer
This commit is contained in:
1 parent
6d7cef9e9e
commit
a38e52fff5
6 files changed
+87
-8
No files matched your search
@@ -43,6 +43,11 @@ COPY build-libcxx.sh merge-archives.sh ./
|
|||||||
RUN ./build-libcxx.sh $TOOLCHAIN_PREFIX && \
|
RUN ./build-libcxx.sh $TOOLCHAIN_PREFIX && \
|
||||||
rm -rf /build
|
rm -rf /build
|
||||||
|
|
||||||
|
# Build sanitizers
|
||||||
|
COPY build-compiler-rt.sh .
|
||||||
|
RUN ./build-compiler-rt.sh $TOOLCHAIN_PREFIX --build-sanitizers && \
|
||||||
|
rm -rf /build
|
||||||
|
|
||||||
# Build libssp
|
# Build libssp
|
||||||
COPY build-libssp.sh libssp-Makefile ./
|
COPY build-libssp.sh libssp-Makefile ./
|
||||||
RUN ./build-libssp.sh $TOOLCHAIN_PREFIX && \
|
RUN ./build-libssp.sh $TOOLCHAIN_PREFIX && \
|
||||||
|
|||||||
@@ -83,6 +83,25 @@ RUN cd test && \
|
|||||||
done; \
|
done; \
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# Build sanitizers. Ubsan includes <typeinfo> from the C++ headers, so
|
||||||
|
# we need to build this after libcxx.
|
||||||
|
RUN ./build-compiler-rt.sh $TOOLCHAIN_PREFIX --build-sanitizers
|
||||||
|
|
||||||
|
# Sanitizers on windows only support x86.
|
||||||
|
RUN cd test && \
|
||||||
|
for arch in $TOOLCHAIN_ARCHS; do \
|
||||||
|
case $arch in \
|
||||||
|
i686|x86_64) \
|
||||||
|
;; \
|
||||||
|
*) \
|
||||||
|
continue \
|
||||||
|
;; \
|
||||||
|
esac && \
|
||||||
|
for test in stacksmash; do \
|
||||||
|
$arch-w64-mingw32-clang $test.c -o $arch/$test-asan.exe -fsanitize=address -g -gcodeview -Wl,-pdb,$arch/$test-asan.pdb || exit 1; \
|
||||||
|
done; \
|
||||||
|
done
|
||||||
|
|
||||||
# Build libssp
|
# Build libssp
|
||||||
COPY build-libssp.sh libssp-Makefile ./
|
COPY build-libssp.sh libssp-Makefile ./
|
||||||
RUN ./build-libssp.sh $TOOLCHAIN_PREFIX
|
RUN ./build-libssp.sh $TOOLCHAIN_PREFIX
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ Benefits of a LLVM based MinGW toolchain are:
|
|||||||
armv7 and arm64) instead of separate compiler binaries for each
|
armv7 and arm64) instead of separate compiler binaries for each
|
||||||
architecture
|
architecture
|
||||||
- Support for generating debug info in PDB format
|
- Support for generating debug info in PDB format
|
||||||
|
- Support for Address Sanitizer
|
||||||
|
|
||||||
Clang on its own can also be used as compiler in the normal GNU binutils
|
Clang on its own can also be used as compiler in the normal GNU binutils
|
||||||
based environments though, so the main difference lies in replacing
|
based environments though, so the main difference lies in replacing
|
||||||
@@ -80,6 +81,9 @@ normal GCC/binutils based MinGW.
|
|||||||
variables.
|
variables.
|
||||||
- The runtime libraries libunwind, libcxxabi and libcxx also assume that the
|
- The runtime libraries libunwind, libcxxabi and libcxx also assume that the
|
||||||
target is Vista or newer.
|
target is Vista or newer.
|
||||||
|
- Address Sanitizer doesn't produce working backtraces for i686. Address
|
||||||
|
Sanitizer requires using a PDB file for symbolizing the error location and
|
||||||
|
backtraces.
|
||||||
|
|
||||||
Additionally, one may run into other minor differences between GCC and clang.
|
Additionally, one may run into other minor differences between GCC and clang.
|
||||||
|
|
||||||
|
|||||||
@@ -14,4 +14,5 @@ PREFIX="$1"
|
|||||||
./build-compiler-rt.sh $PREFIX
|
./build-compiler-rt.sh $PREFIX
|
||||||
./build-mingw-w64-libraries.sh $PREFIX
|
./build-mingw-w64-libraries.sh $PREFIX
|
||||||
./build-libcxx.sh $PREFIX
|
./build-libcxx.sh $PREFIX
|
||||||
|
./build-compiler-rt.sh $PREFIX --build-sanitizers
|
||||||
./build-libssp.sh $PREFIX
|
./build-libssp.sh $PREFIX
|
||||||
+40
-7
@@ -2,11 +2,23 @@
|
|||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
if [ $# -lt 1 ]; then
|
SRC_DIR=../lib/builtins
|
||||||
echo $0 dest
|
BUILD_SUFFIX=
|
||||||
|
|
||||||
|
while [ $# -gt 0 ]; do
|
||||||
|
if [ "$1" = "--build-sanitizers" ]; then
|
||||||
|
SRC_DIR=..
|
||||||
|
BUILD_SUFFIX=-sanitizers
|
||||||
|
SANITIZERS=1
|
||||||
|
else
|
||||||
|
PREFIX="$1"
|
||||||
|
fi
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
if [ -z "$PREFIX" ]; then
|
||||||
|
echo $0 [--build-sanitizers] dest
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
PREFIX="$1"
|
|
||||||
export PATH=$PREFIX/bin:$PATH
|
export PATH=$PREFIX/bin:$PATH
|
||||||
|
|
||||||
: ${CORES:=4}
|
: ${CORES:=4}
|
||||||
@@ -34,6 +46,16 @@ fi
|
|||||||
for arch in $ARCHS; do
|
for arch in $ARCHS; do
|
||||||
buildarchname=$arch
|
buildarchname=$arch
|
||||||
libarchname=$arch
|
libarchname=$arch
|
||||||
|
if [ -n "$SANITIZERS" ]; then
|
||||||
|
case $arch in
|
||||||
|
i686|x86_64)
|
||||||
|
# Sanitizers on windows only support x86.
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
continue
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
case $arch in
|
case $arch in
|
||||||
armv7)
|
armv7)
|
||||||
libarchname=arm
|
libarchname=arm
|
||||||
@@ -43,20 +65,31 @@ for arch in $ARCHS; do
|
|||||||
libarchname=i386
|
libarchname=i386
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
mkdir -p build-$arch
|
mkdir -p build-$arch$BUILD_SUFFIX
|
||||||
cd build-$arch
|
cd build-$arch$BUILD_SUFFIX
|
||||||
cmake \
|
cmake \
|
||||||
-DCMAKE_BUILD_TYPE=Release \
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
-DCMAKE_C_COMPILER=$arch-w64-mingw32-clang \
|
-DCMAKE_C_COMPILER=$arch-w64-mingw32-clang \
|
||||||
|
-DCMAKE_CXX_COMPILER=$arch-w64-mingw32-clang++ \
|
||||||
-DCMAKE_SYSTEM_NAME=Windows \
|
-DCMAKE_SYSTEM_NAME=Windows \
|
||||||
-DCMAKE_AR=$PREFIX/bin/llvm-ar \
|
-DCMAKE_AR=$PREFIX/bin/llvm-ar \
|
||||||
-DCMAKE_RANLIB=$PREFIX/bin/llvm-ranlib \
|
-DCMAKE_RANLIB=$PREFIX/bin/llvm-ranlib \
|
||||||
-DCMAKE_C_COMPILER_WORKS=1 \
|
-DCMAKE_C_COMPILER_WORKS=1 \
|
||||||
|
-DCMAKE_CXX_COMPILER_WORKS=1 \
|
||||||
-DCMAKE_C_COMPILER_TARGET=$buildarchname-windows-gnu \
|
-DCMAKE_C_COMPILER_TARGET=$buildarchname-windows-gnu \
|
||||||
-DCOMPILER_RT_DEFAULT_TARGET_ONLY=TRUE \
|
-DCOMPILER_RT_DEFAULT_TARGET_ONLY=TRUE \
|
||||||
../lib/builtins
|
-DCOMPILER_RT_USE_BUILTINS_LIBRARY=TRUE \
|
||||||
|
$SRC_DIR
|
||||||
make -j$CORES
|
make -j$CORES
|
||||||
mkdir -p $PREFIX/lib/clang/$CLANG_VERSION/lib/windows
|
mkdir -p $PREFIX/lib/clang/$CLANG_VERSION/lib/windows
|
||||||
cp lib/windows/libclang_rt.builtins-$buildarchname.a $PREFIX/lib/clang/$CLANG_VERSION/lib/windows/libclang_rt.builtins-$libarchname.a
|
mkdir -p $PREFIX/$arch-w64-mingw32/bin
|
||||||
|
for i in lib/windows/libclang_rt.*-$buildarchname*.a; do
|
||||||
|
cp $i $PREFIX/lib/clang/$CLANG_VERSION/lib/windows/$(basename $i | sed s/$buildarchname/$libarchname/)
|
||||||
|
done
|
||||||
|
for i in lib/windows/libclang_rt.*-$buildarchname*.dll; do
|
||||||
|
if [ -f $i ]; then
|
||||||
|
cp $i $PREFIX/$arch-w64-mingw32/bin
|
||||||
|
fi
|
||||||
|
done
|
||||||
cd ..
|
cd ..
|
||||||
done
|
done
|
||||||
+18
-1
@@ -19,6 +19,7 @@ TESTS_C_NO_BUILTIN="crt-test"
|
|||||||
TESTS_CPP="hello-cpp hello-exception tlstest-main exception-locale"
|
TESTS_CPP="hello-cpp hello-exception tlstest-main exception-locale"
|
||||||
TESTS_CPP_DLL="tlstest-lib"
|
TESTS_CPP_DLL="tlstest-lib"
|
||||||
TESTS_SSP="stacksmash"
|
TESTS_SSP="stacksmash"
|
||||||
|
TESTS_ASAN="stacksmash"
|
||||||
for arch in $ARCHS; do
|
for arch in $ARCHS; do
|
||||||
mkdir -p $arch
|
mkdir -p $arch
|
||||||
for test in $TESTS_C; do
|
for test in $TESTS_C; do
|
||||||
@@ -44,6 +45,18 @@ for arch in $ARCHS; do
|
|||||||
for test in $TESTS_SSP; do
|
for test in $TESTS_SSP; do
|
||||||
$arch-w64-mingw32-clang $test.c -o $arch/$test.exe -fstack-protector-strong
|
$arch-w64-mingw32-clang $test.c -o $arch/$test.exe -fstack-protector-strong
|
||||||
done
|
done
|
||||||
|
# These aren't run, since asan doesn't work within wine.
|
||||||
|
for test in $TESTS_ASAN; do
|
||||||
|
case $arch in
|
||||||
|
i686|x86_64)
|
||||||
|
# Sanitizers on windows only support x86.
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
continue
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
$arch-w64-mingw32-clang $test.c -o $arch/$test-asan.exe -fsanitize=address -g -gcodeview -Wl,-pdb,$arch/$test-asan.pdb
|
||||||
|
done
|
||||||
DLL="$TESTS_C_DLL $TESTS_CPP_DLL"
|
DLL="$TESTS_C_DLL $TESTS_CPP_DLL"
|
||||||
case $arch in
|
case $arch in
|
||||||
i686|x86_64)
|
i686|x86_64)
|
||||||
@@ -59,7 +72,11 @@ for arch in $ARCHS; do
|
|||||||
COPY="$COPY_AARCH64"
|
COPY="$COPY_AARCH64"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
for i in libc++ libunwind libssp-0; do
|
compiler_rt_arch=$arch
|
||||||
|
if [ "$arch" = "i686" ]; then
|
||||||
|
compiler_rt_arch=i386
|
||||||
|
fi
|
||||||
|
for i in libc++ libunwind libssp-0 libclang_rt.asan_dynamic-$compiler_rt_arch; do
|
||||||
if [ -f $PREFIX/$arch-w64-mingw32/bin/$i.dll ]; then
|
if [ -f $PREFIX/$arch-w64-mingw32/bin/$i.dll ]; then
|
||||||
cp $PREFIX/$arch-w64-mingw32/bin/$i.dll $arch
|
cp $PREFIX/$arch-w64-mingw32/bin/$i.dll $arch
|
||||||
DLL="$DLL $i"
|
DLL="$DLL $i"
|
||||||
|
|||||||
Reference in new issue
Block a user