[Speex-dev] speex-1.2rc1 breaks ABI on OS X
Hanspeter Niederstrasser
fink at snaggledworks.com
Mon Aug 2 12:12:14 PDT 2010
On 8/2/10 9:17 AM, Jean-Marc Valin wrote:
> The part of the ABI that changed was never actually frozen to begin with. The
> stable part of the ABI (i.e. the codec part) is still the same as it was back
> in 1.0.
>
> Jean-Marc
Thanks for the reply. The problem is that during compilation, Darwin's
linker marks which linked library provides each symbol (determined by
the install name) and at runtime, dyld only searches that library for
that symbol.
So now, something that linked to the old prebeta3 libspeex.1.dylib and
needs, for example _speex_echo_cancel, will fail when the new postbeta3
libspeex.1.dylib is present. It will not look for it in
libspeexdsp.1.dylib. So now, if one package was built against the old
speex and a new package is built against the new speex, the new speex
must first be placed into some random dir like $PREFIX/lib/speex-b3 to
prevent a filename collision.
From what I understand of libtool versioning, any time an interface is
removed, the install name (Darwin's soname) needs to be bumped (via
-version_info flag in Makefile.am, or updating CURRENT or some similar
method) in order to maintain portability. I now understand that the ABI
for those things wasn't frozen, but those symbols were available and
things could have linked against them, and now they're missing.
Hanspeter
More information about the Speex-dev
mailing list