1dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov// Regression test for
2dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov// https://code.google.com/p/address-sanitizer/issues/detail?id=178
3dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov
46efa4d6cf9bb214a5e8ddbb224a69b38c4ae6de6Alexey Samsonov// RUN: %clangxx_asan -O0 %p/SharedLibs/init-order-dlopen-so.cc \
5dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov// RUN:     -fPIC -shared -o %t-so.so
631750e3acce47343329e9b930d50a5f38d159edfAlexander Potapenko// If the linker doesn't support --export-dynamic (which is ELF-specific),
731750e3acce47343329e9b930d50a5f38d159edfAlexander Potapenko// try to link without that option.
831750e3acce47343329e9b930d50a5f38d159edfAlexander Potapenko// FIXME: find a better solution.
96efa4d6cf9bb214a5e8ddbb224a69b38c4ae6de6Alexey Samsonov// RUN: %clangxx_asan -O0 %s -o %t -Wl,--export-dynamic || \
106efa4d6cf9bb214a5e8ddbb224a69b38c4ae6de6Alexey Samsonov// RUN:     %clangxx_asan -O0 %s -o %t
11bdd0966deb04068ea94cf416c7fb46516013bd26Alexey Samsonov// RUN: ASAN_OPTIONS=check_initialization_order=true:strict_init_order=true %t 2>&1 | FileCheck %s
12dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov#include <dlfcn.h>
13dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov#include <pthread.h>
14dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov#include <stdio.h>
1564544c1093e2a911af0df20c60bd16ff90b4018cAlexey Samsonov#include <unistd.h>
16dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov
17dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov#include <string>
18dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov
19dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonovusing std::string;
20dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov
21dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonovint foo() {
22dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov  return 42;
23dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov}
24dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonovint global = foo();
25dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov
26dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov__attribute__((visibility("default")))
27dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonovvoid inc_global() {
28dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov  global++;
29dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov}
30dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov
31dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonovvoid *global_poller(void *arg) {
32dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov  while (true) {
33dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov    if (global != 42)
34dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov      break;
35dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov    usleep(100);
36dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov  }
37dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov  return 0;
38dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov}
39dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov
40dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonovint main(int argc, char *argv[]) {
41dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov  pthread_t p;
42dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov  pthread_create(&p, 0, global_poller, 0);
43dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov  string path = string(argv[0]) + "-so.so";
44dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov  if (0 == dlopen(path.c_str(), RTLD_NOW)) {
45dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov    fprintf(stderr, "dlerror: %s\n", dlerror());
46dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov    return 1;
47dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov  }
48dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov  pthread_join(p, 0);
49dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov  printf("PASSED\n");
50dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov  // CHECK: PASSED
51dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov  return 0;
52dfeef67b23ba92bbee598293164ee20078f633a1Alexey Samsonov}
53