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.
49 lines
1.4 KiB
C++
49 lines
1.4 KiB
C++
// Check that cross-DSO diagnostics print the names of both modules
|
|
|
|
// RUN: mkdir -p %t.dir && cd %t.dir
|
|
// RUN: %clangxx_cfi_diag -g -DSHARED_LIB -fPIC -shared -o %dynamiclib %s %ld_flags_rpath_so
|
|
// RUN: %clangxx_cfi_diag -g -o %t.dir/file_exe_suffix %s %ld_flags_rpath_exe
|
|
// RUN: %t.dir/file_exe_suffix 2>&1 | FileCheck -DDSONAME=%xdynamiclib_namespec %s
|
|
|
|
// UNSUPPORTED: target={{.*windows-msvc.*}}
|
|
// REQUIRES: cxxabi
|
|
|
|
#include <dlfcn.h>
|
|
#include <stdio.h>
|
|
|
|
struct S1 {
|
|
virtual void f1();
|
|
};
|
|
|
|
#ifdef SHARED_LIB
|
|
|
|
void S1::f1() {}
|
|
|
|
__attribute__((visibility("default"))) extern "C"
|
|
void* dso_symbol() { return new S1(); }
|
|
|
|
#else
|
|
|
|
int main() {
|
|
void* (*fp)(void) =
|
|
reinterpret_cast<void*(*)(void)>(dlsym(RTLD_DEFAULT, "dso_symbol"));
|
|
if (!fp) {
|
|
perror("failed to resolve dso_symbol");
|
|
return 1;
|
|
}
|
|
|
|
// CHECK: runtime error: control flow integrity check for type 'void *()' failed during indirect function call
|
|
// CHECK: dso_symbol defined here
|
|
// CHECK: check failed in {{.*}}_exe_suffix, destination function located in {{.*}}[[DSONAME]]
|
|
void *S = fp(); // trigger cfi-icall failure
|
|
|
|
// CHECK: runtime error: control flow integrity check for type 'S1' failed during cast to unrelated type
|
|
// CHECK: invalid vtable
|
|
// CHECK: check failed in {{.*}}_exe_suffix, vtable located in {{.*}}[[DSONAME]]
|
|
S1 *Scast = reinterpret_cast<S1*>(S); // trigger cfi-unrelated-cast failure
|
|
|
|
return 0;
|
|
}
|
|
|
|
#endif // SHARED_LIB
|