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

DoneSubmitted by Ludovic Courtès.
Details
One participant
  • Ludovic Courtès
Owner
unassigned
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 asNEEDed 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 toan 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 inthe first place, because ld records the DT_SONAME of the library, whenit’s available (which is the case most of the time), rather than itsfile name.
IOW, the approach suggested in https://bugs.gnu.org/26048 isn’t reallyapplicable. :-/
Ludo’.
¹ http://refspecs.linuxbase.org/elf/elf.pdf
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 athttps://lists.gnu.org/archive/html/guix-devel/2017-09/msg00075.html:
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.
¹ http://refspecs.linuxbase.org/elf/elf.pdf
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 wontfixclose 26048
?
Your comment

This issue is archived.

To comment on this conversation send email to 26048@debbugs.gnu.org