[FFmpeg-devel] [PATCH] restoring binary compatibility with ffmpeg 0.5
Måns Rullgård
mans
Mon Jun 7 10:54:35 CEST 2010
Michael Niedermayer <michaelni at gmx.at> writes:
> On Mon, Jun 07, 2010 at 07:52:11AM +0200, Reinhard Tartler wrote:
>> On Mo, Jun 07, 2010 at 01:44:30 (CEST), Michael Niedermayer wrote:
>>
>> >> > we can duplicate the symbols and code in lavf under #if
>> >>
>> >> I suspect that might cause a conflict during linking since the same
>> >> symbol would be provided by two libraries. If it doesn't fail, the
>> >> version chosen is unpredictable. We'd end up with apps linked against
>> >> a mix of sym at LIBAVFORMAT_XX and sym at LIBAVCODEC_XX which is obviously
>> >> not good.
>> >
>> > marking one as weak symbol might work.
>> > weak symbols are part of the ELF spec ... doesnt mean gnu tools support
>> > them of course ;)
>>
>> I've (of course) tried that as well, but it doesn't work in this
>> case. The problem here is that you must not create symbol collisions in
>> the same compilation unit. Removing the symbols from libavcodec, even
>> conditionally, is not an option that we have. Using weak symbols, like
>> this version
>>
>> #if HAVE_SYMBOL_VERSIONING && LIBAVFORMAT_VERSION_MAJOR < 53
>> /* compatibility trampolines for packet functions */
>>
>> #define av_weak_alias(x) __attribute__ (( weak, alias ("x") ))
>>
>> void av_init_packet(AVPacket *pkt) av_weak_alias(av_init_packet);
>> void av_init_packet(AVPacket *pkt)
>
> what about
>
> void __attribute__ (( weak )) av_init_packet(AVPacket *pkt)
That still relies on the compiler supporting this attribute, which
some of them do not, so it's out of the question.
>> {
>> av_log(NULL, AV_LOG_WARNING, "diverting av_*_packet function calls to libavcodec. Recompile to improve performance\n");
>> av_init_packet(pkt);
>> }
>
> ?
>
> [...]
>
>> - using weak symbols (doesn't support duplicate symbols)
>
> elf spec:
> Global and weak symbols differ in two major ways.
> When the link editor combines several relocatable object files,
But that's not what we're doing here. We're using multiple shared
objects to resolve the undefined symbols while creating an executable.
> it does not allow multiple denitions of STB_GLOBAL symbols with
> the same name. On the other hand, if a defined global symbol
> exists, the appearance of a weak symbol with the same name will
> not cause an error. The link editor honors the global
> definition and ignores the weak ones. Similarly, if a common
> symbol exists (i.e., a symbol whose st_shndx field holds
> SHN_COMMON), the appearance of a weak symbol with the same name
> will not cause an error. The link editor honors the common
> definition and ignores the weak ones. When the link editor
> searches archive libraries, it extracts archive members that
> contain definitions of undefined global symbols. The member
> definition may be either a global or a weak symbol. The link
> editor does not extract archive members to resolve undfiened
> weak symbols. Unresolved weak symbols have a zero value.
This is all talking about combining multiple object files into a
single executable or shared object, not resolving symbols against
multiple shared objects.
--
M?ns Rullg?rd
mans at mansr.com
More information about the ffmpeg-devel
mailing list