[FFmpeg-devel] [PATCH] restoring binary compatibility with ffmpeg 0.5
Reinhard Tartler
siretart
Thu Jun 10 12:57:42 CEST 2010
On Thu, Jun 10, 2010 at 11:38:52 (CEST), Michael Niedermayer wrote:
> On Thu, Jun 10, 2010 at 09:52:13AM +0100, M?ns Rullg?rd wrote:
>> Reinhard Tartler <siretart at tauware.de> writes:
>>
>> > On Wed, Jun 09, 2010 at 19:41:33 (CEST), Michael Niedermayer wrote:
>> >
>> >> On Wed, Jun 09, 2010 at 03:42:13PM +0200, Reinhard Tartler wrote:
>> >>> Two questions:
>> >>> a) doesn't this attribute need to be at symbol declaration and not
>> >>> definition?
>> >>
>> >> The way i understand it, it needs to be at the definition
>> >> at the declaration it possibly means a weak refernce which is something
>> >> that is 0 (instead of failing to link) if no definition is found
>> >
>> > I see.
>> >
>> > I've now tried your suggestion to (re)introduce the functions like you
>> > propose:
>> >
>> > #if LIBAVFORMAT_VERSION_MAJOR < 53
>> > [...]
>> > void __attribute__((weak)) av_init_packet(AVPacket *pkt)
>> > {
>> > abort();
>> > }
>> > #endif
>> >
>> > building a shared libavformat.so works without warnings/errors regarding
>> > symbol collisions and results this
>> >
>> > $ readelf -s /tmp/ffmpeg-trunk/lib/libavformat.so | grep av_init_packet@
>> > 466: 000abc00 8 FUNC WEAK DEFAULT 13 av_init_packet@@LIBAVFORMAT_52
>> >
>> > I guess this is exactly what you've expected here.
>> >
>> > With this setup, I've now tried both the ffplay binary from this
>> > compilation and the system /usr/bin/ffplay (based on version 0.5.2). In
>> > *both* cases, it seems that the binary at runtime picks up the version
>> > in libavformat:
>> >
>> >>> readelf -s /tmp/ffmpeg-trunk/bin/ffplay | grep av_init_packet
>> > 49: 00000000 0 FUNC GLOBAL DEFAULT UND av_init_packet at LIBAVFORMAT_52 (10)
>> >
>> >>> /tmp/ffmpeg-trunk/bin/ffplay /tmp/foo.avi
>> > FFplay version SVN-r23556, Copyright (c) 2003-2010 the FFmpeg developers
>> > built on Jun 10 2010 08:09:17 with gcc 4.4.3
>> > configuration: --enable-avfilter --enable-libvpx --enable-shared --disable-static --enable-gpl --prefix=/tmp/ffmpeg-trunk --enable-postproc --enable-libvorbis
>> > libavutil 50.18. 0 / 50.18. 0
>> > libavcodec 52.75. 1 / 52.75. 1
>> > libavformat 52.68. 0 / 52.68. 0
>> > libavdevice 52. 2. 0 / 52. 2. 0
>> > libavfilter 1.20. 0 / 1.20. 0
>> > libswscale 0.11. 0 / 0.11. 0
>> > libpostproc 51. 2. 0 / 51. 2. 0
>> > zsh: abort /tmp/ffmpeg-trunk/bin/ffplay /srv/media/UDS-Sevilla.avi
>>
>> This is what I would expect. The weak attribute is only used when
>> combining relocatable object files in to an executable or shared
>> object, not during runtime dynamic linking.
>
> until reinhard posts a readelf of libavcodec that shows a global
> av_init_packet at LIBAVFORMAT_52 this conclusion is unfounded
Right, I did not change the version tag in libavcodec. But also adding
it doesn't matter:
$ readelf -s /tmp/ffmpeg-trunk/lib/libavcodec.so | grep av_init_packet@
1280: 000c3d90 88 FUNC GLOBAL DEFAULT 13 av_init_packet@@LIBAVFORMAT_52
$ readelf -s /tmp/ffmpeg-trunk/lib/libavformat.so | grep av_init_packet@
466: 000abc00 8 FUNC WEAK DEFAULT 13 av_init_packet@@LIBAVFORMAT_52
$ readelf -s /tmp/ffmpeg-trunk/bin/ffplay | grep av_init_packet@
49: 00000000 0 FUNC GLOBAL DEFAULT UND av_init_packet at LIBAVFORMAT_52 (10)
$ /tmp/ffmpeg-trunk/bin/ffplay /srv/media/UDS-Sevilla.avi
FFplay version SVN-r23556, Copyright (c) 2003-2010 the FFmpeg developers
built on Jun 10 2010 08:09:17 with gcc 4.4.3
configuration: --enable-avfilter --enable-libvpx --enable-shared --disable-static --enable-gpl --prefix=/tmp/ffmpeg-trunk --enable-postproc --enable-libvorbis
libavutil 50.18. 0 / 50.18. 0
libavcodec 52.75. 1 / 52.75. 1
libavformat 52.68. 0 / 52.68. 0
libavdevice 52. 2. 0 / 52. 2. 0
libavfilter 1.20. 0 / 1.20. 0
libswscale 0.11. 0 / 0.11. 0
libpostproc 51. 2. 0 / 51. 2. 0
zsh: abort /tmp/ffmpeg-trunk/bin/ffplay /srv/media/UDS-Sevilla.avi
$ /usr/bin/ffplay /srv/media/UDS-Sevilla.avi
FFplay version SVN-r0.5.1-4:0.5.1-1ubuntu1, Copyright (c) 2003-2009 Fabrice Bellard, et al.
configuration: --extra-version=4:0.5.1-1ubuntu1 --prefix=/usr --enable-avfilter --enable-avfilter-lavf --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --disable-stripping --disable-vhook --enable-runtime-cpudetect --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --enable-shared --disable-static
libavutil 49.15. 0 / 49.15. 0
libavcodec 52.20. 1 / 52.75. 1
libavformat 52.31. 0 / 52.68. 0
libavdevice 52. 1. 0 / 52. 2. 0
libavfilter 0. 4. 0 / 0. 4. 0
libswscale 0. 7. 1 / 0.11. 0
libpostproc 51. 2. 0 / 51. 2. 0
built on Mar 4 2010 12:35:30, gcc: 4.4.3
zsh: abort /usr/bin/ffplay /srv/media/UDS-Sevilla.avi
anything else I can/should try?
--
Gruesse/greetings,
Reinhard Tartler, KeyID 945348A4
More information about the ffmpeg-devel
mailing list