This reverts commit 05e31438ac.
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.1 KiB
C++
49 lines
1.1 KiB
C++
// RUN: mkdir -p %t.dir && cd %t.dir
|
|
// RUN: %clangxx -g -DSHARED_LIB %s -fPIC -shared -o %dynamiclib %ld_flags_rpath_so
|
|
// RUN: %clangxx_cfi_diag -g %s -o %t.dir/EXE %ld_flags_rpath_exe
|
|
// RUN: %run %t.dir/EXE 2>&1 | FileCheck %s
|
|
|
|
// REQUIRES: cxxabi
|
|
// UNSUPPORTED: target={{.*windows-msvc.*}}
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
struct A {
|
|
virtual void f();
|
|
};
|
|
|
|
void *create_B();
|
|
|
|
#ifdef SHARED_LIB
|
|
|
|
struct B {
|
|
virtual void f();
|
|
};
|
|
void B::f() {}
|
|
|
|
void *create_B() {
|
|
return (void *)(new B());
|
|
}
|
|
|
|
#else
|
|
|
|
void A::f() {}
|
|
|
|
int main(int argc, char *argv[]) {
|
|
void *p = create_B();
|
|
// CHECK: runtime error: control flow integrity check for type 'A' failed during cast to unrelated type
|
|
// CHECK: invalid vtable
|
|
// CHECK: check failed in {{.*}}, vtable located in {{.*}}libtarget_uninstrumented.cpp.dynamic.so
|
|
A *a = (A *)p;
|
|
memset(p, 0, sizeof(A));
|
|
|
|
// CHECK: runtime error: control flow integrity check for type 'A' failed during cast to unrelated type
|
|
// CHECK: invalid vtable
|
|
// CHECK: check failed in {{.*}}, vtable located in (unknown)
|
|
a = (A *)p;
|
|
// CHECK: done
|
|
fprintf(stderr, "done %p\n", a);
|
|
}
|
|
#endif
|