blob: 4f5f7538c7edcec1f7034ad90a5c10656d425858 [file] [log] [blame]
njn16eeb4e2005-06-16 03:56:58 +00001
2/*--------------------------------------------------------------------*/
3/*--- Redirections, etc. pub_tool_redir.h ---*/
4/*--------------------------------------------------------------------*/
5
6/*
7 This file is part of Valgrind, a dynamic binary instrumentation
8 framework.
9
sewardj0f157dd2013-10-18 14:27:36 +000010 Copyright (C) 2000-2013 Julian Seward
njn16eeb4e2005-06-16 03:56:58 +000011 jseward@acm.org
12
13 This program is free software; you can redistribute it and/or
14 modify it under the terms of the GNU General Public License as
15 published by the Free Software Foundation; either version 2 of the
16 License, or (at your option) any later version.
17
18 This program is distributed in the hope that it will be useful, but
19 WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 General Public License for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
26 02111-1307, USA.
27
28 The GNU General Public License is contained in the file COPYING.
29*/
30
njn4a164d02005-06-18 18:49:40 +000031#ifndef __PUB_TOOL_REDIR_H
32#define __PUB_TOOL_REDIR_H
njn16eeb4e2005-06-16 03:56:58 +000033
sewardj731f9cf2011-09-21 08:43:08 +000034#include "config.h" /* DARWIN_VERS */
35
sewardj0ec07f32006-01-12 12:32:32 +000036/* The following macros facilitate function replacement and wrapping.
njn16eeb4e2005-06-16 03:56:58 +000037
sewardj0ec07f32006-01-12 12:32:32 +000038 Function wrapping and function replacement are similar but not
39 identical.
njn16eeb4e2005-06-16 03:56:58 +000040
sewardj0ec07f32006-01-12 12:32:32 +000041 A replacement for some function F simply diverts all calls to F
42 to the stated replacement. There is no way to get back to F itself
43 from the replacement.
44
45 A wrapper for a function F causes all calls to F to instead go to
46 the wrapper. However, from inside the wrapper, it is possible
47 (with some difficulty) to get to F itself.
48
49 You may notice that replacement is a special case of wrapping, in
50 which the call to the original is omitted. For implementation
51 reasons, though, it is important to use the following macros
52 correctly: in particular, if you want to write a replacement, make
53 sure you use the VG_REPLACE_FN_ macros and not the VG_WRAP_FN_
54 macros.
55
sewardj96044842011-08-18 13:09:55 +000056 Finally there is the concept of prioritised behavioural equivalence
57 tags. A tag is a 5-digit decimal number (00000 to 99999) encoded
58 in the name. The top 4 digits are the equivalence class number,
59 and the last digit is a priority.
sewardj85cf9002011-08-16 09:54:00 +000060
sewardj96044842011-08-18 13:09:55 +000061 When processing redirections at library load time, if the set of
62 available specifications yields more than one replacement or
63 wrapper function for a given address, the system will try to
64 resolve the situation by examining the tags on the
65 replacements/wrappers.
66
67 If two replacement/wrapper functions have the same tag and
68 priority, then the redirection machinery will assume they have
69 identical behaviour and can choose between them arbitrarily. If
70 they have the same tag but different priorities, then the one with
71 higher priority will be chosen. If neither case holds, then the
72 redirection is ambiguous and the system will ignore one of them
73 arbitrarily, but print a warning when running at -v or above.
74
75 The tag is mandatory and must comprise 5 decimal digits. The tag
76 00000 is special and means "does not have behaviour identical to any
sewardj85cf9002011-08-16 09:54:00 +000077 other replacement/wrapper function". Hence if you wish to write a
78 wrap/replacement function that is not subject to the above
sewardj96044842011-08-18 13:09:55 +000079 resolution rules, use 00000 for the tag. Tags 00001 through 00009
80 may not be used for any purpose.
sewardj85cf9002011-08-16 09:54:00 +000081
82
sewardj0ec07f32006-01-12 12:32:32 +000083 Replacement
84 ~~~~~~~~~~~
85 To write a replacement function, do this:
86
87 ret_type
88 VG_REPLACE_FUNCTION_ZU(zEncodedSoname,fnname) ( .. args .. )
njn16eeb4e2005-06-16 03:56:58 +000089 {
90 ... body ...
91 }
92
sewardj85cf9002011-08-16 09:54:00 +000093 zEncodedSoname should be a Z-encoded soname (see below for
94 Z-encoding details) and fnname should be an unencoded fn name. A
sewardj96044842011-08-18 13:09:55 +000095 default-safe equivalence tag of 00000 is assumed (see comments
sewardj85cf9002011-08-16 09:54:00 +000096 above). The resulting name is
njn16eeb4e2005-06-16 03:56:58 +000097
sewardj96044842011-08-18 13:09:55 +000098 _vgr00000ZU_zEncodedSoname_fnname
njn16eeb4e2005-06-16 03:56:58 +000099
sewardj96044842011-08-18 13:09:55 +0000100 The "_vgr00000ZU_" is a prefix that gets discarded upon decoding.
sewardj85cf9002011-08-16 09:54:00 +0000101 It identifies this function as a replacement and specifies its
102 equivalence tag.
sewardj0ec07f32006-01-12 12:32:32 +0000103
104 It is also possible to write
105
106 ret_type
107 VG_REPLACE_FUNCTION_ZZ(zEncodedSoname,zEncodedFnname) ( .. args .. )
108 {
109 ... body ...
110 }
njn16eeb4e2005-06-16 03:56:58 +0000111
sewardj0ec07f32006-01-12 12:32:32 +0000112 which means precisely the same, but the function name is also
113 Z-encoded. This can sometimes be necessary. In this case the
114 resulting function name is
115
sewardj96044842011-08-18 13:09:55 +0000116 _vgr00000ZZ_zEncodedSoname_zEncodedFnname
sewardj0ec07f32006-01-12 12:32:32 +0000117
118 When it sees this either such name, the core's symbol-table reading
119 machinery and redirection machinery first Z-decode the soname and
120 if necessary the fnname. They are encoded so that they may include
121 arbitrary characters, and in particular they may contain '*', which
122 acts as a wildcard.
123
124 They then will conspire to cause calls to any function matching
125 'fnname' in any object whose soname matches 'soname' to actually be
126 routed to this function. This is used in Valgrind to define dozens
127 of replacements of malloc, free, etc.
njn16eeb4e2005-06-16 03:56:58 +0000128
129 The soname must be a Z-encoded bit of text because sonames can
sewardj0ec07f32006-01-12 12:32:32 +0000130 contain dots etc which are not valid symbol names. The function
131 name may or may not be Z-encoded: to include wildcards it has to be,
132 but Z-encoding C++ function names which are themselves already mangled
133 using Zs in some way is tedious and error prone, so the _ZU variant
134 allows them not to be Z-encoded.
njn16eeb4e2005-06-16 03:56:58 +0000135
sewardj0ec07f32006-01-12 12:32:32 +0000136 Note that the soname "NONE" is specially interpreted to match any
137 shared object which doesn't have a soname.
njn16eeb4e2005-06-16 03:56:58 +0000138
139 Note also that the replacement function should probably (must be?) in
140 client space, so it runs on the simulated CPU. So it must be in
njn7b4e5ba2005-08-25 22:53:57 +0000141 either vgpreload_<tool>.so or vgpreload_core.so. It also only works
142 with functions in shared objects, I think.
njn16eeb4e2005-06-16 03:56:58 +0000143
sewardj0ec07f32006-01-12 12:32:32 +0000144 It is important that the Z-encoded names contain no unencoded
145 underscores, since the intercept-handlers in m_redir.c detect the
146 end of the soname by looking for the first trailing underscore.
njn16eeb4e2005-06-16 03:56:58 +0000147
sewardj85cf9002011-08-16 09:54:00 +0000148 To write function names which explicitly state the equivalence class
149 tag, use
sewardj96044842011-08-18 13:09:55 +0000150 VG_REPLACE_FUNCTION_EZU(5-digit-tag,zEncodedSoname,fnname)
sewardj85cf9002011-08-16 09:54:00 +0000151 or
sewardj96044842011-08-18 13:09:55 +0000152 VG_REPLACE_FUNCTION_EZZ(5-digit-tag,zEncodedSoname,zEncodedFnname)
sewardj85cf9002011-08-16 09:54:00 +0000153
sewardj96044842011-08-18 13:09:55 +0000154 As per comments above, the tag must be a 5 digit decimal number,
155 padded with leading zeroes, in the range 00010 to 99999 inclusive.
sewardj85cf9002011-08-16 09:54:00 +0000156
157
sewardj0ec07f32006-01-12 12:32:32 +0000158 Wrapping
159 ~~~~~~~~
160 This is identical to replacement, except that you should use the
161 macro names
njn16eeb4e2005-06-16 03:56:58 +0000162
sewardj0ec07f32006-01-12 12:32:32 +0000163 VG_WRAP_FUNCTION_ZU
164 VG_WRAP_FUNCTION_ZZ
sewardj85cf9002011-08-16 09:54:00 +0000165 VG_WRAP_FUNCTION_EZU
166 VG_WRAP_FUNCTION_EZZ
sewardj0ec07f32006-01-12 12:32:32 +0000167
168 instead.
169
170 Z-encoding
171 ~~~~~~~~~~
172 Z-encoding details: the scheme is like GHC's. It is just about
173 readable enough to make a preprocessor unnecessary. First the
174 "_vgrZU_" or "_vgrZZ_" prefix is added, and then the following
175 characters are transformed.
176
177 * --> Za (asterisk)
sewardj0ec07f32006-01-12 12:32:32 +0000178 : --> Zc (colon)
179 . --> Zd (dot)
sewardj0ec07f32006-01-12 12:32:32 +0000180 - --> Zh (hyphen)
sewardj578b1712009-07-26 19:41:07 +0000181 + --> Zp (plus)
sewardj0ec07f32006-01-12 12:32:32 +0000182 (space) --> Zs (space)
sewardj578b1712009-07-26 19:41:07 +0000183 _ --> Zu (underscore)
sewardj6b9cc872006-10-17 01:39:30 +0000184 @ --> ZA (at)
sewardj578b1712009-07-26 19:41:07 +0000185 $ --> ZD (dollar)
sewardj6b9cc872006-10-17 01:39:30 +0000186 ( --> ZL (left)
187 ) --> ZR (right)
sewardj578b1712009-07-26 19:41:07 +0000188 Z --> ZZ (Z)
njn16eeb4e2005-06-16 03:56:58 +0000189
190 Everything else is left unchanged.
191*/
192
sewardj0ec07f32006-01-12 12:32:32 +0000193/* If you change these, the code in VG_(maybe_Z_demangle) needs to be
194 changed accordingly. NOTE: duplicates
195 I_{WRAP,REPLACE}_SONAME_FNNAME_Z{U,Z} in valgrind.h. */
196
sewardj6b9cc872006-10-17 01:39:30 +0000197/* Use an extra level of macroisation so as to ensure the soname/fnname
198 args are fully macro-expanded before pasting them together. */
199#define VG_CONCAT4(_aa,_bb,_cc,_dd) _aa##_bb##_cc##_dd
sewardj0ec07f32006-01-12 12:32:32 +0000200
sewardj85cf9002011-08-16 09:54:00 +0000201#define VG_CONCAT6(_aa,_bb,_cc,_dd,_ee,_ff) _aa##_bb##_cc##_dd##_ee##_ff
sewardj6b9cc872006-10-17 01:39:30 +0000202
sewardj85cf9002011-08-16 09:54:00 +0000203/* The 4 basic macros. */
204#define VG_REPLACE_FUNCTION_EZU(_eclasstag,_soname,_fnname) \
205 VG_CONCAT6(_vgr,_eclasstag,ZU_,_soname,_,_fnname)
206
207#define VG_REPLACE_FUNCTION_EZZ(_eclasstag,_soname,_fnname) \
208 VG_CONCAT6(_vgr,_eclasstag,ZZ_,_soname,_,_fnname)
209
210#define VG_WRAP_FUNCTION_EZU(_eclasstag,_soname,_fnname) \
211 VG_CONCAT6(_vgw,_eclasstag,ZU_,_soname,_,_fnname)
212
213#define VG_WRAP_FUNCTION_EZZ(_eclasstag,_soname,_fnname) \
214 VG_CONCAT6(_vgw,_eclasstag,ZZ_,_soname,_,_fnname)
215
216/* Convenience macros defined in terms of the above 4. */
217#define VG_REPLACE_FUNCTION_ZU(_soname,_fnname) \
sewardj96044842011-08-18 13:09:55 +0000218 VG_CONCAT6(_vgr,00000,ZU_,_soname,_,_fnname)
sewardj85cf9002011-08-16 09:54:00 +0000219
220#define VG_REPLACE_FUNCTION_ZZ(_soname,_fnname) \
sewardj96044842011-08-18 13:09:55 +0000221 VG_CONCAT6(_vgr,00000,ZZ_,_soname,_,_fnname)
sewardj85cf9002011-08-16 09:54:00 +0000222
223#define VG_WRAP_FUNCTION_ZU(_soname,_fnname) \
sewardj96044842011-08-18 13:09:55 +0000224 VG_CONCAT6(_vgw,00000,ZU_,_soname,_,_fnname)
sewardj85cf9002011-08-16 09:54:00 +0000225
226#define VG_WRAP_FUNCTION_ZZ(_soname,_fnname) \
sewardj96044842011-08-18 13:09:55 +0000227 VG_CONCAT6(_vgw,00000,ZZ_,_soname,_,_fnname)
sewardj85cf9002011-08-16 09:54:00 +0000228
sewardj6b9cc872006-10-17 01:39:30 +0000229
njne6154662009-02-10 04:23:41 +0000230/* --------- Some handy Z-encoded names. --------- */
231
njnb4cfbc42009-05-04 04:20:02 +0000232// Nb: ALL THESE NAMES MUST BEGIN WITH "VG_Z_". Why? If we applied
233// conditional compilation inconsistently we could accidentally use an
234// undefined constant like VG_Z_LIBC_DOT_A, resulting in a bogus Z-encoded
235// name like "_vgrZU_VG_Z_LIBC_DOT_A_foo". This can't be detected at
236// compile-time, because both the constant's name and its value are
237// identifiers. However, by always using "VG_Z_" as a prefix, we can do a
238// run-time check and abort if any name has "VG_Z_" in it, because that
239// indicates that the constant has been used without being defined.
240
njne6154662009-02-10 04:23:41 +0000241/* --- Soname of the standard C library. --- */
242
243#if defined(VGO_linux)
244# define VG_Z_LIBC_SONAME libcZdsoZa // libc.so*
sewardj731f9cf2011-09-21 08:43:08 +0000245
246#elif defined(VGO_darwin) && (DARWIN_VERS <= DARWIN_10_6)
njnf76d27a2009-05-28 01:53:07 +0000247# define VG_Z_LIBC_SONAME libSystemZdZaZddylib // libSystem.*.dylib
sewardj731f9cf2011-09-21 08:43:08 +0000248
sewardjae284e52012-08-02 18:25:04 +0000249#elif defined(VGO_darwin) && (DARWIN_VERS >= DARWIN_10_7)
sewardj731f9cf2011-09-21 08:43:08 +0000250# define VG_Z_LIBC_SONAME libsystemZucZaZddylib // libsystem_c*.dylib
251
njne6154662009-02-10 04:23:41 +0000252#else
253# error "Unknown platform"
sewardj731f9cf2011-09-21 08:43:08 +0000254
njne6154662009-02-10 04:23:41 +0000255#endif
256
257/* --- Soname of the GNU C++ library. --- */
258
njnb4cfbc42009-05-04 04:20:02 +0000259// Valid on all platforms(?)
njne6154662009-02-10 04:23:41 +0000260#define VG_Z_LIBSTDCXX_SONAME libstdcZpZpZa // libstdc++*
261
njn5f5ef2a2009-05-11 08:01:09 +0000262/* --- Soname of the pthreads library. --- */
263
sewardj6e9de462011-06-28 07:25:29 +0000264#if defined(VGO_linux)
njn5f5ef2a2009-05-11 08:01:09 +0000265# define VG_Z_LIBPTHREAD_SONAME libpthreadZdsoZd0 // libpthread.so.0
njnf76d27a2009-05-28 01:53:07 +0000266#elif defined(VGO_darwin)
267# define VG_Z_LIBPTHREAD_SONAME libSystemZdZaZddylib // libSystem.*.dylib
njn5f5ef2a2009-05-11 08:01:09 +0000268#else
269# error "Unknown platform"
270#endif
271
sewardja0eee322009-07-31 08:46:35 +0000272/* --- Sonames for Linux ELF linkers, plus unencoded versions. --- */
njne6154662009-02-10 04:23:41 +0000273
njnb4cfbc42009-05-04 04:20:02 +0000274#if defined(VGO_linux)
sewardja0eee322009-07-31 08:46:35 +0000275
sewardj651cfa42010-01-11 13:02:19 +0000276#define VG_Z_LD_LINUX_SO_3 ldZhlinuxZdsoZd3 // ld-linux.so.3
277#define VG_U_LD_LINUX_SO_3 "ld-linux.so.3"
278
njne6154662009-02-10 04:23:41 +0000279#define VG_Z_LD_LINUX_SO_2 ldZhlinuxZdsoZd2 // ld-linux.so.2
sewardja0eee322009-07-31 08:46:35 +0000280#define VG_U_LD_LINUX_SO_2 "ld-linux.so.2"
281
njne6154662009-02-10 04:23:41 +0000282#define VG_Z_LD_LINUX_X86_64_SO_2 ldZhlinuxZhx86Zh64ZdsoZd2 // ld-linux-x86-64.so.2
sewardja0eee322009-07-31 08:46:35 +0000283#define VG_U_LD_LINUX_X86_64_SO_2 "ld-linux-x86-64.so.2"
284
njne6154662009-02-10 04:23:41 +0000285#define VG_Z_LD64_SO_1 ld64ZdsoZd1 // ld64.so.1
sewardja0eee322009-07-31 08:46:35 +0000286#define VG_U_LD64_SO_1 "ld64.so.1"
287
njne6154662009-02-10 04:23:41 +0000288#define VG_Z_LD_SO_1 ldZdsoZd1 // ld.so.1
sewardja0eee322009-07-31 08:46:35 +0000289#define VG_U_LD_SO_1 "ld.so.1"
290
njnb4cfbc42009-05-04 04:20:02 +0000291#endif
njn16eeb4e2005-06-16 03:56:58 +0000292
njnf76d27a2009-05-28 01:53:07 +0000293/* --- Executable name for Darwin Mach-O linker. --- */
294
295#if defined(VGO_darwin)
sewardja0eee322009-07-31 08:46:35 +0000296
njnf76d27a2009-05-28 01:53:07 +0000297#define VG_Z_DYLD dyld // dyld
sewardja0eee322009-07-31 08:46:35 +0000298#define VG_U_DYLD "dyld"
299
njnf76d27a2009-05-28 01:53:07 +0000300#endif
301
302
philippe1e470b52012-05-11 19:33:46 +0000303// Prefix for synonym soname synonym handling
304#define VG_SO_SYN(name) VgSoSyn##name
305#define VG_SO_SYN_PREFIX "VgSoSyn"
306#define VG_SO_SYN_PREFIX_LEN 7
307
njn4a164d02005-06-18 18:49:40 +0000308#endif // __PUB_TOOL_REDIR_H
njn16eeb4e2005-06-16 03:56:58 +0000309
310/*--------------------------------------------------------------------*/
311/*--- end ---*/
312/*--------------------------------------------------------------------*/