[pulseaudio-discuss] [PATCH 21/56] bluetooth: Create pa_bluetooth_discovery for BlueZ 5

Tanu Kaskinen tanu.kaskinen at linux.intel.com
Mon Jul 29 03:40:12 PDT 2013


On Thu, 2013-07-25 at 00:11 -0300, João Paulo Rechi Vita wrote:
> On Jul 18, 2013 10:32 AM, "Tanu Kaskinen" <tanu.kaskinen at linux.intel.com>
> wrote:
> > So there will be bluez4-util.so and bluez5-util.so, and those will
> > contain identical symbols. It's possible to load both bluez 4 and 5
> > modules at the same time, so the bluez*-util libraries will conflict in
> > a way that will cause crashing or weird behavior. Since we lost the
> > opportunity to have a shared Bluetooth core for all backends, I think it
> > would be OK to change the generic "pa_bluetooth" prefix (and "pa_bt", if
> > it's still used somewhere) to "pa_bluez5". That would resolve the symbol
> > conflict between the two libraries.
> >
> 
> Good catch, I haven't thought about this problem before.
> 
> > Another, perhaps easier solution would be to use symbol versioning in
> > the libraries. I'm not 100% sure that this works, but I think it should
> > work.
> >
> 
> How does it works? I have never done or seen it anywhere.

We use symbol versioning for libpulse. We have this in configure.ac:

    # Check whether the linker supports the -version-script option.
    # The Make variable $(srcdir) needs to be in the LDFLAGS in that form,
    # so that it is expanded the right way in every subdir.
    AX_CHECK_LINK_FLAG(["-Wl,-version-script=${srcdir}/src/map-file"],
        [VERSIONING_LDFLAGS='-Wl,-version-script=$(abs_top_srcdir)/src/map-file'])
    AC_SUBST([VERSIONING_LDFLAGS])

So the -Wl,-version-script=foo is what tells the linker to use symbol
versioning. In Makefile.am we use VERSIONING_FLAGS like this:

    libpulse_la_LDFLAGS = $(AM_LDFLAGS) $(VERSIONING_LDFLAGS) -version-info $(LIBPULSE_VERSION_INFO)

and

    libpulse_simple_la_LDFLAGS = $(AM_LDFLAGS) $(VERSIONING_LDFLAGS) -version-info $(LIBPULSE_SIMPLE_VERSION_INFO)

and

    libpulse_mainloop_glib_la_LDFLAGS = $(AM_LDFLAGS) $(VERSIONING_LDFLAGS) -version-info $(LIBPULSE_MAINLOOP_GLIB_VERSION_INFO)

The contents of src/map-file are as follows:

    PULSE_0 {
    global:
    pa_ascii_filter;
    pa_ascii_valid;
    pa_bytes_per_second;
    pa_bytes_snprint;
    pa_bytes_to_usec;
    pa_channel_map_can_balance;
    pa_channel_map_can_fade;
    ...
    local:
    *;
    };

All public functions are listed under "global:", and "local:" matches
everything else. Functions marked as local are usable by the shared
library itself only, they aren't linkable from outside.

PULSE_0 is the namespace or "version" for the listed functions. In case
of bluez*-util, the namespace would be different for the two libraries,
which hopefully would cause the linker to distinguish between the two
sets of symbols. I don't know any way to check the version information
of linked symbols of a running executable, so the only good way to
verify that this actually works would be to run pulseaudio with both
bluez 5 and bluez 4 modules loaded, and swap the bluetoothd version
while pulseaudio is running. If pulseaudio is able to stream audio to a
headset regardless of the running bluetoothd version, then the symbol
versioning is working.

I would prefer changing the symbol prefix from pa_bluetooth to
pa_bluez5, because it's simper and more fool-proof, but if you choose to
implement symbol versioning instead, that's acceptable to me.

-- 
Tanu



More information about the pulseaudio-discuss mailing list