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