Hi! On Sun, 2025-12-07 at 12:04:40 +0100, Aurelien Jarno wrote: > Package: dpkg-dev > Version: 1.22.21 > Severity: wishlist > Control: block 1122038 by -1
> When symbol versioning is in use, the '.gnu.version_r' section records > all symbol version requirements declared by the binary for each of its > shared library dependencies. At runtime, ld.so checks that all symbol > versions are provided by the target library and refuse to run if a > required symbol version is missing. > > On its side, dpkg-shlibdeps computes versioned dependencies only from > the versions used by the symbols (from the '.dynsym' section). This > works fine as long as every symbol version required by the binary is > also reference by at least one symbol. > > Unfortunately, recent binutils and glibc versions started to use the > symbol version requirements from section '.gnu.version_r' as ABI flags, > meaning they do not have symbols associated with them. For instance the > 'GLIBC_ABI_GNU_TLS' symbol on i386, which triggered the issue in bug > #1122038. It is not seen by dpkg-shlibdeps, causing the generated > dependency on libc6 to be lower than what is actually need at runtime, > and the binary fails to start with older glibc. > > Would it be possible for dpkg-shlibdeps to handle the requirements found > in the '.gnu.version_r' section? In the above case it means that an > entry for GLIBC_ABI_GNU_TLS in the '.gnu.version_r' section would match > the ' GLIBC_ABI_GNU_TLS@GLIBC_ABI_GNU_TLS 2.42' in the symbols file. Ah, hmm, that's unfortunate. The attached patch seems to fix this for me (once I removed the workaround from the libc6:i386.symbols file from the chroot. I've queued the patch for my next push, which will be part of the 1.23.0 release. Thanks, Guillem
From ae5057e32f399759ea13f715e79e305747226fe2 Mon Sep 17 00:00:00 2001 From: Guillem Jover <[email protected]> Date: Mon, 8 Dec 2025 01:23:23 +0100 Subject: [PATCH] Dpkg::Shlibs::Objdump::Object: Add support for "Version References" symbols New binutils can emit dependencies on specific versions via the DT_VERNEED tags in the .gnu.version_r section. But these dependencies are not exposed in the Dynamic Symbol Table. Inject those dependencies as if they were normal undefined symbols into the object metadata. Closes: #1122107 --- scripts/Dpkg/Shlibs/Objdump/Object.pm | 36 +++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/scripts/Dpkg/Shlibs/Objdump/Object.pm b/scripts/Dpkg/Shlibs/Objdump/Object.pm index cc635a24e..63e944ffd 100644 --- a/scripts/Dpkg/Shlibs/Objdump/Object.pm +++ b/scripts/Dpkg/Shlibs/Objdump/Object.pm @@ -109,6 +109,7 @@ sub parse_objdump_output { my ($self, $fh) = @_; my $section = 'none'; + my $verneed_lib = undef; while (<$fh>) { s/\s*$//; next if length == 0; @@ -164,6 +165,12 @@ sub parse_objdump_output { $self->{RPATH} = [ split /:/, $rpath ]; } } + } elsif ($section eq 'verref') { + if (/^\s*required from ([^:]*):/) { + $verneed_lib = $1; + } elsif (/^\s*0x[[:xdigit:]]*\s*0x[[:xdigit:]]*\s*\d*\s*(.*)/) { + $self->add_verneed_symbol($verneed_lib, $1); + } } elsif ($section eq 'program') { if (/^\s*INTERP\s+/) { $self->{INTERP} = 1; @@ -307,6 +314,35 @@ sub apply_relocations { } } +# Inject the version reference dependency as an undefined symbol into the +# dynamic symbol information. +# +# We do not currently use the $solib name, which would denote a stronger +# tighter dependency on a specific shared object, but for now this should +# suffice. +sub add_verneed_symbol($self, $solib, $name) +{ + my $symbol = { + name => $name, + version => $name, + section => '*UND*', + dynamic => 1, + debug => 0, + type => 'O', + weak => 0, + local => 0, + global => 1, + visibility => '', + hidden => '', + defined => 0, + }; + + # Register artificial symbol. + $self->add_dynamic_symbol($symbol); + + return; +} + sub add_dynamic_symbol { my ($self, $symbol) = @_; $symbol->{objid} = $symbol->{soname} = $self->get_id(); -- 2.51.0

