[GHC] #8266: Dynamic linking on Mac

GHC ghc-devs at haskell.org
Tue Jan 14 20:39:06 UTC 2014


#8266: Dynamic linking on Mac
--------------------------------------------+------------------------------
        Reporter:  kazu-yamamoto            |            Owner:
            Type:  bug                      |           Status:  patch
        Priority:  highest                  |        Milestone:  7.8.1
       Component:  Build System             |          Version:  7.7
      Resolution:                           |         Keywords:
Operating System:  MacOS X                  |     Architecture:
 Type of failure:  GHC doesn't work at all  |  Unknown/Multiple
       Test Case:                           |       Difficulty:  Unknown
        Blocking:                           |       Blocked By:
                                            |  Related Tickets:
--------------------------------------------+------------------------------

Comment (by darchon):

 I guess I should have articulated better that the patch for Cabal is _not_
 needed for everything to work. The reason for the Cabal patch is simply:
 * Uniformity between `install_name`s of dynamic libraries supplied by GHC
 and those installed with Cabal.

 The new GHC patch adds an `LC_RPATH` command for every dependent library,
 pointing to the directory that the dependent library is installed in. So
 if a library is linked against, e.g.,
 `@rpath/libHSbase-4.7.0.0-ghc7.7.20140103.dylib`, it gets an `LC_RPATH`
 command that points to e.g. `/usr/local/ghc/lib/base-4.7.0.0/`.

 Now, _without_ the patch to Cabal, a library like `text` would get an
 `install_name` of `/Users/darchon/.cabal/lib/x86_64-osx-
 ghc-7.7.20140101/text-1.1.0.0/libHStext-1.1.0.0-ghc7.7.20140103.dylib`.
 Under the new patch, a library like `parsec` would be linked against
 `/Users/darchon/.cabal/lib/x86_64-osx-
 ghc-7.7.20140101/text-1.1.0.0/libHStext-1.1.0.0-ghc7.7.20140103.dylib`,
 but GHC would still add an `LC_RPATH` pointing to:
 `/Users/darchon/.cabal/lib/x86_64-osx-ghc-7.7.20140101/text-1.1.0.0`. Of
 course this `LC_RPATH` command is superfluous/bogus, as there isn't be any
 `@rpath` referenced dynamic library to be found there. I believe these
 superfluous `LC_PATH`s to be harmless though.

 Note that neither the GHC patch nor the Cabal patch intended to make
 packages/libraries relocatable. It essentially traded one direct/full path
 for another. In the pre-patch situation the `install_name` is a direct
 path, in the post-patch situation a library has an `LC_RPATH` that is a
 direct/full path.

 So, to sum up:
 * The new GHC patch solves the original issue of having the GHC build-dir
 referenced in built/distributed libraries, while also supporting the use-
 case of building/installing packages using `cabal-install` and the
 `inplace/bin/ghc-stage2`.
 * The Cabal patch only add uniformity between `install_names`, but is not
 necessary for a correctly working GHC/Cabal system.

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


More information about the ghc-tickets mailing list