1 // Copyright (C) 2012-2018 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 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; } 135