1*7c3d14c8STreehugger Robot // Check that --gc-sections does not throw away (or localize) parts of sanitizer
2*7c3d14c8STreehugger Robot // interface.
3*7c3d14c8STreehugger Robot // RUN: %clang_asan %s -Wl,--gc-sections -ldl -o %t
4*7c3d14c8STreehugger Robot // RUN: %clang_asan %s -DBUILD_SO -fPIC -o %t-so.so -shared
5*7c3d14c8STreehugger Robot // RUN: %run %t 2>&1
6*7c3d14c8STreehugger Robot
7*7c3d14c8STreehugger Robot // REQUIRES: asan-64-bits
8*7c3d14c8STreehugger Robot
9*7c3d14c8STreehugger Robot #ifndef BUILD_SO
10*7c3d14c8STreehugger Robot #include <assert.h>
11*7c3d14c8STreehugger Robot #include <dlfcn.h>
12*7c3d14c8STreehugger Robot #include <stdio.h>
13*7c3d14c8STreehugger Robot #include <stdlib.h>
14*7c3d14c8STreehugger Robot
main(int argc,char * argv[])15*7c3d14c8STreehugger Robot int main(int argc, char *argv[]) {
16*7c3d14c8STreehugger Robot char path[4096];
17*7c3d14c8STreehugger Robot snprintf(path, sizeof(path), "%s-so.so", argv[0]);
18*7c3d14c8STreehugger Robot
19*7c3d14c8STreehugger Robot void *handle = dlopen(path, RTLD_LAZY);
20*7c3d14c8STreehugger Robot if (!handle) fprintf(stderr, "%s\n", dlerror());
21*7c3d14c8STreehugger Robot assert(handle != 0);
22*7c3d14c8STreehugger Robot
23*7c3d14c8STreehugger Robot typedef void (*F)();
24*7c3d14c8STreehugger Robot F f = (F)dlsym(handle, "call_rtl_from_dso");
25*7c3d14c8STreehugger Robot printf("%s\n", dlerror());
26*7c3d14c8STreehugger Robot assert(dlerror() == 0);
27*7c3d14c8STreehugger Robot f();
28*7c3d14c8STreehugger Robot
29*7c3d14c8STreehugger Robot dlclose(handle);
30*7c3d14c8STreehugger Robot return 0;
31*7c3d14c8STreehugger Robot }
32*7c3d14c8STreehugger Robot
33*7c3d14c8STreehugger Robot #else // BUILD_SO
34*7c3d14c8STreehugger Robot
35*7c3d14c8STreehugger Robot #include <sanitizer/asan_interface.h>
call_rtl_from_dso()36*7c3d14c8STreehugger Robot extern "C" void call_rtl_from_dso() {
37*7c3d14c8STreehugger Robot volatile int32_t x;
38*7c3d14c8STreehugger Robot volatile int32_t y = __sanitizer_unaligned_load32((void *)&x);
39*7c3d14c8STreehugger Robot }
40*7c3d14c8STreehugger Robot
41*7c3d14c8STreehugger Robot #endif // BUILD_SO
42