diff options
-rw-r--r-- | compiler-rt/CMakeLists.txt | 1 | ||||
-rw-r--r-- | compiler-rt/lib/asan/lit_tests/TestCases/Linux/function-sections-are-bad.cc | 39 |
2 files changed, 40 insertions, 0 deletions
diff --git a/compiler-rt/CMakeLists.txt b/compiler-rt/CMakeLists.txt index 6ed042cb6ad..06c6880c6ab 100644 --- a/compiler-rt/CMakeLists.txt +++ b/compiler-rt/CMakeLists.txt @@ -142,6 +142,7 @@ if (NOT MSVC) -fno-stack-protector -Wno-gnu # Variadic macros with 0 arguments for ... -fvisibility=hidden + -fno-function-sections ) if (NOT COMPILER_RT_DEBUG) list(APPEND SANITIZER_COMMON_CFLAGS -O3) diff --git a/compiler-rt/lib/asan/lit_tests/TestCases/Linux/function-sections-are-bad.cc b/compiler-rt/lib/asan/lit_tests/TestCases/Linux/function-sections-are-bad.cc new file mode 100644 index 00000000000..cccd6ca1c52 --- /dev/null +++ b/compiler-rt/lib/asan/lit_tests/TestCases/Linux/function-sections-are-bad.cc @@ -0,0 +1,39 @@ +// Check that --gc-sections does not throw away (or localize) parts of sanitizer +// interface. +// RUN: %clang_asan -m64 %s -Wl,--gc-sections -o %t +// RUN: %clang_asan -m64 %s -DBUILD_SO -fPIC -o %t-so.so -shared +// RUN: %t 2>&1 + +#ifndef BUILD_SO +#include <assert.h> +#include <dlfcn.h> +#include <stdio.h> +#include <stdlib.h> + +int main(int argc, char *argv[]) { + char path[4096]; + snprintf(path, sizeof(path), "%s-so.so", argv[0]); + + void *handle = dlopen(path, RTLD_LAZY); + if (!handle) fprintf(stderr, "%s\n", dlerror()); + assert(handle != 0); + + typedef void (*F)(); + F f = (F)dlsym(handle, "call_rtl_from_dso"); + printf("%s\n", dlerror()); + assert(dlerror() == 0); + f(); + + dlclose(handle); + return 0; +} + +#else // BUILD_SO + +#include <sanitizer/msan_interface.h> +extern "C" void call_rtl_from_dso() { + volatile int32_t x; + volatile int32_t y = __sanitizer_unaligned_load32((void *)&x); +} + +#endif // BUILD_SO |