
#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: | -------------------------------------+------------------------------------- Changes (by chak): * cc: trommler (removed) * cc: Trommler, chak (added) Comment: I have wondered about this set up in the past. More precisely, I think having the dynamic libraries for different packages in separate directories with the interface files etc of the package makes a lot of sense. I keeps the `$LIBDIR` tidy. However, the dynamic linking set up does appear to be rather inefficient and, at least on OS X, it makes relocating GHC distributions very hard. In the Haskell for Mac build, I hence, post-process all executables and dynamic libraries to optimise the linking process. As my ELF is a bit rusty let me explain it in MACH-O terms. I am setting the `RPATH` in all executables such that it points to `$LIBDIR` and I set the library name of each dynamic library to include the package directory. For example, for `base`, we might have `base_GDytRqRVSUX7zckgKqJjgw/libHSbase-4.8.1.0 -GDytRqRVSUX7zckgKqJjgw-ghc7.10.2.dylib`. I also set `RPATH` to be relative to `@loader_PATH`, which gives me a relocatable set of dynamic libraries and GHC executables. So, for example, here is what `base` looks like {{{ LC 03: LC_ID_DYLIB @rpath/base_GDytRqRVSUX7zckgKqJjgw/libHSbase-4.8.1.0 -GDytRqRVSUX7zckgKqJjgw-ghc7.10.2.dylib ... LC 12: LC_LOAD_DYLIB @rpath/integ_2aU3IZNMF9a7mQ0OzsZ0dS /libHSinteger-gmp-1.0.0.0-2aU3IZNMF9a7mQ0OzsZ0dS-ghc7.10.2.dylib LC 13: LC_LOAD_DYLIB @rpath/ghcpr_8TmvWUcS1U1IKHT0levwg3 /libHSghc-prim-0.4.0.0-8TmvWUcS1U1IKHT0levwg3-ghc7.10.2.dylib ... LC 19: LC_RPATH @loader_path/.. }}} This avoids the quadratic explosion of the search space, but still keeps the dynamic libraries in the package directories (and `$LIBDIR` tidier). This is definitely the better set up on OS X. Can't we do something equivalent on Linux? -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/11587#comment:4 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler