1 commit 13693666bd9fc7be37a907302e5d3d4f4b2c9358
2 Author: mjw <mjw@a5019735-40e9-0310-863c-91ae7b9d1cf9>
3 Date: Sun Nov 15 16:50:43 2015 +0000
5 BZ#355188 valgrind should intercept all malloc related global functions.
7 This implements the interception of all globally public allocation
8 functions by default. It works by adding a flag to the spec to say the
9 interception only applies to global functions. Which is set for the
10 somalloc spec. The librarypath to match is set to "*" unless the user
11 overrides it. Then each DiSym keeps track of whether the symbol is local
12 or global. For a spec which has isGlobal set only isGlobal symbols will
15 Note that because of padding to keep the addresses in DiSym aligned the
16 addition of the extra bool isGlobal doesn't actually grow the struct.
17 The comments explain how the struct could be made more compact on 32bit
18 systems, but this isn't as easy on 64bit systems. So I didn't try to do
21 For ELF symbols keeping track of which are global is trivial. For pdb I
22 had to guess and made only the "Public" symbols global. I don't know
23 how/if macho keeps track of global symbols or not. For now I just mark
24 all of them local (which just means things work as previously on platforms
25 that use machos, no non-system symbols are matches by default for somalloc
26 unless the user explicitly tells which library name to match).
28 Included are two testcases for shared libraries (wrapmalloc) and staticly
29 linked (wrapmallocstatic) malloc/free overrides that depend on the new
30 default. One existing testcase (new_override) was adjusted to explicitly
31 not use the new somalloc default because it depends on a user defined
32 new implementation that has side-effects and should explicitly not be
35 git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15726 a5019735-40e9-0310-863c-91ae7b9d1cf9
37 diff --git a/coregrind/m_debuginfo/debuginfo.c b/coregrind/m_debuginfo/debuginfo.c
38 index 6f11cd2..4dc1129 100644
39 --- a/coregrind/m_debuginfo/debuginfo.c
40 +++ b/coregrind/m_debuginfo/debuginfo.c
41 @@ -4306,7 +4306,8 @@ void VG_(DebugInfo_syms_getidx) ( const DebugInfo *si,
42 /*OUT*/const HChar** pri_name,
43 /*OUT*/const HChar*** sec_names,
45 - /*OUT*/Bool* isIFunc )
46 + /*OUT*/Bool* isIFunc,
47 + /*OUT*/Bool* isGlobal )
49 vg_assert(idx >= 0 && idx < si->symtab_used);
50 if (avmas) *avmas = si->symtab[idx].avmas;
51 @@ -4315,6 +4316,7 @@ void VG_(DebugInfo_syms_getidx) ( const DebugInfo *si,
52 if (sec_names) *sec_names = si->symtab[idx].sec_names;
53 if (isText) *isText = si->symtab[idx].isText;
54 if (isIFunc) *isIFunc = si->symtab[idx].isIFunc;
55 + if (isGlobal) *isGlobal = si->symtab[idx].isGlobal;
59 diff --git a/coregrind/m_debuginfo/priv_storage.h b/coregrind/m_debuginfo/priv_storage.h
60 index aa1d9f9..a43720a 100644
61 --- a/coregrind/m_debuginfo/priv_storage.h
62 +++ b/coregrind/m_debuginfo/priv_storage.h
63 @@ -75,14 +75,18 @@ typedef
64 the macros defined in pub_core_debuginfo.h */
65 const HChar* pri_name; /* primary name, never NULL */
66 const HChar** sec_names; /* NULL, or a NULL term'd array of other names */
67 - // XXX: this could be shrunk (on 32-bit platforms) by using 30
68 - // bits for the size and 1 bit each for isText and isIFunc. If you
69 - // do this, make sure that all assignments to the latter two use
70 - // 0 or 1 (or True or False), and that a positive number larger
71 - // than 1 is never used to represent True.
72 + // XXX: DiSym could be shrunk (on 32-bit platforms to exactly 16
73 + // bytes, on 64-bit platforms the first 3 pointers already add
74 + // up to 24 bytes, so size plus bits will extend to 32 bytes
75 + // anyway) by using 29 bits for the size and 1 bit each for
76 + // isText, isIFunc and isGlobal. If you do this, make sure that
77 + // all assignments to the latter two use 0 or 1 (or True or
78 + // False), and that a positive number larger than 1 is never
79 + // used to represent True.
80 UInt size; /* size in bytes */
82 Bool isIFunc; /* symbol is an indirect function? */
83 + Bool isGlobal; /* Is this symbol globally visible? */
87 diff --git a/coregrind/m_debuginfo/readelf.c b/coregrind/m_debuginfo/readelf.c
88 index 0861725..3820965 100644
89 --- a/coregrind/m_debuginfo/readelf.c
90 +++ b/coregrind/m_debuginfo/readelf.c
91 @@ -241,7 +241,8 @@ Bool get_elf_symbol_info (
92 Bool* from_opd_out, /* ppc64be-linux only: did we deref an
94 Bool* is_text_out, /* is this a text symbol? */
95 - Bool* is_ifunc /* is this a STT_GNU_IFUNC function ?*/
96 + Bool* is_ifunc_out, /* is this a STT_GNU_IFUNC function ?*/
97 + Bool* is_global_out /* is this a global symbol ?*/
101 @@ -259,7 +260,8 @@ Bool get_elf_symbol_info (
102 SET_TOCPTR_AVMA(*sym_avmas_out, 0); /* default to unknown/inapplicable */
103 SET_LOCAL_EP_AVMA(*sym_avmas_out, 0); /* default to unknown/inapplicable */
104 *from_opd_out = False;
106 + *is_ifunc_out = False;
107 + *is_global_out = False;
109 /* Get the symbol size, but restrict it to fit in a signed 32 bit
110 int. Also, deal with the stupid case of negative size by making
111 @@ -373,10 +375,14 @@ Bool get_elf_symbol_info (
112 /* Check for indirect functions. */
114 && ELFXX_ST_TYPE(sym->st_info) == STT_GNU_IFUNC) {
116 + *is_ifunc_out = True;
120 + if (ELFXX_ST_BIND(sym->st_info) == STB_GLOBAL) {
121 + *is_global_out = True;
124 # if defined(VGP_ppc64be_linux)
125 /* Allow STT_NOTYPE in the very special case where we're running on
126 ppc64be-linux and the symbol is one which the .opd-chasing hack
127 @@ -777,6 +783,7 @@ void read_elf_symtab__normal(
128 SymAVMAs sym_avmas_really;
130 Bool from_opd = False, is_text = False, is_ifunc = False;
131 + Bool is_global = False;
132 DiOffT sym_name_really = DiOffT_INVALID;
133 sym_avmas_really.main = 0;
134 SET_TOCPTR_AVMA(sym_avmas_really, 0);
135 @@ -787,7 +794,7 @@ void read_elf_symtab__normal(
139 - &from_opd, &is_text, &is_ifunc)) {
140 + &from_opd, &is_text, &is_ifunc, &is_global)) {
143 VG_(memset)(&disym, 0, sizeof(disym));
144 @@ -799,6 +806,7 @@ void read_elf_symtab__normal(
145 disym.size = sym_size;
146 disym.isText = is_text;
147 disym.isIFunc = is_ifunc;
148 + disym.isGlobal = is_global;
149 if (cstr) { ML_(dinfo_free)(cstr); cstr = NULL; }
150 vg_assert(disym.pri_name);
151 vg_assert(GET_TOCPTR_AVMA(disym.avmas) == 0);
152 @@ -847,6 +855,7 @@ typedef
160 @@ -911,6 +920,7 @@ void read_elf_symtab__ppc64be_linux(
161 SymAVMAs sym_avmas_really;
163 Bool from_opd = False, is_text = False, is_ifunc = False;
164 + Bool is_global = False;
165 DiOffT sym_name_really = DiOffT_INVALID;
167 VG_(memset)(&disym, 0, sizeof(disym));
168 @@ -923,7 +933,7 @@ void read_elf_symtab__ppc64be_linux(
172 - &from_opd, &is_text, &is_ifunc)) {
173 + &from_opd, &is_text, &is_ifunc, &is_global)) {
175 /* Check if we've seen this (name,addr) key before. */
176 key.addr = sym_avmas_really.main;
177 @@ -996,6 +1006,7 @@ void read_elf_symtab__ppc64be_linux(
178 elem->from_opd = from_opd;
179 elem->is_text = is_text;
180 elem->is_ifunc = is_ifunc;
181 + elem->is_global = is_global;
182 VG_(OSetGen_Insert)(oset, elem);
183 if (di->trace_symtab) {
184 HChar* str = ML_(img_strdup)(escn_strtab->img, "di.respl.2",
185 @@ -1034,14 +1045,17 @@ void read_elf_symtab__ppc64be_linux(
186 disym.size = elem->size;
187 disym.isText = elem->is_text;
188 disym.isIFunc = elem->is_ifunc;
189 + disym.isGlobal = elem->is_global;
190 if (cstr) { ML_(dinfo_free)(cstr); cstr = NULL; }
191 vg_assert(disym.pri_name != NULL);
193 ML_(addSym) ( di, &disym );
194 if (di->trace_symtab) {
195 - VG_(printf)(" rec(%c) [%4ld]: "
196 + VG_(printf)(" rec(%c%c%c) [%4ld]: "
197 " val %#010lx, toc %#010lx, sz %4d %s\n",
198 disym.isText ? 't' : 'd',
199 + disym.isIFunc ? 'i' : '-',
200 + disym.isGlobal ? 'g' : 'l',
203 GET_TOCPTR_AVMA(disym.avmas),
204 diff --git a/coregrind/m_debuginfo/readmacho.c b/coregrind/m_debuginfo/readmacho.c
205 index 98ab048..3d406a4 100644
206 --- a/coregrind/m_debuginfo/readmacho.c
207 +++ b/coregrind/m_debuginfo/readmacho.c
208 @@ -365,6 +365,7 @@ void read_symtab( /*OUT*/XArray* /* DiSym */ syms,
209 di->text_avma+di->text_size - sym_addr;
211 disym.isIFunc = False;
212 + disym.isGlobal = False;
213 // Lots of user function names get prepended with an underscore. Eg. the
214 // function 'f' becomes the symbol '_f'. And the "below main"
215 // function is called "start". So we skip the leading underscore, and
216 diff --git a/coregrind/m_debuginfo/readpdb.c b/coregrind/m_debuginfo/readpdb.c
217 index 8b63e95..1ebf863 100644
218 --- a/coregrind/m_debuginfo/readpdb.c
219 +++ b/coregrind/m_debuginfo/readpdb.c
220 @@ -1272,6 +1272,7 @@ static ULong DEBUG_SnarfCodeView(
221 // FIXME: .namelen is sizeof(.data) including .name[]
222 vsym.isText = (sym->generic.id == S_PUB_V1);
223 vsym.isIFunc = False;
224 + vsym.isGlobal = True;
225 ML_(addSym)( di, &vsym );
228 @@ -1299,6 +1300,7 @@ static ULong DEBUG_SnarfCodeView(
229 vsym.isText = !!(IMAGE_SCN_CNT_CODE
230 & sectp[sym->data_v2.segment-1].Characteristics);
231 vsym.isIFunc = False;
232 + vsym.isGlobal = True;
233 ML_(addSym)( di, &vsym );
236 @@ -1332,6 +1334,7 @@ static ULong DEBUG_SnarfCodeView(
237 vsym.isText = !!(IMAGE_SCN_CNT_CODE
238 & sectp[sym->data_v2.segment-1].Characteristics);
239 vsym.isIFunc = False;
240 + vsym.isGlobal = True;
241 ML_(addSym)( di, &vsym );
244 @@ -1365,6 +1368,7 @@ static ULong DEBUG_SnarfCodeView(
245 vsym.size = sym->proc_v1.proc_len;
247 vsym.isIFunc = False;
248 + vsym.isGlobal = sym->generic.id == S_GPROC_V1;
250 VG_(umsg)(" Adding function %s addr=%#lx length=%u\n",
251 symname, vsym.avmas.main, vsym.size );
252 @@ -1386,6 +1390,7 @@ static ULong DEBUG_SnarfCodeView(
253 vsym.size = sym->proc_v2.proc_len;
255 vsym.isIFunc = False;
256 + vsym.isGlobal = sym->generic.id == S_GPROC_V2;
258 VG_(umsg)(" Adding function %s addr=%#lx length=%u\n",
259 symname, vsym.avmas.main, vsym.size );
260 @@ -1408,6 +1413,7 @@ static ULong DEBUG_SnarfCodeView(
261 vsym.size = sym->proc_v3.proc_len;
263 vsym.isIFunc = False;
264 + vsym.isGlobal = sym->generic.id == S_GPROC_V3;
265 ML_(addSym)( di, &vsym );
268 diff --git a/coregrind/m_debuginfo/storage.c b/coregrind/m_debuginfo/storage.c
269 index 45bc135..7b2e26a 100644
270 --- a/coregrind/m_debuginfo/storage.c
271 +++ b/coregrind/m_debuginfo/storage.c
272 @@ -98,10 +98,11 @@ void ML_(ppSym) ( Int idx, const DiSym* sym )
273 vg_assert(sym->pri_name);
275 vg_assert(sec_names);
276 - VG_(printf)( "%5d: %c%c %#8lx .. %#8lx (%u) %s%s",
277 + VG_(printf)( "%5d: %c%c%c %#8lx .. %#8lx (%u) %s%s",
279 sym->isText ? 'T' : '-',
280 sym->isIFunc ? 'I' : '-',
281 + sym->isGlobal ? 'G' : '-',
283 sym->avmas.main + sym->size - 1, sym->size,
284 sym->pri_name, sec_names ? " " : "" );
285 @@ -1646,7 +1647,7 @@ static void canonicaliseSymtab ( struct _DebugInfo* di )
286 Word i, j, n_truncated;
287 Addr sta1, sta2, end1, end2, toc1, toc2;
288 const HChar *pri1, *pri2, **sec1, **sec2;
289 - Bool ist1, ist2, isf1, isf2;
290 + Bool ist1, ist2, isf1, isf2, isg1, isg2;
292 # define SWAP(ty,aa,bb) \
293 do { ty tt = (aa); (aa) = (bb); (bb) = tt; } while (0)
294 @@ -1693,6 +1694,8 @@ static void canonicaliseSymtab ( struct _DebugInfo* di )
296 /* mark w as an IFunc if either w or r are */
297 di->symtab[w].isIFunc = di->symtab[w].isIFunc || di->symtab[r].isIFunc;
298 + /* likewise for global symbols */
299 + di->symtab[w].isGlobal = di->symtab[w].isGlobal || di->symtab[r].isGlobal;
300 /* and use ::pri_names to indicate this slot is no longer in use */
301 di->symtab[r].pri_name = NULL;
302 if (di->symtab[r].sec_names) {
303 @@ -1796,6 +1799,7 @@ static void canonicaliseSymtab ( struct _DebugInfo* di )
304 sec1 = di->symtab[i].sec_names;
305 ist1 = di->symtab[i].isText;
306 isf1 = di->symtab[i].isIFunc;
307 + isg1 = di->symtab[i].isGlobal;
309 sta2 = di->symtab[i+1].avmas.main;
310 end2 = sta2 + di->symtab[i+1].size - 1;
311 @@ -1805,6 +1809,7 @@ static void canonicaliseSymtab ( struct _DebugInfo* di )
312 sec2 = di->symtab[i+1].sec_names;
313 ist2 = di->symtab[i+1].isText;
314 isf2 = di->symtab[i+1].isIFunc;
315 + isg2 = di->symtab[i+1].isGlobal;
319 @@ -1814,7 +1819,7 @@ static void canonicaliseSymtab ( struct _DebugInfo* di )
321 SWAP(Addr,sta1,sta2); SWAP(Addr,end1,end2); SWAP(Addr,toc1,toc2);
322 SWAP(const HChar*,pri1,pri2); SWAP(const HChar**,sec1,sec2);
323 - SWAP(Bool,ist1,ist2); SWAP(Bool,isf1,isf2);
324 + SWAP(Bool,ist1,ist2); SWAP(Bool,isf1,isf2); SWAP(Bool, isg1, isg2);
328 @@ -1831,6 +1836,7 @@ static void canonicaliseSymtab ( struct _DebugInfo* di )
329 di->symtab[i].sec_names = sec1;
330 di->symtab[i].isText = ist1;
331 di->symtab[i].isIFunc = isf1;
332 + di->symtab[i].isGlobal = isg1;
334 di->symtab[i+1].avmas.main = sta2;
335 di->symtab[i+1].size = end2 - sta2 + 1;
336 @@ -1840,6 +1846,7 @@ static void canonicaliseSymtab ( struct _DebugInfo* di )
337 di->symtab[i+1].sec_names = sec2;
338 di->symtab[i+1].isText = ist2;
339 di->symtab[i+1].isIFunc = isf2;
340 + di->symtab[i+1].isGlobal = isg2;
342 vg_assert(sta1 <= sta2);
343 vg_assert(di->symtab[i].size > 0);
344 diff --git a/coregrind/m_redir.c b/coregrind/m_redir.c
345 index 7e4df8d..3d3f70a 100644
346 --- a/coregrind/m_redir.c
347 +++ b/coregrind/m_redir.c
348 @@ -233,6 +233,7 @@ typedef
349 HChar* from_fnpatt; /* from fnname pattern */
350 Addr to_addr; /* where redirecting to */
351 Bool isWrap; /* wrap or replacement? */
352 + Bool isGlobal; /* must the symbol to replace be global? */
353 Int becTag; /* 0 through 9999. Behavioural equivalance class tag.
354 If two wrappers have the same (non-zero) tag, they
355 are promising that they behave identically. */
356 @@ -388,7 +389,7 @@ static HChar const* advance_to_comma ( HChar const* c ) {
358 void VG_(redir_notify_new_DebugInfo)( const DebugInfo* newdi )
361 + Bool ok, isWrap, isGlobal;
362 Int i, nsyms, becTag, becPrio;
365 @@ -518,13 +519,14 @@ void VG_(redir_notify_new_DebugInfo)( const DebugInfo* newdi )
366 for (i = 0; i < nsyms; i++) {
367 VG_(DebugInfo_syms_getidx)( newdi, i, &sym_avmas,
368 NULL, &sym_name_pri, &sym_names_sec,
370 + &isText, NULL, NULL );
371 /* Set up to conveniently iterate over all names for this symbol. */
372 const HChar* twoslots[2];
373 const HChar** names_init =
374 alloc_symname_array(sym_name_pri, sym_names_sec, &twoslots[0]);
376 for (names = names_init; *names; names++) {
378 ok = VG_(maybe_Z_demangle)( *names,
381 @@ -579,15 +581,12 @@ void VG_(redir_notify_new_DebugInfo)( const DebugInfo* newdi )
382 have a matching lib synonym, then replace the sopatt.
383 Otherwise, just ignore this redirection spec. */
385 - if (!VG_(clo_soname_synonyms))
386 - continue; // No synonyms => skip the redir.
388 /* Search for a matching synonym=newname*/
389 SizeT const sopatt_syn_len
390 = VG_(strlen)(demangled_sopatt+VG_SO_SYN_PREFIX_LEN);
391 HChar const* last = VG_(clo_soname_synonyms);
394 + while (last != NULL && *last) {
395 HChar const* first = last;
396 last = advance_to_equal(first);
398 @@ -611,6 +610,17 @@ void VG_(redir_notify_new_DebugInfo)( const DebugInfo* newdi )
402 + // If the user didn't set it then somalloc is special. We
403 + // want to match public/global symbols that match the
404 + // fnpatt everywhere.
405 + if (replaced_sopatt == NULL
406 + && VG_(strcmp) ( demangled_sopatt, SO_SYN_MALLOC_NAME ) == 0)
408 + replaced_sopatt = VG_(strdup)("m_redir.rnnD.1", "*");
409 + demangled_sopatt = replaced_sopatt;
413 // If we have not replaced the sopatt, then skip the redir.
414 if (replaced_sopatt == NULL)
416 @@ -621,6 +631,7 @@ void VG_(redir_notify_new_DebugInfo)( const DebugInfo* newdi )
417 spec->from_fnpatt = dinfo_strdup("redir.rnnD.3", demangled_fnpatt);
418 spec->to_addr = sym_avmas.main;
419 spec->isWrap = isWrap;
420 + spec->isGlobal = isGlobal;
421 spec->becTag = becTag;
422 spec->becPrio = becPrio;
423 /* check we're not adding manifestly stupid destinations */
424 @@ -653,7 +664,7 @@ void VG_(redir_notify_new_DebugInfo)( const DebugInfo* newdi )
425 for (i = 0; i < nsyms; i++) {
426 VG_(DebugInfo_syms_getidx)( newdi, i, &sym_avmas,
427 NULL, &sym_name_pri, &sym_names_sec,
429 + &isText, NULL, NULL );
430 const HChar* twoslots[2];
431 const HChar** names_init =
432 alloc_symname_array(sym_name_pri, sym_names_sec, &twoslots[0]);
433 @@ -785,7 +796,7 @@ void generate_and_add_actives (
437 - Bool anyMark, isText, isIFunc;
438 + Bool anyMark, isText, isIFunc, isGlobal;
442 @@ -813,7 +824,7 @@ void generate_and_add_actives (
443 for (i = 0; i < nsyms; i++) {
444 VG_(DebugInfo_syms_getidx)( di, i, &sym_avmas,
445 NULL, &sym_name_pri, &sym_names_sec,
446 - &isText, &isIFunc );
447 + &isText, &isIFunc, &isGlobal );
448 const HChar* twoslots[2];
449 const HChar** names_init =
450 alloc_symname_array(sym_name_pri, sym_names_sec, &twoslots[0]);
451 @@ -827,7 +838,8 @@ void generate_and_add_actives (
452 for (sp = specs; sp; sp = sp->next) {
454 continue; /* soname doesn't match */
455 - if (VG_(string_match)( sp->from_fnpatt, *names )) {
456 + if (VG_(string_match)( sp->from_fnpatt, *names )
457 + && (sp->isGlobal == False || isGlobal == True)) {
458 /* got a new binding. Add to collection. */
459 act.from_addr = sym_avmas.main;
460 act.to_addr = sp->to_addr;
461 @@ -1220,6 +1232,7 @@ static void add_hardwired_spec (const HChar* sopatt, const HChar* fnpatt,
462 spec->from_fnpatt = CONST_CAST(HChar *,fnpatt);
463 spec->to_addr = to_addr;
464 spec->isWrap = False;
465 + spec->isGlobal = False;
466 spec->mandatory = mandatory;
468 spec->mark = False; /* not significant */
469 @@ -1719,7 +1732,7 @@ static void handle_require_text_symbols ( const DebugInfo* di )
470 const HChar** sym_names_sec = NULL;
471 VG_(DebugInfo_syms_getidx)( di, j, NULL,
472 NULL, &sym_name_pri, &sym_names_sec,
474 + &isText, NULL, NULL );
475 const HChar* twoslots[2];
476 const HChar** names_init =
477 alloc_symname_array(sym_name_pri, sym_names_sec, &twoslots[0]);
478 @@ -1773,10 +1786,11 @@ static void handle_require_text_symbols ( const DebugInfo* di )
479 static void show_spec ( const HChar* left, const Spec* spec )
481 VG_(message)( Vg_DebugMsg,
482 - "%s%-25s %-30s %s-> (%04d.%d) 0x%08lx\n",
483 + "%s%-25s %-30s %s%s-> (%04d.%d) 0x%08lx\n",
485 spec->from_sopatt, spec->from_fnpatt,
486 spec->isWrap ? "W" : "R",
487 + spec->isGlobal ? "G" : "L",
488 spec->becTag, spec->becPrio,
491 diff --git a/coregrind/m_replacemalloc/vg_replace_malloc.c b/coregrind/m_replacemalloc/vg_replace_malloc.c
492 index ccac130..3c79c8a 100644
493 --- a/coregrind/m_replacemalloc/vg_replace_malloc.c
494 +++ b/coregrind/m_replacemalloc/vg_replace_malloc.c
495 @@ -291,7 +291,6 @@ static void init(void);
496 // For some lines, we will also define a replacement function
497 // whose only purpose is to be a soname synonym place holder
498 // that can be replaced using --soname-synonyms.
499 -#define SO_SYN_MALLOC VG_SO_SYN(somalloc)
502 #if defined(VGO_linux)
503 diff --git a/coregrind/pub_core_debuginfo.h b/coregrind/pub_core_debuginfo.h
504 index b698f2c..8f26f25 100644
505 --- a/coregrind/pub_core_debuginfo.h
506 +++ b/coregrind/pub_core_debuginfo.h
507 @@ -216,7 +216,8 @@ void VG_(DebugInfo_syms_getidx) ( const DebugInfo *di,
508 /*OUT*/const HChar** pri_name,
509 /*OUT*/const HChar*** sec_names,
511 - /*OUT*/Bool* isIFunc );
512 + /*OUT*/Bool* isIFunc,
513 + /*OUT*/Bool* isGlobal );
514 /* ppc64-linux only: find the TOC pointer (R2 value) that should be in
515 force at the entry point address of the function containing
516 guest_code_addr. Returns 0 if not known. */
517 diff --git a/docs/xml/manual-core.xml b/docs/xml/manual-core.xml
518 index edda8a1..c80aab0 100644
519 --- a/docs/xml/manual-core.xml
520 +++ b/docs/xml/manual-core.xml
521 @@ -2315,18 +2315,26 @@ need to use them.</para>
522 <option><![CDATA[--soname-synonyms=syn1=pattern1,syn2=pattern2,...]]></option>
525 - <para>When a shared library is loaded, Valgrind checks for
526 - functions in the library that must be replaced or wrapped.
527 - For example, Memcheck replaces all malloc related
528 - functions (malloc, free, calloc, ...) with its own versions.
529 - Such replacements are done by default only in shared libraries whose
530 - soname matches a predefined soname pattern (e.g.
531 - <varname>libc.so*</varname> on linux).
532 - By default, no replacement is done for a statically linked
533 - library or for alternative libraries such as tcmalloc.
534 + <para>When a shared library is loaded, Valgrind checks for
535 + functions in the library that must be replaced or wrapped. For
536 + example, Memcheck replaces some string and memory functions
537 + (strchr, strlen, strcpy, memchr, memcpy, memmove, etc.) with its
538 + own versions. Such replacements are normally done only in shared
539 + libraries whose soname matches a predefined soname pattern (e.g.
540 + <varname>libc.so*</varname> on linux). By default, no
541 + replacement is done for a statically linked library or for
542 + alternative libraries, except for the allocation functions
543 + (malloc, free, calloc, memalign, realloc, operator new, operator
544 + delete, etc.) Such allocation functions are intercepted by
545 + default in any shared library or in the executable if they are
546 + exported as global symbols. This means that if a replacement
547 + allocation library such as tcmalloc is found, its functions are
548 + also intercepted by default.
550 In some cases, the replacements allow
551 <option>--soname-synonyms</option> to specify one additional
552 - synonym pattern, giving flexibility in the replacement. </para>
553 + synonym pattern, giving flexibility in the replacement. Or to
554 + prevent interception of all public allocation symbols.</para>
556 <para>Currently, this flexibility is only allowed for the
557 malloc related functions, using the
558 @@ -2339,27 +2347,31 @@ need to use them.</para>
561 <para>Alternate malloc library: to replace the malloc
562 - related functions in an alternate library with
563 - soname <varname>mymalloclib.so</varname>, give the
564 + related functions in a specific alternate library with
565 + soname <varname>mymalloclib.so</varname> (and not in any
567 option <option>--soname-synonyms=somalloc=mymalloclib.so</option>.
568 A pattern can be used to match multiple libraries sonames.
570 example, <option>--soname-synonyms=somalloc=*tcmalloc*</option>
571 - will match the soname of all variants of the tcmalloc library
572 - (native, debug, profiled, ... tcmalloc variants). </para>
573 + will match the soname of all variants of the tcmalloc
574 + library (native, debug, profiled, ... tcmalloc
576 <para>Note: the soname of a elf shared library can be
577 retrieved using the readelf utility. </para>
582 - <para>Replacements in a statically linked library are done by
583 - using the <varname>NONE</varname> pattern. For example, if
584 - you link with <varname>libtcmalloc.a</varname>, memcheck
585 - will properly work when you give the
586 - option <option>--soname-synonyms=somalloc=NONE</option>. Note
587 - that a NONE pattern will match the main executable and any
588 - shared library having no soname. </para>
589 + <para>Replacements in a statically linked library are done
590 + by using the <varname>NONE</varname> pattern. For example,
591 + if you link with <varname>libtcmalloc.a</varname>, and only
592 + want to intercept the malloc related functions in the
593 + executable (and standard libraries) themselves, but not any
594 + other shared libraries, you can give the
595 + option <option>--soname-synonyms=somalloc=NONE</option>.
596 + Note that a NONE pattern will match the main executable and
597 + any shared library having no soname. </para>
601 @@ -2369,6 +2381,17 @@ need to use them.</para>
606 + <para>To only intercept allocation symbols in the default
607 + system libraries, but not in any other shared library or the
608 + executable defining public malloc or operator new related
609 + functions use a non-existing library name
610 + like <option>--soname-synonyms=somalloc=nouserintercepts</option>
611 + (where <varname>nouserintercepts</varname> can be any
612 + non-existing library name).
619 diff --git a/include/pub_tool_redir.h b/include/pub_tool_redir.h
620 index bac00d7..21d186b 100644
621 --- a/include/pub_tool_redir.h
622 +++ b/include/pub_tool_redir.h
624 #define VG_SO_SYN_PREFIX "VgSoSyn"
625 #define VG_SO_SYN_PREFIX_LEN 7
627 +// Special soname synonym place holder for the malloc symbols that can
628 +// be replaced using --soname-synonyms. Otherwise will match all
629 +// public symbols in any shared library/executable.
630 +#define SO_SYN_MALLOC VG_SO_SYN(somalloc)
631 +#define SO_SYN_MALLOC_NAME "VgSoSynsomalloc"
633 #endif // __PUB_TOOL_REDIR_H
635 /*--------------------------------------------------------------------*/
636 diff --git a/memcheck/tests/Makefile.am b/memcheck/tests/Makefile.am
637 index 68d9ca1..0f34127 100644
638 --- a/memcheck/tests/Makefile.am
639 +++ b/memcheck/tests/Makefile.am
640 @@ -291,6 +291,9 @@ EXTRA_DIST = \
641 wrap7.vgtest wrap7.stdout.exp wrap7.stderr.exp \
642 wrap8.vgtest wrap8.stdout.exp wrap8.stderr.exp \
643 wrap8.stdout.exp-ppc64 wrap8.stderr.exp-ppc64 \
644 + wrapmalloc.vgtest wrapmalloc.stdout.exp wrapmalloc.stderr.exp \
645 + wrapmallocstatic.vgtest wrapmallocstatic.stdout.exp \
646 + wrapmallocstatic.stderr.exp \
647 writev1.stderr.exp writev1.stderr.exp-solaris writev1.vgtest \
648 xml1.stderr.exp xml1.stdout.exp xml1.vgtest xml1.stderr.exp-s390x-mvc \
649 threadname.vgtest threadname.stderr.exp \
650 @@ -375,6 +378,7 @@ check_PROGRAMS = \
653 wrap1 wrap2 wrap3 wrap4 wrap5 wrap6 wrap7 wrap7so.so wrap8 \
654 + wrapmalloc wrapmallocso.so wrapmallocstatic \
657 if !SOLARIS_SUN_STUDIO_AS
658 @@ -570,4 +574,26 @@ else
659 -Wl,-soname -Wl,wrap7so.so
662 +# Build shared object for wrapmalloc
663 +wrapmalloc_SOURCES = wrapmalloc.c
664 +wrapmalloc_DEPENDENCIES = wrapmallocso.so
665 +if VGCONF_OS_IS_DARWIN
666 + wrapmalloc_LDADD = `pwd`/wrapmallocso.so
667 + wrapmalloc_LDFLAGS = $(AM_FLAG_M3264_PRI)
669 + wrapmalloc_LDADD = wrapmallocso.so
670 + wrapmalloc_LDFLAGS = $(AM_FLAG_M3264_PRI) \
671 + -Wl,-rpath,$(top_builddir)/memcheck/tests
674 +wrapmallocso_so_SOURCES = wrapmallocso.c
675 +wrapmallocso_so_CFLAGS = $(AM_CFLAGS) -fpic
676 +if VGCONF_OS_IS_DARWIN
677 + wrapmallocso_so_LDFLAGS = -fpic $(AM_FLAG_M3264_PRI) -dynamic \
678 + -dynamiclib -all_load
680 + wrapmallocso_so_LDFLAGS = -fpic $(AM_FLAG_M3264_PRI) -shared \
681 + -Wl,-soname -Wl,wrapmallocso.so
684 xml1_CFLAGS = $(AM_CFLAGS) -D_GNU_SOURCE
685 diff --git a/memcheck/tests/new_override.vgtest b/memcheck/tests/new_override.vgtest
686 index 50e6240..435e330 100644
687 --- a/memcheck/tests/new_override.vgtest
688 +++ b/memcheck/tests/new_override.vgtest
691 +# Don't override the user defined somalloc functions in this test.
692 +# The test depends on some side effects and initializing memory done by
693 +# the user overidden operator new.
694 +vgopts: --soname-synonyms=somalloc=nouseroverride
695 stderr_filter: filter_allocs
696 diff --git a/memcheck/tests/wrapmalloc.c b/memcheck/tests/wrapmalloc.c
698 index 0000000..2307e77
700 +++ b/memcheck/tests/wrapmalloc.c
705 +/* Test that a program that has malloc/free interposed in a shared
706 + library is also intercepted. */
710 + printf ("start\n");
711 + void *p = malloc (1024);
716 diff --git a/memcheck/tests/wrapmalloc.stderr.exp b/memcheck/tests/wrapmalloc.stderr.exp
718 index 0000000..d937776
720 +++ b/memcheck/tests/wrapmalloc.stderr.exp
725 + in use at exit: 0 bytes in 0 blocks
726 + total heap usage: 1 allocs, 1 frees, 1,024 bytes allocated
728 +For a detailed leak analysis, rerun with: --leak-check=full
730 +For counts of detected and suppressed errors, rerun with: -v
731 +ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
732 diff --git a/memcheck/tests/wrapmalloc.stdout.exp b/memcheck/tests/wrapmalloc.stdout.exp
734 index 0000000..60b5fd2
736 +++ b/memcheck/tests/wrapmalloc.stdout.exp
740 diff --git a/memcheck/tests/wrapmalloc.vgtest b/memcheck/tests/wrapmalloc.vgtest
742 index 0000000..a6dff4e
744 +++ b/memcheck/tests/wrapmalloc.vgtest
748 diff --git a/memcheck/tests/wrapmallocso.c b/memcheck/tests/wrapmallocso.c
750 index 0000000..985ce56
752 +++ b/memcheck/tests/wrapmallocso.c
757 +/* Fake malloc/free functions that just print something. When run
758 + under memcheck these functions will be intercepted and not print
761 +void *malloc ( size_t size )
763 + printf ("malloc\n");
767 +void free (void *ptr)
771 diff --git a/memcheck/tests/wrapmallocstatic.c b/memcheck/tests/wrapmallocstatic.c
773 index 0000000..be6573b
775 +++ b/memcheck/tests/wrapmallocstatic.c
780 +/* Test that a program that has malloc/free interposed in the
781 + executable is also intercepted. */
785 + printf ("start\n");
786 + void *p = malloc (1024);
792 +/* Fake malloc/free functions that just print something. When run
793 + under memcheck these functions will be intercepted and not print
796 +void *malloc ( size_t size )
798 + printf ("malloc\n");
802 +void free (void *ptr)
806 diff --git a/memcheck/tests/wrapmallocstatic.stderr.exp b/memcheck/tests/wrapmallocstatic.stderr.exp
808 index 0000000..d937776
810 +++ b/memcheck/tests/wrapmallocstatic.stderr.exp
815 + in use at exit: 0 bytes in 0 blocks
816 + total heap usage: 1 allocs, 1 frees, 1,024 bytes allocated
818 +For a detailed leak analysis, rerun with: --leak-check=full
820 +For counts of detected and suppressed errors, rerun with: -v
821 +ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
822 diff --git a/memcheck/tests/wrapmallocstatic.stdout.exp b/memcheck/tests/wrapmallocstatic.stdout.exp
824 index 0000000..60b5fd2
826 +++ b/memcheck/tests/wrapmallocstatic.stdout.exp
830 diff --git a/memcheck/tests/wrapmallocstatic.vgtest b/memcheck/tests/wrapmallocstatic.vgtest
832 index 0000000..7b3c068
834 +++ b/memcheck/tests/wrapmallocstatic.vgtest
836 +prog: wrapmallocstatic
838 diff -ur valgrind-3.11.0.orig/memcheck/tests/Makefile.in valgrind-3.11.0/memcheck/tests/Makefile.in
839 --- valgrind-3.11.0.orig/memcheck/tests/Makefile.in 2015-11-15 18:08:05.457930383 +0100
840 +++ valgrind-3.11.0/memcheck/tests/Makefile.in 2015-11-15 18:14:10.828008973 +0100
842 vcpu_fnfns$(EXEEXT) wcs$(EXEEXT) xml1$(EXEEXT) wrap1$(EXEEXT) \
843 wrap2$(EXEEXT) wrap3$(EXEEXT) wrap4$(EXEEXT) wrap5$(EXEEXT) \
844 wrap6$(EXEEXT) wrap7$(EXEEXT) wrap7so.so$(EXEEXT) \
845 - wrap8$(EXEEXT) writev1$(EXEEXT) $(am__EXEEXT_1) \
846 + wrap8$(EXEEXT) wrapmalloc$(EXEEXT) wrapmallocso.so$(EXEEXT) \
847 + wrapmallocstatic$(EXEEXT) writev1$(EXEEXT) $(am__EXEEXT_1) \
848 $(am__EXEEXT_2) $(am__EXEEXT_3) $(am__EXEEXT_4) \
852 wrap8_SOURCES = wrap8.c
853 wrap8_OBJECTS = wrap8.$(OBJEXT)
854 wrap8_LDADD = $(LDADD)
855 +am_wrapmalloc_OBJECTS = wrapmalloc.$(OBJEXT)
856 +wrapmalloc_OBJECTS = $(am_wrapmalloc_OBJECTS)
857 +wrapmalloc_LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(wrapmalloc_LDFLAGS) \
859 +am_wrapmallocso_so_OBJECTS = wrapmallocso_so-wrapmallocso.$(OBJEXT)
860 +wrapmallocso_so_OBJECTS = $(am_wrapmallocso_so_OBJECTS)
861 +wrapmallocso_so_LDADD = $(LDADD)
862 +wrapmallocso_so_LINK = $(CCLD) $(wrapmallocso_so_CFLAGS) $(CFLAGS) \
863 + $(wrapmallocso_so_LDFLAGS) $(LDFLAGS) -o $@
864 +wrapmallocstatic_SOURCES = wrapmallocstatic.c
865 +wrapmallocstatic_OBJECTS = wrapmallocstatic.$(OBJEXT)
866 +wrapmallocstatic_LDADD = $(LDADD)
867 writev1_SOURCES = writev1.c
868 writev1_OBJECTS = writev1.$(OBJEXT)
869 writev1_LDADD = $(LDADD)
871 $(varinfo5_SOURCES) $(varinfo5so_so_SOURCES) varinfo6.c \
872 varinforestrict.c vcpu_fbench.c vcpu_fnfns.c wcs.c wrap1.c \
873 wrap2.c wrap3.c wrap4.c wrap5.c wrap6.c $(wrap7_SOURCES) \
874 - $(wrap7so_so_SOURCES) wrap8.c writev1.c xml1.c
875 + $(wrap7so_so_SOURCES) wrap8.c $(wrapmalloc_SOURCES) \
876 + $(wrapmallocso_so_SOURCES) wrapmallocstatic.c writev1.c xml1.c
877 DIST_SOURCES = accounting.c addressable.c atomic_incs.c badaddrvalue.c \
878 badfree.c badjump.c badjump2.c badloop.c badpoll.c badrw.c \
879 big_blocks_freed_list.c brk2.c buflen_check.c bug155125.c \
881 $(varinfo5_SOURCES) $(varinfo5so_so_SOURCES) varinfo6.c \
882 varinforestrict.c vcpu_fbench.c vcpu_fnfns.c wcs.c wrap1.c \
883 wrap2.c wrap3.c wrap4.c wrap5.c wrap6.c $(wrap7_SOURCES) \
884 - $(wrap7so_so_SOURCES) wrap8.c writev1.c xml1.c
885 + $(wrap7so_so_SOURCES) wrap8.c $(wrapmalloc_SOURCES) \
886 + $(wrapmallocso_so_SOURCES) wrapmallocstatic.c writev1.c xml1.c
887 RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
888 ctags-recursive dvi-recursive html-recursive info-recursive \
889 install-data-recursive install-dvi-recursive \
890 @@ -1544,6 +1559,9 @@
891 wrap7.vgtest wrap7.stdout.exp wrap7.stderr.exp \
892 wrap8.vgtest wrap8.stdout.exp wrap8.stderr.exp \
893 wrap8.stdout.exp-ppc64 wrap8.stderr.exp-ppc64 \
894 + wrapmalloc.vgtest wrapmalloc.stdout.exp wrapmalloc.stderr.exp \
895 + wrapmallocstatic.vgtest wrapmallocstatic.stdout.exp \
896 + wrapmallocstatic.stderr.exp \
897 writev1.stderr.exp writev1.stderr.exp-solaris writev1.vgtest \
898 xml1.stderr.exp xml1.stdout.exp xml1.vgtest xml1.stderr.exp-s390x-mvc \
899 threadname.vgtest threadname.stderr.exp \
900 @@ -1662,6 +1680,24 @@
901 @VGCONF_OS_IS_DARWIN_TRUE@wrap7so_so_LDFLAGS = -fpic $(AM_FLAG_M3264_PRI) -dynamic \
902 @VGCONF_OS_IS_DARWIN_TRUE@ -dynamiclib -all_load
905 +# Build shared object for wrapmalloc
906 +wrapmalloc_SOURCES = wrapmalloc.c
907 +wrapmalloc_DEPENDENCIES = wrapmallocso.so
908 +@VGCONF_OS_IS_DARWIN_FALSE@wrapmalloc_LDADD = wrapmallocso.so
909 +@VGCONF_OS_IS_DARWIN_TRUE@wrapmalloc_LDADD = `pwd`/wrapmallocso.so
910 +@VGCONF_OS_IS_DARWIN_FALSE@wrapmalloc_LDFLAGS = $(AM_FLAG_M3264_PRI) \
911 +@VGCONF_OS_IS_DARWIN_FALSE@ -Wl,-rpath,$(top_builddir)/memcheck/tests
913 +@VGCONF_OS_IS_DARWIN_TRUE@wrapmalloc_LDFLAGS = $(AM_FLAG_M3264_PRI)
914 +wrapmallocso_so_SOURCES = wrapmallocso.c
915 +wrapmallocso_so_CFLAGS = $(AM_CFLAGS) -fpic
916 +@VGCONF_OS_IS_DARWIN_FALSE@wrapmallocso_so_LDFLAGS = -fpic $(AM_FLAG_M3264_PRI) -shared \
917 +@VGCONF_OS_IS_DARWIN_FALSE@ -Wl,-soname -Wl,wrapmallocso.so
919 +@VGCONF_OS_IS_DARWIN_TRUE@wrapmallocso_so_LDFLAGS = -fpic $(AM_FLAG_M3264_PRI) -dynamic \
920 +@VGCONF_OS_IS_DARWIN_TRUE@ -dynamiclib -all_load
922 xml1_CFLAGS = $(AM_CFLAGS) -D_GNU_SOURCE
925 @@ -2286,6 +2322,18 @@
926 @rm -f wrap8$(EXEEXT)
927 $(AM_V_CCLD)$(LINK) $(wrap8_OBJECTS) $(wrap8_LDADD) $(LIBS)
929 +wrapmalloc$(EXEEXT): $(wrapmalloc_OBJECTS) $(wrapmalloc_DEPENDENCIES) $(EXTRA_wrapmalloc_DEPENDENCIES)
930 + @rm -f wrapmalloc$(EXEEXT)
931 + $(AM_V_CCLD)$(wrapmalloc_LINK) $(wrapmalloc_OBJECTS) $(wrapmalloc_LDADD) $(LIBS)
933 +wrapmallocso.so$(EXEEXT): $(wrapmallocso_so_OBJECTS) $(wrapmallocso_so_DEPENDENCIES) $(EXTRA_wrapmallocso_so_DEPENDENCIES)
934 + @rm -f wrapmallocso.so$(EXEEXT)
935 + $(AM_V_CCLD)$(wrapmallocso_so_LINK) $(wrapmallocso_so_OBJECTS) $(wrapmallocso_so_LDADD) $(LIBS)
937 +wrapmallocstatic$(EXEEXT): $(wrapmallocstatic_OBJECTS) $(wrapmallocstatic_DEPENDENCIES) $(EXTRA_wrapmallocstatic_DEPENDENCIES)
938 + @rm -f wrapmallocstatic$(EXEEXT)
939 + $(AM_V_CCLD)$(LINK) $(wrapmallocstatic_OBJECTS) $(wrapmallocstatic_LDADD) $(LIBS)
941 writev1$(EXEEXT): $(writev1_OBJECTS) $(writev1_DEPENDENCIES) $(EXTRA_writev1_DEPENDENCIES)
942 @rm -f writev1$(EXEEXT)
943 $(AM_V_CCLD)$(LINK) $(writev1_OBJECTS) $(writev1_LDADD) $(LIBS)
944 @@ -2446,6 +2494,9 @@
945 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wrap7.Po@am__quote@
946 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wrap7so_so-wrap7so.Po@am__quote@
947 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wrap8.Po@am__quote@
948 +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wrapmalloc.Po@am__quote@
949 +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wrapmallocso_so-wrapmallocso.Po@am__quote@
950 +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wrapmallocstatic.Po@am__quote@
951 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/writev1.Po@am__quote@
952 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xml1-xml1.Po@am__quote@
954 @@ -3011,6 +3062,20 @@
955 @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
956 @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wrap7so_so_CFLAGS) $(CFLAGS) -c -o wrap7so_so-wrap7so.obj `if test -f 'wrap7so.c'; then $(CYGPATH_W) 'wrap7so.c'; else $(CYGPATH_W) '$(srcdir)/wrap7so.c'; fi`
958 +wrapmallocso_so-wrapmallocso.o: wrapmallocso.c
959 +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wrapmallocso_so_CFLAGS) $(CFLAGS) -MT wrapmallocso_so-wrapmallocso.o -MD -MP -MF $(DEPDIR)/wrapmallocso_so-wrapmallocso.Tpo -c -o wrapmallocso_so-wrapmallocso.o `test -f 'wrapmallocso.c' || echo '$(srcdir)/'`wrapmallocso.c
960 +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wrapmallocso_so-wrapmallocso.Tpo $(DEPDIR)/wrapmallocso_so-wrapmallocso.Po
961 +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wrapmallocso.c' object='wrapmallocso_so-wrapmallocso.o' libtool=no @AMDEPBACKSLASH@
962 +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
963 +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wrapmallocso_so_CFLAGS) $(CFLAGS) -c -o wrapmallocso_so-wrapmallocso.o `test -f 'wrapmallocso.c' || echo '$(srcdir)/'`wrapmallocso.c
965 +wrapmallocso_so-wrapmallocso.obj: wrapmallocso.c
966 +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wrapmallocso_so_CFLAGS) $(CFLAGS) -MT wrapmallocso_so-wrapmallocso.obj -MD -MP -MF $(DEPDIR)/wrapmallocso_so-wrapmallocso.Tpo -c -o wrapmallocso_so-wrapmallocso.obj `if test -f 'wrapmallocso.c'; then $(CYGPATH_W) 'wrapmallocso.c'; else $(CYGPATH_W) '$(srcdir)/wrapmallocso.c'; fi`
967 +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wrapmallocso_so-wrapmallocso.Tpo $(DEPDIR)/wrapmallocso_so-wrapmallocso.Po
968 +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wrapmallocso.c' object='wrapmallocso_so-wrapmallocso.obj' libtool=no @AMDEPBACKSLASH@
969 +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
970 +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wrapmallocso_so_CFLAGS) $(CFLAGS) -c -o wrapmallocso_so-wrapmallocso.obj `if test -f 'wrapmallocso.c'; then $(CYGPATH_W) 'wrapmallocso.c'; else $(CYGPATH_W) '$(srcdir)/wrapmallocso.c'; fi`
973 @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(xml1_CFLAGS) $(CFLAGS) -MT xml1-xml1.o -MD -MP -MF $(DEPDIR)/xml1-xml1.Tpo -c -o xml1-xml1.o `test -f 'xml1.c' || echo '$(srcdir)/'`xml1.c
974 @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/xml1-xml1.Tpo $(DEPDIR)/xml1-xml1.Po