[lttng-dev] [PATCH] Force static_alloc setup to be written into memory
Mathieu Desnoyers
mathieu.desnoyers at efficios.com
Fri Feb 14 10:12:20 EST 2014
----- Original Message -----
> From: "Alexander Monakov" <amonakov at ispras.ru>
> To: "Paul Woegerer" <paul_woegerer at mentor.com>
> Cc: lttng-dev at lists.lttng.org, "mathieu desnoyers" <mathieu.desnoyers at efficios.com>, "stefan seefeld"
> <stefan_seefeld at mentor.com>, paulmck at linux.vnet.ibm.com
> Sent: Friday, February 14, 2014 9:23:19 AM
> Subject: Re: [lttng-dev] [PATCH] Force static_alloc setup to be written into memory
>
>
>
> On Fri, 14 Feb 2014, Paul Woegerer wrote:
>
> > As explained by Alexander Monakov, dlsym() is defined to be pure, thus the
> > compiler is allowed to assume that there is no need to write the changes
> > performed by setup_static_allocator() into memory prior to calling dlsym().
> > The added cmm_barrier() forces the compiler to write the changes into
> > memory.
> >
> > For more details refer to:
> > http://lists.lttng.org/pipermail/lttng-dev/2014-February/022389.html
>
> If everyone here agrees that this is a workaround for a glibc bug, please add
> a note to that effect in the patch and please notify glibc upstream (again).
>
> FWIW, when toying with a similar code I implemented a different workaround
> along the lines of
>
> #define dlsym glibc_dlsym_proto_lies_about_leafness
> #include <dlfcn.h>
> #undef dlsym
>
> extern void *dlsym(void *, const char *);
>
>
> Thus avoiding the need to sprinkle unneeded compiler memory barriers in code.
Good idea, this is what I did in the final fix.
It's pushed as:
commit f02baefb3ba4d5493816d63f65625ba4269224d2
Author: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
Date: Fri Feb 14 10:02:51 2014 -0500
Fix: work-around glibc lying about dlsym()/dlerror() leafness
Especially in the LTTng-UST malloc instrumentation, we run into the
following situation:
1) Our calloc wrapper is called,
2) we setup the static allocator,
3) we call dlsym() to lookup the symbol of the real allocator,
4) dlsym() calls into calloc(), which is overridden by our own wrapper.
Our calloc does not see that the static allocator has been set,
because the stores setting up the static allocator have been optimized
away by gcc-4.8 (in O2), because the dlsym() prototype declares it
with the "leaf" attribute, and thus we end up doing an infinite
recursion, and eventually a segmentation fault.
Thanks to Alexander Monakov for pointing out the culprit of this glibc
bug.
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
Thanks for your input !!
Mathieu
>
> HTH
> Alexander
>
--
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com
More information about the lttng-dev
mailing list