Aiden Grossman c12f08f645 Reapply "[compiler-rt] Remove %T from shared object substitutions (#155302)"
This reverts commit 05e31438ac9491cfc72c48664480796de874c860.

There was quite a bit of churn with this patch, everytime related to the executable
no longer being in the same directory as the shared objects. This reland ensures
that all of the executables in the tests touched are in the same directory as the
shared objects in the substitutions.
2025-09-21 19:49:08 +00:00

32 lines
1005 B
C++

// RUN: mkdir -p %t.dir && cd %t.dir
// RUN: %clangxx -DFUNC=zzzz %s -shared -o %dynamiclib -fPIC
// RUN: %clangxx_asan -DFUNC=main %s -o %t.dir/EXE %ld_flags_rpath_exe
// RUN: %run %t.dir/EXE
// GNU driver doesn't handle .so files properly.
// REQUIRES: Clang
// This test ensures that we call __asan_init early enough.
// We build a shared library w/o asan instrumentation
// and the binary with asan instrumentation.
// Both files include the same header (emulated by -DFUNC here)
// with C++ template magic which runs global initializer at library load time.
// The function get() is instrumented with asan, but called
// before the usual constructors are run.
// So, we must make sure that __asan_init is executed even earlier.
//
// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56393
struct A {
int foo() const { return 0; }
};
A get () { return A(); }
template <class> struct O {
static A const e;
};
template <class T> A const O <T>::e = get();
int FUNC() {
return O<int>::e.foo();
}