145
|
1 // Copyright (C) 2012-2020 Free Software Foundation, Inc.
|
111
|
2 //
|
|
3 // This file is part of the GNU ISO C++ Library. This library is free
|
|
4 // software; you can redistribute it and/or modify it under the
|
|
5 // terms of the GNU General Public License as published by the
|
|
6 // Free Software Foundation; either version 3, or (at your option)
|
|
7 // any later version.
|
|
8
|
|
9 // This library is distributed in the hope that it will be useful,
|
|
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
12 // GNU General Public License for more details.
|
|
13
|
|
14 // Under Section 7 of GPL version 3, you are granted additional
|
|
15 // permissions described in the GCC Runtime Library Exception, version
|
|
16 // 3.1, as published by the Free Software Foundation.
|
|
17
|
|
18 // You should have received a copy of the GNU General Public License and
|
|
19 // a copy of the GCC Runtime Library Exception along with this program;
|
|
20 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
|
21 // <http://www.gnu.org/licenses/>.
|
|
22
|
|
23 /* This is part of the vtable verification runtime library. For more
|
|
24 information about this feature, see the comments in libvtv/vtv_rts.cc. */
|
|
25
|
|
26 /* The functions in this file are used to create the libvtv_stubs
|
|
27 library, as part of the vtable verification feature. When building
|
|
28 a binary without vtable verification, and linking it with a
|
|
29 (possibly pre-built third-party) library that was built with
|
|
30 verification, it is possible that vtable verification will fail due
|
|
31 to incomplete data (rather than due to corrupt vtable pointers). In
|
|
32 this case we need to give programmers a way of turning off the
|
|
33 vtable verification in their libraries. They can do so by linking
|
|
34 with the libvtv_stubs library, which (as you can see) will replace
|
|
35 the real verification functions with a set of functions that do
|
|
36 nothing (so no more verification failures/aborts). */
|
|
37
|
|
38 #include <cstddef>
|
|
39
|
|
40 /* weak symbols on Windows work differently than on Linux. To be able
|
|
41 to switch vtv on and off on Windows two dlls are built. One with
|
|
42 the sources from libvtv, the other from these stubs. Depending on
|
|
43 which dll is placed in the folder of the executable the functions
|
|
44 from libvtv or the stubs functions are used. */
|
|
45 #if defined (__CYGWIN__) || defined (__MINGW32__)
|
|
46 extern "C"
|
|
47 void
|
|
48 __VLTChangePermission(int);
|
|
49
|
|
50 void
|
|
51 __VLTRegisterSet(void**, const void*, std::size_t, std::size_t,
|
|
52 void**);
|
|
53
|
|
54 void
|
|
55 __VLTRegisterPair(void**, const void*, std::size_t,
|
|
56 const void*);
|
|
57
|
|
58 const void*
|
|
59 __VLTVerifyVtablePointer(void**, const void*);
|
|
60
|
|
61 void
|
|
62 __VLTRegisterSetDebug(void**, const void*, std::size_t, std::size_t,
|
|
63 void**);
|
|
64
|
|
65 void
|
|
66 __VLTRegisterPairDebug(void**, const void*, std::size_t, const void*,
|
|
67 const char*, const char*);
|
|
68
|
|
69 const void*
|
|
70 __VLTVerifyVtablePointerDebug(void**, const void*, const char*,
|
|
71 const char*);
|
|
72 #else
|
|
73 // Declare as weak for libsupc++, strong definitions are in libvtv.
|
|
74 #if __GXX_WEAK__
|
|
75 extern "C"
|
|
76 void
|
|
77 __VLTChangePermission(int) __attribute__((weak));
|
|
78
|
|
79 void
|
|
80 __VLTRegisterSet(void**, const void*, std::size_t, std::size_t,
|
|
81 void**) __attribute__((weak));
|
|
82
|
|
83 void
|
|
84 __VLTRegisterPair(void**, const void*, std::size_t,
|
|
85 const void*) __attribute__((weak));
|
|
86
|
|
87 const void*
|
|
88 __VLTVerifyVtablePointer(void**, const void*) __attribute__((weak));
|
|
89
|
|
90 void
|
|
91 __VLTRegisterSetDebug(void**, const void*, std::size_t, std::size_t,
|
|
92 void**) __attribute__((weak));
|
|
93
|
|
94 void
|
|
95 __VLTRegisterPairDebug(void**, const void*, std::size_t, const void*,
|
|
96 const char*, const char*) __attribute__((weak));
|
|
97
|
|
98 const void*
|
|
99 __VLTVerifyVtablePointerDebug(void**, const void*, const char*,
|
|
100 const char*) __attribute__((weak));
|
|
101 #endif
|
|
102 #endif
|
|
103
|
|
104 // Stub definitions.
|
|
105 extern "C"
|
|
106 void
|
|
107 __VLTChangePermission(int)
|
|
108 { }
|
|
109
|
|
110 void
|
|
111 __VLTRegisterSet(void**, const void*, std::size_t, std::size_t, void**)
|
|
112 { }
|
|
113
|
|
114 void
|
|
115 __VLTRegisterPair(void**, const void*, std::size_t, const void*)
|
|
116 { }
|
|
117
|
|
118 const void*
|
|
119 __VLTVerifyVtablePointer(void**, const void* vtable_ptr)
|
|
120 { return vtable_ptr; }
|
|
121
|
|
122 void
|
|
123 __VLTRegisterSetDebug(void**, const void*, std::size_t, std::size_t, void**)
|
|
124 { }
|
|
125
|
|
126 void
|
|
127 __VLTRegisterPairDebug(void**, const void*, std::size_t, const void*,
|
|
128 const char*, const char*)
|
|
129 { }
|
|
130
|
|
131 const void*
|
|
132 __VLTVerifyVtablePointerDebug(void**, const void* vtable_ptr, const char*,
|
|
133 const char*)
|
|
134 { return vtable_ptr; }
|