blob: c97941ff40e60ad4e9f88e50738601a334765fbd [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
Elliott Hughesed398002017-06-21 14:41:24 -070010 Copyright (C) 2000-2017 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 */
Elliott Hughesa0664b92017-04-18 17:46:52 -070035#include "pub_tool_basics.h" // Bool and HChar
sewardj731f9cf2011-09-21 08:43:08 +000036
sewardj0ec07f32006-01-12 12:32:32 +000037/* The following macros facilitate function replacement and wrapping.
njn16eeb4e2005-06-16 03:56:58 +000038
sewardj0ec07f32006-01-12 12:32:32 +000039 Function wrapping and function replacement are similar but not
40 identical.
njn16eeb4e2005-06-16 03:56:58 +000041
sewardj0ec07f32006-01-12 12:32:32 +000042 A replacement for some function F simply diverts all calls to F
43 to the stated replacement. There is no way to get back to F itself
44 from the replacement.
45
46 A wrapper for a function F causes all calls to F to instead go to
47 the wrapper. However, from inside the wrapper, it is possible
48 (with some difficulty) to get to F itself.
49
50 You may notice that replacement is a special case of wrapping, in
51 which the call to the original is omitted. For implementation
52 reasons, though, it is important to use the following macros
53 correctly: in particular, if you want to write a replacement, make
54 sure you use the VG_REPLACE_FN_ macros and not the VG_WRAP_FN_
55 macros.
56
sewardj96044842011-08-18 13:09:55 +000057 Finally there is the concept of prioritised behavioural equivalence
58 tags. A tag is a 5-digit decimal number (00000 to 99999) encoded
59 in the name. The top 4 digits are the equivalence class number,
60 and the last digit is a priority.
sewardj85cf9002011-08-16 09:54:00 +000061
sewardj96044842011-08-18 13:09:55 +000062 When processing redirections at library load time, if the set of
63 available specifications yields more than one replacement or
64 wrapper function for a given address, the system will try to
65 resolve the situation by examining the tags on the
66 replacements/wrappers.
67
68 If two replacement/wrapper functions have the same tag and
69 priority, then the redirection machinery will assume they have
70 identical behaviour and can choose between them arbitrarily. If
71 they have the same tag but different priorities, then the one with
72 higher priority will be chosen. If neither case holds, then the
73 redirection is ambiguous and the system will ignore one of them
74 arbitrarily, but print a warning when running at -v or above.
75
76 The tag is mandatory and must comprise 5 decimal digits. The tag
77 00000 is special and means "does not have behaviour identical to any
sewardj85cf9002011-08-16 09:54:00 +000078 other replacement/wrapper function". Hence if you wish to write a
79 wrap/replacement function that is not subject to the above
sewardj96044842011-08-18 13:09:55 +000080 resolution rules, use 00000 for the tag. Tags 00001 through 00009
81 may not be used for any purpose.
sewardj85cf9002011-08-16 09:54:00 +000082
83
sewardj0ec07f32006-01-12 12:32:32 +000084 Replacement
85 ~~~~~~~~~~~
86 To write a replacement function, do this:
87
88 ret_type
89 VG_REPLACE_FUNCTION_ZU(zEncodedSoname,fnname) ( .. args .. )
njn16eeb4e2005-06-16 03:56:58 +000090 {
91 ... body ...
92 }
93
sewardj85cf9002011-08-16 09:54:00 +000094 zEncodedSoname should be a Z-encoded soname (see below for
95 Z-encoding details) and fnname should be an unencoded fn name. A
sewardj96044842011-08-18 13:09:55 +000096 default-safe equivalence tag of 00000 is assumed (see comments
sewardj85cf9002011-08-16 09:54:00 +000097 above). The resulting name is
njn16eeb4e2005-06-16 03:56:58 +000098
sewardj96044842011-08-18 13:09:55 +000099 _vgr00000ZU_zEncodedSoname_fnname
njn16eeb4e2005-06-16 03:56:58 +0000100
sewardj96044842011-08-18 13:09:55 +0000101 The "_vgr00000ZU_" is a prefix that gets discarded upon decoding.
sewardj85cf9002011-08-16 09:54:00 +0000102 It identifies this function as a replacement and specifies its
103 equivalence tag.
sewardj0ec07f32006-01-12 12:32:32 +0000104
105 It is also possible to write
106
107 ret_type
108 VG_REPLACE_FUNCTION_ZZ(zEncodedSoname,zEncodedFnname) ( .. args .. )
109 {
110 ... body ...
111 }
njn16eeb4e2005-06-16 03:56:58 +0000112
sewardj0ec07f32006-01-12 12:32:32 +0000113 which means precisely the same, but the function name is also
114 Z-encoded. This can sometimes be necessary. In this case the
115 resulting function name is
116
sewardj96044842011-08-18 13:09:55 +0000117 _vgr00000ZZ_zEncodedSoname_zEncodedFnname
sewardj0ec07f32006-01-12 12:32:32 +0000118
119 When it sees this either such name, the core's symbol-table reading
120 machinery and redirection machinery first Z-decode the soname and
121 if necessary the fnname. They are encoded so that they may include
122 arbitrary characters, and in particular they may contain '*', which
123 acts as a wildcard.
124
125 They then will conspire to cause calls to any function matching
126 'fnname' in any object whose soname matches 'soname' to actually be
127 routed to this function. This is used in Valgrind to define dozens
128 of replacements of malloc, free, etc.
njn16eeb4e2005-06-16 03:56:58 +0000129
130 The soname must be a Z-encoded bit of text because sonames can
sewardj0ec07f32006-01-12 12:32:32 +0000131 contain dots etc which are not valid symbol names. The function
132 name may or may not be Z-encoded: to include wildcards it has to be,
133 but Z-encoding C++ function names which are themselves already mangled
134 using Zs in some way is tedious and error prone, so the _ZU variant
135 allows them not to be Z-encoded.
njn16eeb4e2005-06-16 03:56:58 +0000136
sewardj0ec07f32006-01-12 12:32:32 +0000137 Note that the soname "NONE" is specially interpreted to match any
138 shared object which doesn't have a soname.
njn16eeb4e2005-06-16 03:56:58 +0000139
140 Note also that the replacement function should probably (must be?) in
141 client space, so it runs on the simulated CPU. So it must be in
njn7b4e5ba2005-08-25 22:53:57 +0000142 either vgpreload_<tool>.so or vgpreload_core.so. It also only works
143 with functions in shared objects, I think.
njn16eeb4e2005-06-16 03:56:58 +0000144
sewardj0ec07f32006-01-12 12:32:32 +0000145 It is important that the Z-encoded names contain no unencoded
146 underscores, since the intercept-handlers in m_redir.c detect the
147 end of the soname by looking for the first trailing underscore.
njn16eeb4e2005-06-16 03:56:58 +0000148
sewardj85cf9002011-08-16 09:54:00 +0000149 To write function names which explicitly state the equivalence class
150 tag, use
sewardj96044842011-08-18 13:09:55 +0000151 VG_REPLACE_FUNCTION_EZU(5-digit-tag,zEncodedSoname,fnname)
sewardj85cf9002011-08-16 09:54:00 +0000152 or
sewardj96044842011-08-18 13:09:55 +0000153 VG_REPLACE_FUNCTION_EZZ(5-digit-tag,zEncodedSoname,zEncodedFnname)
sewardj85cf9002011-08-16 09:54:00 +0000154
sewardj96044842011-08-18 13:09:55 +0000155 As per comments above, the tag must be a 5 digit decimal number,
156 padded with leading zeroes, in the range 00010 to 99999 inclusive.
sewardj85cf9002011-08-16 09:54:00 +0000157
158
sewardj0ec07f32006-01-12 12:32:32 +0000159 Wrapping
160 ~~~~~~~~
161 This is identical to replacement, except that you should use the
162 macro names
njn16eeb4e2005-06-16 03:56:58 +0000163
sewardj0ec07f32006-01-12 12:32:32 +0000164 VG_WRAP_FUNCTION_ZU
165 VG_WRAP_FUNCTION_ZZ
sewardj85cf9002011-08-16 09:54:00 +0000166 VG_WRAP_FUNCTION_EZU
167 VG_WRAP_FUNCTION_EZZ
sewardj0ec07f32006-01-12 12:32:32 +0000168
169 instead.
170
171 Z-encoding
172 ~~~~~~~~~~
173 Z-encoding details: the scheme is like GHC's. It is just about
174 readable enough to make a preprocessor unnecessary. First the
175 "_vgrZU_" or "_vgrZZ_" prefix is added, and then the following
176 characters are transformed.
177
178 * --> Za (asterisk)
sewardj0ec07f32006-01-12 12:32:32 +0000179 : --> Zc (colon)
180 . --> Zd (dot)
sewardj0ec07f32006-01-12 12:32:32 +0000181 - --> Zh (hyphen)
sewardj578b1712009-07-26 19:41:07 +0000182 + --> Zp (plus)
sewardj0ec07f32006-01-12 12:32:32 +0000183 (space) --> Zs (space)
sewardj578b1712009-07-26 19:41:07 +0000184 _ --> Zu (underscore)
sewardj6b9cc872006-10-17 01:39:30 +0000185 @ --> ZA (at)
sewardj578b1712009-07-26 19:41:07 +0000186 $ --> ZD (dollar)
sewardj6b9cc872006-10-17 01:39:30 +0000187 ( --> ZL (left)
Elliott Hughesed398002017-06-21 14:41:24 -0700188 % --> ZP (percent)
sewardj6b9cc872006-10-17 01:39:30 +0000189 ) --> ZR (right)
Elliott Hughesed398002017-06-21 14:41:24 -0700190 / --> ZS (slash)
sewardj578b1712009-07-26 19:41:07 +0000191 Z --> ZZ (Z)
njn16eeb4e2005-06-16 03:56:58 +0000192
193 Everything else is left unchanged.
194*/
195
sewardj0ec07f32006-01-12 12:32:32 +0000196/* If you change these, the code in VG_(maybe_Z_demangle) needs to be
197 changed accordingly. NOTE: duplicates
198 I_{WRAP,REPLACE}_SONAME_FNNAME_Z{U,Z} in valgrind.h. */
199
sewardj6b9cc872006-10-17 01:39:30 +0000200/* Use an extra level of macroisation so as to ensure the soname/fnname
201 args are fully macro-expanded before pasting them together. */
202#define VG_CONCAT4(_aa,_bb,_cc,_dd) _aa##_bb##_cc##_dd
sewardj0ec07f32006-01-12 12:32:32 +0000203
sewardj85cf9002011-08-16 09:54:00 +0000204#define VG_CONCAT6(_aa,_bb,_cc,_dd,_ee,_ff) _aa##_bb##_cc##_dd##_ee##_ff
sewardj6b9cc872006-10-17 01:39:30 +0000205
sewardj85cf9002011-08-16 09:54:00 +0000206/* The 4 basic macros. */
207#define VG_REPLACE_FUNCTION_EZU(_eclasstag,_soname,_fnname) \
208 VG_CONCAT6(_vgr,_eclasstag,ZU_,_soname,_,_fnname)
209
210#define VG_REPLACE_FUNCTION_EZZ(_eclasstag,_soname,_fnname) \
211 VG_CONCAT6(_vgr,_eclasstag,ZZ_,_soname,_,_fnname)
212
213#define VG_WRAP_FUNCTION_EZU(_eclasstag,_soname,_fnname) \
214 VG_CONCAT6(_vgw,_eclasstag,ZU_,_soname,_,_fnname)
215
216#define VG_WRAP_FUNCTION_EZZ(_eclasstag,_soname,_fnname) \
217 VG_CONCAT6(_vgw,_eclasstag,ZZ_,_soname,_,_fnname)
218
219/* Convenience macros defined in terms of the above 4. */
220#define VG_REPLACE_FUNCTION_ZU(_soname,_fnname) \
sewardj96044842011-08-18 13:09:55 +0000221 VG_CONCAT6(_vgr,00000,ZU_,_soname,_,_fnname)
sewardj85cf9002011-08-16 09:54:00 +0000222
223#define VG_REPLACE_FUNCTION_ZZ(_soname,_fnname) \
sewardj96044842011-08-18 13:09:55 +0000224 VG_CONCAT6(_vgr,00000,ZZ_,_soname,_,_fnname)
sewardj85cf9002011-08-16 09:54:00 +0000225
226#define VG_WRAP_FUNCTION_ZU(_soname,_fnname) \
sewardj96044842011-08-18 13:09:55 +0000227 VG_CONCAT6(_vgw,00000,ZU_,_soname,_,_fnname)
sewardj85cf9002011-08-16 09:54:00 +0000228
229#define VG_WRAP_FUNCTION_ZZ(_soname,_fnname) \
sewardj96044842011-08-18 13:09:55 +0000230 VG_CONCAT6(_vgw,00000,ZZ_,_soname,_,_fnname)
sewardj85cf9002011-08-16 09:54:00 +0000231
sewardj6b9cc872006-10-17 01:39:30 +0000232
njne6154662009-02-10 04:23:41 +0000233/* --------- Some handy Z-encoded names. --------- */
234
njnb4cfbc42009-05-04 04:20:02 +0000235// Nb: ALL THESE NAMES MUST BEGIN WITH "VG_Z_". Why? If we applied
236// conditional compilation inconsistently we could accidentally use an
237// undefined constant like VG_Z_LIBC_DOT_A, resulting in a bogus Z-encoded
238// name like "_vgrZU_VG_Z_LIBC_DOT_A_foo". This can't be detected at
239// compile-time, because both the constant's name and its value are
240// identifiers. However, by always using "VG_Z_" as a prefix, we can do a
241// run-time check and abort if any name has "VG_Z_" in it, because that
242// indicates that the constant has been used without being defined.
243
njne6154662009-02-10 04:23:41 +0000244/* --- Soname of the standard C library. --- */
245
sewardj8eb8bab2015-07-21 14:44:28 +0000246#if defined(VGO_linux) || defined(VGO_solaris)
Elliott Hughesed398002017-06-21 14:41:24 -0700247# if defined(MUSL_LIBC)
248# define VG_Z_LIBC_SONAME libcZdZa // libc.*
249#else
njne6154662009-02-10 04:23:41 +0000250# define VG_Z_LIBC_SONAME libcZdsoZa // libc.so*
Elliott Hughesed398002017-06-21 14:41:24 -0700251#endif
sewardj731f9cf2011-09-21 08:43:08 +0000252#elif defined(VGO_darwin) && (DARWIN_VERS <= DARWIN_10_6)
njnf76d27a2009-05-28 01:53:07 +0000253# define VG_Z_LIBC_SONAME libSystemZdZaZddylib // libSystem.*.dylib
sewardj731f9cf2011-09-21 08:43:08 +0000254
sewardj34ffca62014-06-21 09:37:46 +0000255#elif defined(VGO_darwin) && (DARWIN_VERS == DARWIN_10_7 \
256 || DARWIN_VERS == DARWIN_10_8)
sewardj731f9cf2011-09-21 08:43:08 +0000257# define VG_Z_LIBC_SONAME libsystemZucZaZddylib // libsystem_c*.dylib
sewardj34ffca62014-06-21 09:37:46 +0000258 /* Note that the idea of a single name for the C library falls
259 apart on more recent Darwins (10.8 and later) since the
260 functionality (malloc, free, str*) is split between
261 libsystem_c.dylib, libsystem_malloc.dylib and
262 libsystem_platform.dylib. This makes VG_Z_LIBC_SONAME somewhat useless
263 at least inside vg_replace_strmem.c, and that hardwires some dylib
264 names directly, for OSX 10.9. */
sewardj731f9cf2011-09-21 08:43:08 +0000265
sewardjec66ad52014-06-20 11:48:38 +0000266#elif defined(VGO_darwin) && (DARWIN_VERS >= DARWIN_10_9)
sewardj34ffca62014-06-21 09:37:46 +0000267# define VG_Z_LIBC_SONAME libsystemZumallocZddylib // libsystem_malloc.dylib
sewardjec66ad52014-06-20 11:48:38 +0000268
njne6154662009-02-10 04:23:41 +0000269#else
270# error "Unknown platform"
sewardj731f9cf2011-09-21 08:43:08 +0000271
njne6154662009-02-10 04:23:41 +0000272#endif
273
274/* --- Soname of the GNU C++ library. --- */
275
njnb4cfbc42009-05-04 04:20:02 +0000276// Valid on all platforms(?)
njne6154662009-02-10 04:23:41 +0000277#define VG_Z_LIBSTDCXX_SONAME libstdcZpZpZa // libstdc++*
278
njn5f5ef2a2009-05-11 08:01:09 +0000279/* --- Soname of the pthreads library. --- */
280
sewardj6e9de462011-06-28 07:25:29 +0000281#if defined(VGO_linux)
Elliott Hughesed398002017-06-21 14:41:24 -0700282# if defined(MUSL_LIBC)
283# define VG_Z_LIBPTHREAD_SONAME libcZdZa // libc.*
284#else
njn5f5ef2a2009-05-11 08:01:09 +0000285# define VG_Z_LIBPTHREAD_SONAME libpthreadZdsoZd0 // libpthread.so.0
Elliott Hughesed398002017-06-21 14:41:24 -0700286#endif
njnf76d27a2009-05-28 01:53:07 +0000287#elif defined(VGO_darwin)
288# define VG_Z_LIBPTHREAD_SONAME libSystemZdZaZddylib // libSystem.*.dylib
sewardj8eb8bab2015-07-21 14:44:28 +0000289#elif defined(VGO_solaris)
290# define VG_Z_LIBPTHREAD_SONAME libpthreadZdsoZd1 // libpthread.so.1
njn5f5ef2a2009-05-11 08:01:09 +0000291#else
292# error "Unknown platform"
293#endif
294
sewardja0eee322009-07-31 08:46:35 +0000295/* --- Sonames for Linux ELF linkers, plus unencoded versions. --- */
njne6154662009-02-10 04:23:41 +0000296
njnb4cfbc42009-05-04 04:20:02 +0000297#if defined(VGO_linux)
sewardja0eee322009-07-31 08:46:35 +0000298
sewardj651cfa42010-01-11 13:02:19 +0000299#define VG_Z_LD_LINUX_SO_3 ldZhlinuxZdsoZd3 // ld-linux.so.3
300#define VG_U_LD_LINUX_SO_3 "ld-linux.so.3"
301
njne6154662009-02-10 04:23:41 +0000302#define VG_Z_LD_LINUX_SO_2 ldZhlinuxZdsoZd2 // ld-linux.so.2
sewardja0eee322009-07-31 08:46:35 +0000303#define VG_U_LD_LINUX_SO_2 "ld-linux.so.2"
304
sewardj34ffca62014-06-21 09:37:46 +0000305#define VG_Z_LD_LINUX_X86_64_SO_2 ldZhlinuxZhx86Zh64ZdsoZd2
306 // ld-linux-x86-64.so.2
sewardja0eee322009-07-31 08:46:35 +0000307#define VG_U_LD_LINUX_X86_64_SO_2 "ld-linux-x86-64.so.2"
308
njne6154662009-02-10 04:23:41 +0000309#define VG_Z_LD64_SO_1 ld64ZdsoZd1 // ld64.so.1
sewardja0eee322009-07-31 08:46:35 +0000310#define VG_U_LD64_SO_1 "ld64.so.1"
carll582d5822014-08-07 23:35:54 +0000311#define VG_U_LD64_SO_2 "ld64.so.2" // PPC LE loader
sewardja0eee322009-07-31 08:46:35 +0000312
njne6154662009-02-10 04:23:41 +0000313#define VG_Z_LD_SO_1 ldZdsoZd1 // ld.so.1
sewardja0eee322009-07-31 08:46:35 +0000314#define VG_U_LD_SO_1 "ld.so.1"
315
sewardjdcd90512014-08-30 19:21:48 +0000316#define VG_U_LD_LINUX_AARCH64_SO_1 "ld-linux-aarch64.so.1"
mjw4fa71082014-09-01 15:29:55 +0000317#define VG_U_LD_LINUX_ARMHF_SO_3 "ld-linux-armhf.so.3"
sewardjdcd90512014-08-30 19:21:48 +0000318
njnb4cfbc42009-05-04 04:20:02 +0000319#endif
njn16eeb4e2005-06-16 03:56:58 +0000320
njnf76d27a2009-05-28 01:53:07 +0000321/* --- Executable name for Darwin Mach-O linker. --- */
322
323#if defined(VGO_darwin)
sewardja0eee322009-07-31 08:46:35 +0000324
njnf76d27a2009-05-28 01:53:07 +0000325#define VG_Z_DYLD dyld // dyld
sewardja0eee322009-07-31 08:46:35 +0000326#define VG_U_DYLD "dyld"
327
njnf76d27a2009-05-28 01:53:07 +0000328#endif
329
sewardj8eb8bab2015-07-21 14:44:28 +0000330/* --- Soname for Solaris run-time linker. --- */
331// Note: run-time linker contains absolute pathname in the SONAME.
332
333#if defined(VGO_solaris)
334
335#if defined(VGP_x86_solaris)
336# define VG_Z_LD_SO_1 ZSlibZSldZdsoZd1 // /lib/ld.so.1
337# define VG_U_LD_SO_1 "/lib/ld.so.1"
338#elif defined(VGP_amd64_solaris)
339# define VG_Z_LD_SO_1 ZSlibZSamd64ZSldZdsoZd1 // /lib/amd64/ld.so.1
340# define VG_U_LD_SO_1 "/lib/amd64/ld.so.1"
341#else
342# error "Unknown platform"
343#endif
344
345/* --- Soname for Solaris libumem allocation interposition. --- */
346
347#define VG_Z_LIBUMEM_SO_1 libumemZdsoZd1 // libumem.so.1
348#define VG_U_LIBUMEM_SO_1 "libumem.so.1"
349
350#endif
njnf76d27a2009-05-28 01:53:07 +0000351
philippe1e470b52012-05-11 19:33:46 +0000352// Prefix for synonym soname synonym handling
353#define VG_SO_SYN(name) VgSoSyn##name
354#define VG_SO_SYN_PREFIX "VgSoSyn"
355#define VG_SO_SYN_PREFIX_LEN 7
356
Elliott Hughesa0664b92017-04-18 17:46:52 -0700357// Special soname synonym place holder for the malloc symbols that can
358// be replaced using --soname-synonyms. Otherwise will match all
359// public symbols in any shared library/executable.
360#define SO_SYN_MALLOC VG_SO_SYN(somalloc)
361#define SO_SYN_MALLOC_NAME "VgSoSynsomalloc"
362
363Bool VG_(is_soname_ld_so) (const HChar *soname);
364
njn4a164d02005-06-18 18:49:40 +0000365#endif // __PUB_TOOL_REDIR_H
njn16eeb4e2005-06-16 03:56:58 +0000366
367/*--------------------------------------------------------------------*/
368/*--- end ---*/
369/*--------------------------------------------------------------------*/