Use absolute file names in NEED instead of adding many entries to RUNPATH

  • Done
  • quality assurance status badge
Details
One participant
  • Ludovic Courtès
Owner
unassigned
Submitted by
Ludovic Courtès
Severity
normal
L
L
Ludovic Courtès wrote on 10 Mar 2017 16:01
(address . bug-guix@gnu.org)
87zigt89cf.fsf@gnu.org
Hello!

As Andy just noted on IRC, shared library lookup is inefficient in Guix,
because there’s one entry per library in RUNPATH. So we get:

Toggle snippet (8 lines)
open("/gnu/store/y8ppqsxiki39n4mqpb4mab6bgwqsnnp7-libgc-7.4.2/lib/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/gnu/store/w0bkj9qh7iqcklm5ld8ghg1ynnzqyv00-libffi-3.2.1/lib/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/gnu/store/d5gw4i6bnyznmbr55ba39bl3pgrhsyp0-libunistring-0.9.6/lib/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/gnu/store/6k08nkddnrb15h5pwp1s0fa94mr1qas9-gmp-6.1.1/lib/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/gnu/store/9yn89bkl8vcg5rh9dmw3jijciwgrwjls-libltdl-2.4.6/lib/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/gnu/store/iwgi9001dmmihrjg4rqhd6pa6788prjw-glibc-2.24/lib/libm.so.6", O_RDONLY|O_CLOEXEC) = 3

An alternate approach would be for ld-wrapper to replace “-lfoo” with
“/gnu/store/…/libfoo.so”, which would add the absolute file name as
NEEDed in the ELF file.

Ludo’.
L
L
Ludovic Courtès wrote on 5 Sep 2017 16:57
Re: ‘core-updates’ is back!
(name . Ricardo Wurmus)(address . rekado@elephly.net)
87zia9p50b.fsf@gnu.org
Ricardo Wurmus <rekado@elephly.net> skribis:

Toggle quote (21 lines)
> Andy wrote:
>
>> It would be pretty cool if we could fix our O(n^2) problems in search
>> paths in this core-updates -- basically whenever you go to create an
>> environment, instead of making e.g. VAR=A:B:C:..., for all VARs
>> (LIBRARY_PATH, PKG_CONFIG_PATH, etc), instead we make a union directory
>> Z containing the union of A, B, C, etc and set VAR=Z. The goal would be
>> to fix quadratic run-time lookup costs by replacing it with a
>> compile-time computation. This applies to many lookups: PATH, -rpath,
>> etc.
>
> Ludo wrote:
>
>> A possible alternative solution for ld.so is at
>> <https://bugs.gnu.org/26048>.
>
> Do you know of any negative side effects this would have? For example,
> would it not become impossible to override libraries at runtime with
> LD_LIBRARY_PATH or LD_PRELOAD when “-lfoo” is replaced by the absolute
> file name of the “foo” library?

Good question. Per the ELF v1.2 spec¹ (page 82), setting DT_NEEDED to
an absolute file name would prevent overriding via LD_LIBRARY_PATH,
which is not desirable.

It turns out we cannot even set DT_NEEDED to an absolute file name in
the first place, because ld records the DT_SONAME of the library, when
it’s available (which is the case most of the time), rather than its
file name.

IOW, the approach suggested in https://bugs.gnu.org/26048 isn’t really
applicable. :-/

Ludo’.

L
L
Ludovic Courtès wrote on 21 Nov 2017 14:35
Re: bug#26048: Use absolute file names in NEED instead of adding many entries to RUNPATH
(address . 26048@debbugs.gnu.org)
871skrn49g.fsf@gnu.org
ludo@gnu.org (Ludovic Courtès) skribis:

Toggle quote (14 lines)
> As Andy just noted on IRC, shared library lookup is inefficient in Guix,
> because there’s one entry per library in RUNPATH. So we get:
>
> open("/gnu/store/y8ppqsxiki39n4mqpb4mab6bgwqsnnp7-libgc-7.4.2/lib/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
> open("/gnu/store/w0bkj9qh7iqcklm5ld8ghg1ynnzqyv00-libffi-3.2.1/lib/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
> open("/gnu/store/d5gw4i6bnyznmbr55ba39bl3pgrhsyp0-libunistring-0.9.6/lib/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
> open("/gnu/store/6k08nkddnrb15h5pwp1s0fa94mr1qas9-gmp-6.1.1/lib/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
> open("/gnu/store/9yn89bkl8vcg5rh9dmw3jijciwgrwjls-libltdl-2.4.6/lib/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
> open("/gnu/store/iwgi9001dmmihrjg4rqhd6pa6788prjw-glibc-2.24/lib/libm.so.6", O_RDONLY|O_CLOEXEC) = 3
>
> An alternate approach would be for ld-wrapper to replace “-lfoo” with
> “/gnu/store/…/libfoo.so”, which would add the absolute file name as
> NEEDed in the ELF file.

This is actually impossible, as discussed at

Per the ELF v1.2 spec¹ (page 82), setting DT_NEEDED to
an absolute file name would prevent overriding via LD_LIBRARY_PATH,
which is not desirable.

It turns out we cannot even set DT_NEEDED to an absolute file name in
the first place, because ld records the DT_SONAME of the library, when
it’s available (which is the case most of the time), rather than its
file name.


Ludo’.
L
L
Ludovic Courtès wrote on 21 Nov 2017 14:35
control message for bug #26048
(address . control@debbugs.gnu.org)
87zi7flpos.fsf@gnu.org
tags 26048 wontfix
close 26048
?