Control: tag -1 - moreinfo
Control: clone -1 -2
Control: retitle -1 gcc-7: Discarded unused code leaves entry on .gnu.version_r
Control: reassign -1 gcc-7
Control: retitle -2 network-manager: Unused code causes gcc to leave unused 
version reference
Control: reassign -2 network-manager

Hi!

On Sun, 2017-09-10 at 22:12:13 +0100, Dimitri John Ledkov wrote:
> On 10 September 2017 at 15:03, Guillem Jover <guil...@debian.org> wrote:
> > On Thu, 2017-09-07 at 16:16:49 +0100, Dimitri John Ledkov wrote:
> >> Package: dpkg
> >> Version: 1.18.24
> >> Severity: important
> >
> >> I am attaching the objdump to this bug report. In that log, one can
> >> see that the highest symbol referenced by Dynamic symbol table is for
> >> GLIBC_2.17 which is the dependency dpkg-shlibs generates.
> >>
> >> However, in the `Version References' section, one can see that
> >> GLIBC_2.25 is required.
> >>
> >> The net result is that libc6 (>= 2.17) is generated, instead of the
> >> required libc6 (>= 2.25).
> >>
> >> The binaries are not executable when e.g. 2.24 glibc is installed and
> >> fail like so:
> >>
> >> # ldd /usr/sbin/NetworkManager
> >> /usr/sbin/NetworkManager: /lib/x86_64-linux-gnu/libc.so.6: version
> >> `GLIBC_2.25' not found (required by /usr/sbin/NetworkManager)
> >>
> >> I am not sure how glibc managed to generate a Version reference,
> >> without using any of the dynamic symbols from 2.25.
> >
> > I've built and checked the resulting binary, by objdump'ing everything
> > I could think of, and I was unable to see why the version reference
> > had been picked up.
> >
> >> Reading the code, it seems like maybe dpkg-shlibdeps needs to grow the
> >> ability to parse "Version References" section of the objdump and use
> >> version symbols referenced there to bump up requirements just like
> >> dynamic symbols do?
> >
> > Before doing that I'd like to first understand why that is the case, if
> > it's expected and not a bug in the toolchain or similar.
> 
> That is a very reasonable question. Given that the version dep is 2.25
> I went through the glibc abi lists to see what was new in 2.25.
> A few things from those are referenced in the NetworkManager but
> unused (e.g. makedev()) and thus did not gain a dep (e.g dropping that
> function did not result in getting the ABI back lower).
> However, in the partial embedded copy of systemd there is embeded
> implementation of explicit_bzero if glibc does not provide one.
> It seems that NetworkManager included the declaration check too in
> their configure.ac such that with glibc 2.25+ explicit_bzero from libc
> starts to be referenced.
> However, in the end, none of the bits that NetworkManager actual use
> hit the string_erase function and thus do not call explicit_bzero.
> Thus it looks like compiler did compile / link usage of
> explicit_bzero, and eventually dropped it, yet version info persistent
> to the end binaries/libraries.
> With the attached patch, builds of network-manager end up not having
> GLIBC_2.25 version reference.

Thanks for the investigation! When I also checked the new symbols in
glibc, I also suspected that explicit_bzero was a very probable
candidate, but it was not obvious why, simply from the glibc side.

> Is this normal toolchain behaviour to not optimise out version
> references, when all symbols are optimised out?
> The code is crazy, but I would have expected optimised out things to
> remove version references too.

Yes, that looks like a bug to me, if the code gets removed then the
versioned references should also be removed, otherwise we are
unnecessarily demanded a version that is greater than it's really needed.

Reassigning both to gcc-7 to get this fixed there (assuming this is
not a binutils problem?), and to network-manager to workaround the
issue for now.

I'm not sure if gcc-6 is affected, if it is, please clone another one
into that.

Thanks,
Guillem

Reply via email to