1 // RUN: %clangxx_tsan -O1 %s -DBUILD_SO -fPIC -shared -o %t-so.so 2 // RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s 3 4 // Test case for 5 // https://github.com/google/sanitizers/issues/487 6 7 #ifdef BUILD_SO 8 9 #include <stdio.h> 10 11 extern "C" sofunc()12void sofunc() { 13 fprintf(stderr, "HELLO FROM SO\n"); 14 } 15 16 #else // BUILD_SO 17 18 #include <dlfcn.h> 19 #include <stdio.h> 20 #include <stddef.h> 21 #include <unistd.h> 22 #include <string> 23 24 void *lib; 25 void *lib2; 26 27 struct Closer { ~CloserCloser28 ~Closer() { 29 dlclose(lib); 30 fprintf(stderr, "CLOSED SO\n"); 31 } 32 }; 33 static Closer c; 34 main(int argc,char * argv[])35int main(int argc, char *argv[]) { 36 lib = dlopen((std::string(argv[0]) + std::string("-so.so")).c_str(), 37 RTLD_NOW|RTLD_NODELETE); 38 if (lib == 0) { 39 printf("error in dlopen: %s\n", dlerror()); 40 return 1; 41 } 42 void *f = dlsym(lib, "sofunc"); 43 if (f == 0) { 44 printf("error in dlsym: %s\n", dlerror()); 45 return 1; 46 } 47 ((void(*)())f)(); 48 return 0; 49 } 50 51 #endif // BUILD_SO 52 53 // CHECK: HELLO FROM SO 54 // CHECK-NOT: Inconsistency detected by ld.so 55 // CHECK: CLOSED SO 56 57