[GHC] #11587: Place shared objects in LIBDIR

GHC ghc-devs at haskell.org
Tue Feb 16 20:09:51 UTC 2016


#11587: Place shared objects in LIBDIR
-------------------------------------+-------------------------------------
           Reporter:  bgamari        |             Owner:
               Type:  bug            |            Status:  new
           Priority:  normal         |         Milestone:  8.0.1
          Component:  Package        |           Version:  7.10.3
  system                             |
           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:
-------------------------------------+-------------------------------------
 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/libPKG_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>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list