[GHC] #11587: Place shared objects in LIBDIR

GHC ghc-devs at haskell.org
Tue Feb 16 20:10:45 UTC 2016


#11587: Place shared objects in LIBDIR
-------------------------------------+-------------------------------------
        Reporter:  bgamari           |                Owner:
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:  8.0.1
       Component:  Package system    |              Version:  7.10.3
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  Runtime           |  Unknown/Multiple
  performance bug                    |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------
Description changed by bgamari:

@@ -42,1 +42,1 @@
- them in `$LIBDIR`, e.g. `$LIBDIR/libPKG_KEY.so`. This would mean that we
+ them in `$LIBDIR`, e.g. `$LIBDIR/lib$PKG_KEY.so`. This would mean that we

New description:

 If one compiles a program with `-dynamic`, the resulting executable
 includes in its `rpath` the library directory of every Haskell package
 that the program links against. This causes a significant number of excess
 system calls at program start-up. For instance, in the case of a
 dynamically linked `ghc` executable on Debian 8, compiling a trivial
 "hello world" application produces over 800 `open` calls, the majority of
 which originate from the dynamic linker. e.g.,

 {{{
 $ strace -f -e open ghc-7.10.3 -c -fforce-recomp Test.hs 2>&1 | grep open
 ...
 open("/usr/lib/ghc/bin/../haske_GGvi737nHHfG6zm2y7Rimi/tls/x86_64/libtinfo.so.5",
 O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
 open("/usr/lib/ghc/bin/../haske_GGvi737nHHfG6zm2y7Rimi/tls/libtinfo.so.5",
 O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
 open("/usr/lib/ghc/bin/../haske_GGvi737nHHfG6zm2y7Rimi/x86_64/libtinfo.so.5",
 O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
 open("/usr/lib/ghc/bin/../haske_GGvi737nHHfG6zm2y7Rimi/libtinfo.so.5",
 O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
 open("/usr/lib/ghc/bin/../termi_6iVf4EBnOgfIaaOCLRs8jl/tls/x86_64/libtinfo.so.5",
 O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
 open("/usr/lib/ghc/bin/../termi_6iVf4EBnOgfIaaOCLRs8jl/tls/libtinfo.so.5",
 O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
 open("/usr/lib/ghc/bin/../termi_6iVf4EBnOgfIaaOCLRs8jl/x86_64/libtinfo.so.5",
 O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
 open("/usr/lib/ghc/bin/../termi_6iVf4EBnOgfIaaOCLRs8jl/libtinfo.so.5",
 O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
 open("/usr/lib/ghc/bin/../ghc_0AG9TOjDEtx4Ji3wSwHOBe/tls/x86_64/libtinfo.so.5",
 O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
 open("/usr/lib/ghc/bin/../ghc_0AG9TOjDEtx4Ji3wSwHOBe/tls/libtinfo.so.5",
 O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
 open("/usr/lib/ghc/bin/../ghc_0AG9TOjDEtx4Ji3wSwHOBe/x86_64/libtinfo.so.5",
 O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
 ...
 }}}

 The dynamic linker must look in nearly 25 Haskell library directories to
 locate every system library! This is madness.

 Instead of placing each shared library in its own directory,
 `$LIBDIR/$PKG_KEY/lib$PKG_KEY.so` as we do currently, why not just place
 them in `$LIBDIR`, e.g. `$LIBDIR/lib$PKG_KEY.so`. This would mean that we
 need to include only one directory, `$LIBDIR`, in `rpath`.

--

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/11587#comment:1>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list