1 // Copyright (C) 2012-2016 Free Software Foundation, Inc.
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
__VLTChangePermission(int)107 __VLTChangePermission(int)
108 { }
109 
110 void
__VLTRegisterSet(void **,const void *,std::size_t,std::size_t,void **)111 __VLTRegisterSet(void**, const void*, std::size_t, std::size_t, void**)
112 { }
113 
114 void
__VLTRegisterPair(void **,const void *,std::size_t,const void *)115 __VLTRegisterPair(void**, const void*, std::size_t, const void*)
116 { }
117 
118 const void*
__VLTVerifyVtablePointer(void **,const void * vtable_ptr)119 __VLTVerifyVtablePointer(void**, const void* vtable_ptr)
120 { return vtable_ptr; }
121 
122 void
__VLTRegisterSetDebug(void **,const void *,std::size_t,std::size_t,void **)123 __VLTRegisterSetDebug(void**, const void*, std::size_t, std::size_t, void**)
124 { }
125 
126 void
__VLTRegisterPairDebug(void **,const void *,std::size_t,const void *,const char *,const char *)127 __VLTRegisterPairDebug(void**, const void*, std::size_t, const void*,
128 		       const char*, const  char*)
129 { }
130 
131 const void*
__VLTVerifyVtablePointerDebug(void **,const void * vtable_ptr,const char *,const char *)132 __VLTVerifyVtablePointerDebug(void**, const void* vtable_ptr, const char*,
133 			      const char*)
134 { return vtable_ptr; }
135