[FFmpeg-devel] ABI break in 5.1

Jan Engelhardt jengelh at inai.de
Sat Jul 23 20:36:03 EEST 2022


On Saturday 2022-07-23 16:32, Nicolas George wrote:
>
>No, the ELF symbol version system cannot prevent you from replacing a
>file with an older version.

The information in ELF helps package managers prevent such
replacement. If I even try as much as propose a glibc downgrade to
rpm, this will happen:

# rpm -Uhv glibc-2.31-7.30.x86_64.rpm --oldpackage
error: Failed dependencies:
        libc.so.6(GLIBC_2.32)(64bit) is needed by (installed) coreutils-9.0-7.1.x86_64
        libc.so.6(GLIBC_2.33)(64bit) is needed by (installed) libpmem1-1.11.1-1.5.x86_64
        libc.so.6(GLIBC_2.34)(64bit) is needed by (installed) libvpx7-1.11.0-3.4.x86_64
        libm.so.6(GLIBC_2.35)(64bit) is needed by (installed) perl-base-5.36.0-2.1.x86_64

Of course, you can always mv/rm behind the manager's back or use rpm
--force, but that's not the point!

At the time vpx was built, it engrained the symvers of the functions
it uses into itself, therefore e.g. `readelf -aW
/usr/lib64/libvpx.so.7`:

Version symbols section '.gnu.version' contains 93 entries:
 Addr: 0x0000000000001576  Offset: 0x001576  Link: 4 (.dynsym)
  000:   0 (*local*)       2 (GLIBC_2.2.5)   3 (GLIBC_2.34)    4 (GLIBC_2.3.2)
  004:   5 (GLIBC_2.2.5)   6 (GLIBC_2.11)    5 (GLIBC_2.2.5)   7 (GLIBC_2.29) 
  008:   8 (GLIBC_2.3.4)   1 (*global*)      5 (GLIBC_2.2.5)   4 (GLIBC_2.3.2)
  00c:   8 (GLIBC_2.3.4)   5 (GLIBC_2.2.5)   3 (GLIBC_2.34)    5 (GLIBC_2.2.5)
  010:   3 (GLIBC_2.34)    9 (GLIBC_2.27)    8 (GLIBC_2.3.4)   5 (GLIBC_2.2.5)
  014:   3 (GLIBC_2.34)    5 (GLIBC_2.2.5)   8 (GLIBC_2.3.4)   1 (*global*)   
  018:   3 (GLIBC_2.34)    7 (GLIBC_2.29)    5 (GLIBC_2.2.5)   1 (*global*)   
  01c:   4 (GLIBC_2.3.2)   5 (GLIBC_2.2.5)   3 (GLIBC_2.34)    5 (GLIBC_2.2.5)
  020:   5 (GLIBC_2.2.5)   5 (GLIBC_2.2.5)   3 (GLIBC_2.34)    5 (GLIBC_2.2.5)
  024:   a (GLIBC_2.4)     8 (GLIBC_2.3.4)   4 (GLIBC_2.3.2)   5 (GLIBC_2.2.5)
  028:   5 (GLIBC_2.2.5)   2 (GLIBC_2.2.5)   5 (GLIBC_2.2.5)   5 (GLIBC_2.2.5)
  02c:   5 (GLIBC_2.2.5)   4 (GLIBC_2.3.2)   3 (GLIBC_2.34)    7 (GLIBC_2.29) 
  030:   2 (GLIBC_2.2.5)   5 (GLIBC_2.2.5)   5 (GLIBC_2.2.5)   b (GLIBC_2.14) 
  034:   1 (*global*)      1 (*global*)      1 (*global*)      1 (*global*)   

Managers can and do evaluate that and turn that into a dependency
*without any person having to manually add "Requires: glibc >= 2.34"
to the libvpx description*. This of course requires that the project
followed the procedures to create the symvers definitions, which
glibc did.

Seriously, why do I have to explain this all the time.


More information about the ffmpeg-devel mailing list