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 :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list