[FFmpeg-devel] [PATCH] restoring binary compatibility with ffmpeg 0.5

Reinhard Tartler siretart
Mon Jun 7 11:08:46 CEST 2010


On Mo, Jun 07, 2010 at 10:40:04 (CEST), Michael Niedermayer wrote:

> 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)
>
>> {
>>     av_log(NULL, AV_LOG_WARNING, "diverting av_*_packet function calls to libavcodec. Recompile to improve performance\n");
>>     av_init_packet(pkt);
>> }
>
> ?

did you try that? In my tests, I get these compiler errors:

causes this compiler error:
.../ffmpeg/libavformat/utils.c:326: error: redefinition of 'av_init_packet'
.../ffmpeg/libavformat/utils.c:325: note: previous definition of 'av_init_packet' was here


> [...]
>
>>  - 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,
>      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 edi- tor 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.
>
> [...]

-- 
Gruesse/greetings,
Reinhard Tartler, KeyID 945348A4




More information about the ffmpeg-devel mailing list