[libvirt] [PATCH] util: avoid symbol clash between json libraries
Daniel P. Berrangé
berrange at redhat.com
Tue Jul 31 16:32:40 UTC 2018
On Tue, Jul 31, 2018 at 11:28:02AM -0500, Eric Blake wrote:
> On 07/31/2018 09:55 AM, Daniel P. Berrangé wrote:
> > The jansson and json-glib libraries both export symbols with a json_
> > name prefix and json_object_iter_next() clashes between them.
> >
> > Unfortunately json_glib is linked in by GTK, so any app using GTK and
> > libvirt will get a clash, resulting in SEGV. This also affects the NSS
> > module provided by libvirt
> >
> > Instead of directly linking to jansson, use dlopen() with the RTLD_LOCAL
> > flag which allows us to hide the symbols from the application that loads
> > libvirt or the NSS module.
> >
> > Some preprocessor black magic and wrapper functions are used to redirect
> > calls into the dlopen resolved symbols.
>
> Would using dlmopen() instead of dlopen() make this task any easier?
Not available on *BSD
>
> Otherwise, this looks reasonable to me, and is preferable to Jan's proposal
> to revert jansson support.
>
> > +++ b/src/util/virjsoncompat.c
>
> > +
> > +static int virJSONJanssonOnceInit(void)
> > +{
> > + void *handle = dlopen("libjansson.so.4", RTLD_LAZY|RTLD_LOCAL|RTLD_DEEPBIND|RTLD_NODELETE);
>
> RTLD_DEEPBIND might be specific to glibc; is this going to cause any
> compilation issues on BSD machines?
Yeah it broke BSD, so removed in v2.
> > +int json_array_append_new_impl(json_t *array, json_t *value)
> > +{
> > + return json_array_append_new_ptr(array, value);
> > +}
>
> Would it be possible with __typeof__ to write a macro to make this
> forwarding more compact (one line per stem, instead of open-coding each
> renamed function)? Looking something like:
>
> #define FORWARD(name, params, args) \
> __typeof__(name # _impl) name # _impl params { \
> return name # _ptr args; \
> }
>
> FORWARD(json_array, (void), ())
> FORWARD(json_array_append_new, (json_t * array, json_t *value),
> (array, value))
>
> (hmm, that's still a bit verbose; I'm not sure if the preprocessor could be
> cajoled into even less repetition of parameter names)
I'm not too fussed about the verbosity as this is write-once code (i hope).
Regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
More information about the libvir-list
mailing list