diff --git a/compiler-rt/test/msan/dladdr_test.c b/compiler-rt/test/msan/dladdr_test.c new file mode 100644 --- /dev/null +++ b/compiler-rt/test/msan/dladdr_test.c @@ -0,0 +1,47 @@ +/* RUN: %clang_msan -g %s -o %t + RUN: %clang_msan -g %s -DBUILD_SO -fPIC -o %t-so.so -shared + RUN: %run %t 2>&1 | FileCheck %s + + REQUIRES: glibc{{.*}} +*/ + +#define _GNU_SOURCE + +#ifndef BUILD_SO +#include +#include +#include +#include + +typedef volatile long *(* get_t)(); +get_t GetTls; + +int main(int argc, char *argv[]) { + char path[4096]; + snprintf(path, sizeof(path), "%s-so.so", argv[0]); + int i; + + void *handle = dlopen(path, RTLD_LAZY); + if (!handle) fprintf(stderr, "%s\n", dlerror()); + assert(handle != 0); + GetTls = (get_t)dlsym(handle, "GetTls"); + assert(dlerror() == 0); + + Dl_info info; + int ret = dladdr(GetTls, &info); + assert (ret != 0); + printf ("fname: %s\n", info.dli_fname); + printf ("fbase: %p\n", info.dli_fbase); + printf ("sname: %s\n", info.dli_sname); + printf ("saddr: %p\n", info.dli_saddr); + + // CHECK: sname: GetTls + + return 0; +} +#else // BUILD_SO +long var; +long *GetTls() { + return &var; +} +#endif