[GHC] #10352: Properly link Haskell shared libs on ELF systems

If we use ldd again to look at the libfoo.so that we've made we will notice that it is missing a dependency on the rts library. This is problem
#10352: Properly link Haskell shared libs on ELF systems -------------------------------------+------------------------------------- Reporter: duncan | Owner: Type: task | Status: new Priority: normal | Milestone: Component: Package | Version: 7.11 system | Operating System: Linux Keywords: | Type of failure: None/Unknown Architecture: | Blocked By: Unknown/Multiple | Related Tickets: Test Case: | Blocking: | Differential Revisions: | -------------------------------------+------------------------------------- Since the early days of building Haskell shared libs on Linux we have been using a scheme that is really a bit of a hack. We should do it properly. In my blog post on this from 2009 (http://www.well-typed.com/blog/30/) I said: that we've yet to sort out, so for the moment we can just add the dependency ourselves:
$ ghc --make -dynamic -shared -fPIC Foo.hs -o libfoo.so \ -lHSrts-ghc6.11 -optl-Wl,-rpath,/opt/ghc/lib/ghc-6.11/
The reason it's not linked in yet is because we need to be able to
switch which version of the rts we're using without having to relink every library. For example we want to be able to switch between the debug, threaded and normal rts versions. It's quite possible to do this and it just needs a bit more rearranging in the build system to sort it out. Once it's done you'll even be able to switch rts at runtime, eg:
$ LD_PRELOAD=/opt/ghc/lib/ghc-6.11/libHSrts_debug-ghc6.11.so $ ./Hello
So in general, if a shared lib requires symbols from another shared lib then it should depend on it. In ELF terminology that means a NEEDED entry to say this lib needs that other lib. This is important to be able to link and load these shared libraries, otherwise they can have dangling dependencies. But we don't do this. For the specific case of the RTS we do not link Haskell shared libs against the RTS. So they have lots of dangling symbols. These libraries cannot be loaded on their own, e.g. with `dlopen()`. This is bad, and has other knock-on consequences. Why don't we link to the RTS? It's because historically (with static linking) GHC had had the ability to select the flavour of the RTS when final executables are linked, not when intermediate libraries are created. This works because the RTS flavours share a common ABI. This is a useful feature as it lets us select the SMP or debug or other RTS at final link time. So when we made up the first shared lib scheme on ELF we had to support this. Our initial scheme was like this: don't link Haskell library DSOs against the RTS, only like the final exe against the RTS. Each RTS flavour has a separate SONAME, e.g. `libHSrts_thr-ghc7.8.4.so` or `libHSrts_debug- ghc7.8.4.so`. This works because the runtime linker looks at the final exe first and loads the RTS, and then when other libs are loaded the symbols all resolve. Why can't we link all the libraries against the RTS? Currently each RTS flavour has a different SONAME, which is the key that the dynamic linker uses to identify each library. So if we did link all the Haskell libs against "the" RTS we would have to pick which one at the point at which we create the library, and that'd stop us from being able to choose later. So, can we use a better scheme? We want one that doesn't leave dangling undefined references in intermediate Haskell libs, and is also compatible with the ability to select the flavour of the RTS at final exe link time (or even override it at load time). Yes we can! The first thing to note is that to be interchangeable, all the RTS flavours (that share a compatible ABI) need to have the same SONAME. So for example, all the (non-profiling) RTS DSO files have to have the internal SONAME of `libHSrts-ghc7.8.4.so`. Once they all have the same SONAME, then it's ok for all the Haskell libs to specify a NEEDED dependency on that rts SONAME. But if they have the same SONAME, what do the files get called, where do they live and how are they found? The trick is to make use of the search path. Put each RTS flavour in a different directory, but otherwise with the same filename, e.g. `lib/rts-1.0/thr/libHSrts-ghc7.8.4.so`, `lib/rts-1.0/debug/libHSrts-ghc7.8.4.so` etc. Each library DSO and exe has its list of NEEDED entries, and it has an RPATH entry used to find those libraries if they're not loaded yet. The key is the "if they're not loaded yet" bit. Remember that the linker uses the SONAME as the key to decide if the lib is loaded yet or not. So the libraries could all have an RPATH entry to say to look for the RTS in the directory containing the default RTS flavour. But then the top level exe (or foreign/export shared lib) can also link to the RTS directly (ie an NEEDED entry) and can specify an RPATH which can be for any of the rts flavours. When the linker loads the top level exe, it will loads the selected RTS using the exe's RPATH, and then when the linker sees other Haskell libs that have a NEEDED entry on the RTS it will ignore them because the RTS's SONAME is already loaded. So concretely, instead of: lib/ghc-${ver}/rts-1.0/libHSrts-ghc${ver}.so lib/ghc-${ver}/rts-1.0/libHSrts_thr-ghc${ver}.so lib/ghc-${ver}/rts-1.0/libHSrts_debug-ghc${ver}.so lib/ghc-${ver}/rts-1.0/libHSrts_l-ghc${ver}.so lib/ghc-${ver}/rts-1.0/libHSrts_thr_l-ghc${ver}.so lib/ghc-${ver}/rts-1.0/libHSrts_thr_debug-ghc${ver}.so each with a different SONAME we'd have lib/ghc-${ver}/rts-1.0/libHSrts-ghc${ver}.so lib/ghc-${ver}/rts-1.0/thr/libHSrts-ghc${ver}.so lib/ghc-${ver}/rts-1.0/debug/libHSrts-ghc${ver}.so lib/ghc-${ver}/rts-1.0/l/libHSrts-ghc${ver}.so lib/ghc-${ver}/rts-1.0/thr_l/libHSrts-ghc${ver}.so lib/ghc-${ver}/rts-1.0/thr_debug/libHSrts-ghc${ver}.so each with the same SONAME When linking libs we would always use `-lHSrts -rpath lib/ghc-${ver}/rts-1.0` When linking exes (or shared libs for external consumption) we would use both `-lHSrts` and `-rpath lib/ghc-${ver}/${rtsflavour}/rts-1.0`. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10352 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#10352: Properly link Haskell shared libs on ELF systems -------------------------------------+------------------------------------- Reporter: duncan | Owner: Type: task | Status: new Priority: normal | Milestone: Component: Package system | Version: 7.11 Resolution: | Keywords: Operating System: Linux | Architecture: Type of failure: None/Unknown | Unknown/Multiple Blocked By: | Test Case: Related Tickets: | Blocking: | Differential Revisions: -------------------------------------+------------------------------------- Comment (by rwbarton): This might solve part of the problem with dynamic libraries on Android too (#10324). Is it necessary to put any rpath in the Haskell libraries? It might be better not to have one. If our assumption that the dynamic linker will prefer the rpath from the executable is correct, then it won't matter, but if it's wrong, then better to get a runtime error than silently use an RTS flavor other than the one the user specified. It does mean that a program that wants to `dlopen()` a Haskell library has to load the RTS first, or somehow set the runtime library path; but that's just one more hoop to jump through in addition to initializing the RTS, etc. If it really does matter for a specific Haskell library to have an rpath for the RTS then that can be added when linking the library, and again it seems better not to have "wrong" rpaths floating around in its dependencies. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10352#comment:1 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#10352: Properly link Haskell shared libs on ELF systems -------------------------------------+------------------------------------- Reporter: duncan | Owner: Type: task | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.11 (Linking) | Resolution: | Keywords: Operating System: Linux | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Revisions: -------------------------------------+------------------------------------- Changes (by ezyang): * component: Package system => Compiler (Linking) -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10352#comment:2 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#10352: Properly link Haskell shared libs on ELF systems -------------------------------------+------------------------------------- Reporter: duncan | Owner: Type: task | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.11 (Linking) | Resolution: | Keywords: Operating System: Linux | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Revisions: -------------------------------------+------------------------------------- Changes (by simonmar): * cc: simonmar (added) -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10352#comment:3 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#10352: Properly link Haskell shared libs on ELF systems -------------------------------------+------------------------------------- Reporter: duncan | Owner: Type: task | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.11 (Linking) | Resolution: | Keywords: Operating System: Linux | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Changes (by trommler): * cc: trommler (added) -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10352#comment:4 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#10352: Properly link Haskell shared libs on ELF systems -------------------------------------+------------------------------------- Reporter: duncan | Owner: Type: task | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.11 (Linking) | Resolution: | Keywords: Operating System: Linux | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Changes (by DanielG): * cc: DanielG (added) -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10352#comment:5 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#10352: Properly link Haskell shared libs on ELF systems -------------------------------------+------------------------------------- Reporter: duncan | Owner: Type: task | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.11 (Linking) | Resolution: | Keywords: Operating System: Linux | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Changes (by Phyx-): * cc: Phyx- (added) -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10352#comment:6 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#10352: Properly link Haskell shared libs on ELF systems -------------------------------------+------------------------------------- Reporter: duncan | Owner: Type: task | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.11 (Linking) | Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Changes (by Phyx-): * os: Linux => Unknown/Multiple Comment: I think this would work for Windows as well and would solve some issues with Dynamic linking there. For this to work on Windows we need a few things: name all the rts variants the same. e.g. `ghc-rts.dll` but place them in different folders: {{{ rts \ normal \ ghc-rts.dll \ threaded \ ghc-rts.dll \ profiled \ ghc-rts.dll }}} etc. We can then delay load the rts library. All the RTS versions should have the same ABI so that shouldn't be an issue. During compilation of a `.exe` we can then set the search path using `AddDllDirectory` to allow the loader to pick the correct `RTS` variants for the `.exe` and all the DLLs since they are all in the same process space as the `exe` and so will inherit the search path. For dynamic libraries we can override the `hs_init` function and do the same. I think we can use ld's `--wrap symbol` for this so existing code don't need any changing: http://ftp.gnu.org/pub/old-gnu/Manuals/ld-2.9.1/html_node/ld_3.html So I will re-classify this as being multiple platforms. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10352#comment:7 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#10352: Properly link Haskell shared libs on ELF systems -------------------------------------+------------------------------------- Reporter: duncan | Owner: Type: task | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.11 (Linking) | Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: 5987 Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by trommler): Just an idea: The RTS is split into two parts, a small stub library and the actual RTS library (respectively its flavours). The stub library checks for an RTS parameter or an environment variable or ... to determine the flavour of RTS desired. The stub library `dlopen`s the appropriate shared library with `RTLD_GLOBAL` scope, which makes all RTS symbols available to all shared libraries loaded after. The linking of the stub RTS results in dangling references which is fine for ELF shared libraries. Perhaps, the functionality of the stub library could also be integrated into hs_init(). In that case libraries depending on the RTS must not be linked against any flavour of the RTS resulting in dangling references. That is fine in ELF. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10352#comment:9 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#10352: Properly link Haskell shared libs on ELF systems -------------------------------------+------------------------------------- Reporter: duncan | Owner: Type: task | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.11 (Linking) | Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: 5987 Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by Phyx-): Hmm, but what would the advantages of this be over the proposed solution though? At least for Windows the implementation would be a bit more complicated... -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10352#comment:10 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

Hmm, but what would the advantages of this be over the proposed solution
#10352: Properly link Haskell shared libs on ELF systems -------------------------------------+------------------------------------- Reporter: duncan | Owner: Type: task | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.11 (Linking) | Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: 5987 Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by trommler): Replying to [comment:10 Phyx-]: though? The parameter (or value in the environment variable) would not need to depend on the installation directory (of the RTS libs) but just say '''what''' flavour of RTS is wanted. The advantages are 1. User's don't need to learn the internal organisation of directories, which also might change with releases. 1. In scripts (testcases etc) we do not depend on those directory names either. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10352#comment:11 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#10352: Properly link Haskell shared libs on ELF systems -------------------------------------+------------------------------------- Reporter: duncan | Owner: Type: task | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.11 (Linking) | Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: 5987 Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by simonmar): I'd rather rely on the usual mechanisms for finding shared library dependencies, so that the user can override them if they want to, using `LD_LIBRARY_PATH` and `LD_PRELOAD` for example. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10352#comment:12 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#10352: Properly link Haskell shared libs on all systems -------------------------------------+------------------------------------- Reporter: duncan | Owner: Phyx- Type: task | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.11 (Linking) | Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: 5987 Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Changes (by Phyx-): * owner: => Phyx- Comment: Well I'll take a crack at it then since it's currently blocking my progress on dynamic linking on Windows :) -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10352#comment:13 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#10352: Properly link Haskell shared libs on all systems -------------------------------------+------------------------------------- Reporter: duncan | Owner: Phyx- Type: task | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.11 (Linking) | Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: 5987 Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by Phyx-): I'm having a hard time getting this to work on Windows which is what is causing the delay. The issue is that normally you'd be able to do this easily by delay loading the dll. This is done by creating a delay loading import library which essentially, instead of putting the symbols in the IAT of the PE file instead links statically against stubs. These stubs allow it to then load the DLL only on first call of a related function. This is done by those adding a level of indirection. (mingw-w64's implementation is here if curious https://github.com/mirror/mingw-w64/blob/master/mingw-w64-crt/misc/delayimp....) The issue is that this approach has a major limitation: It only works for Functions! This limitation is described here https://msdn.microsoft.com/en- us/library/yx1x886y.aspx But essentially this is because exported `const data` entries end up becoming stubs too. (empty stubs, but stubs in any case). This address is resolved at link time (because you're linking against the stub instead of the IAT entry being added to the Windows Loader can later resolve it). One way to work around this is to replace constant imports such as {{{ __declspec(dllimport) extern FooS_t fooStruct; }}} With explicit loads using MACROs: {{{ FooS_t fst = *(FooS_t*)GetProcAddress(GetModuleHandle("foo"), "fooStruct"); }}} This works, but I would have to track down each and every use of constants in the RTS and change them to this or to make them functions (e.g `getFooStruct()`). What I am investigating now is a third approach, using an intermediate proxy dll. Link normally against the proxy to the loader resolves the addresses of const data as it should, but have the proxy "forward" the requests to the right dll. This can be done because when the linker looks up symbols in the IAT the OS allows for hooks in the target library to override the returned address. This should allow me to use the proxy to choose at runtime which runtime to use. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10352#comment:14 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#10352: Properly link Haskell shared libs on all systems -------------------------------------+------------------------------------- Reporter: duncan | Owner: Phyx- Type: task | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.11 (Linking) | Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: 5987 Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by Phyx-): Hmm third option using a proxy won't work as I forgot that `__pfnDliNotifyHook2` isn't an OS function but one provided by the lazy loading stubs. I will just have to conditionally modify the GHC code. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10352#comment:15 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#10352: Properly link Haskell shared libs on all systems -------------------------------------+------------------------------------- Reporter: duncan | Owner: Phyx- Type: task | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.11 (Linking) | Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: 5987 Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Changes (by RyanGlScott): * cc: RyanGlScott (added) -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10352#comment:16 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#10352: Properly link Haskell shared libs on all systems -------------------------------------+------------------------------------- Reporter: duncan | Owner: Phyx- Type: task | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.11 (Linking) | Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: 5987 Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by Phyx-): Ok, have an approach that should work, just link normally and use SxS to select the proper RTS runtime through a manifest file and SxS activation contexts. Should require no modification to linking which is good. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10352#comment:17 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#10352: Properly link Haskell shared libs on all systems -------------------------------------+------------------------------------- Reporter: duncan | Owner: Phyx- Type: task | Status: new Priority: normal | Milestone: 8.2.1 Component: Compiler | Version: 7.11 (Linking) | Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: 5987 Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Changes (by Phyx-): * milestone: => 8.2.1 -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10352#comment:18 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#10352: Properly link Haskell shared libs on all systems -------------------------------------+------------------------------------- Reporter: duncan | Owner: Phyx- Type: task | Status: new Priority: normal | Milestone: 8.2.1 Component: Compiler | Version: 7.11 (Linking) | Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: 5987 Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by Phyx-): It turns out that this is slightly tricky on Linux as well. It seems that the `WRAPPER` scripts generated by `utils/ghc-cabal/Main.hs` is also setting the `LD_LIBRARY_PATH` value to each dependency of the wrapped application. Previously for the RTS this was easy because all of the `RTS .so` were all in the same folder so it hardcoded `lib/ghc-${ver}/rts-1.0/` in the `LD_LIBRARY_PATH`. This presents the obvious question now, what to do with the RTS. Previously because the names were different and they're all in the same subdirectory you could just add the parent and the platform loaded would load the .so based on the filename. The problem is, I have no way of telling, from within the compiled program which RTS you actually intended to use. If I can't do that I can't add the new rts directories to the library path. Any suggestions? -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10352#comment:19 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#10352: Properly link Haskell shared libs on all systems -------------------------------------+------------------------------------- Reporter: duncan | Owner: Phyx- Type: task | Status: new Priority: normal | Milestone: 8.2.1 Component: Compiler | Version: 7.11 (Linking) | Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: 5987 Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by Phyx-): I meant from within the ghc-cabal code while generating the wrappers there's no way for me to tell which rts the program intended to use. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10352#comment:20 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#10352: Properly link Haskell shared libs on all systems -------------------------------------+------------------------------------- Reporter: duncan | Owner: Type: task | Status: new Priority: normal | Milestone: 8.2.1 Component: Compiler | Version: 7.11 (Linking) | Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: 5987 Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Changes (by Phyx-): * owner: Phyx- => -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10352#comment:21 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#10352: Properly link Haskell shared libs on all systems -------------------------------------+------------------------------------- Reporter: duncan | Owner: Type: task | Status: new Priority: normal | Milestone: 8.2.1 Component: Compiler | Version: 7.11 (Linking) | Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: 5987 Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by dobenour): Is there a way to pipe the information to where it needs to be? -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10352#comment:22 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#10352: Properly link Haskell shared libs on all systems -------------------------------------+------------------------------------- Reporter: duncan | Owner: Type: task | Status: new Priority: normal | Milestone: 8.4.1 Component: Compiler | Version: 7.11 (Linking) | Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: 5987 Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Changes (by bgamari): * milestone: 8.2.1 => 8.4.1 Comment: It seems unlikely that this will happen for 8.2. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10352#comment:23 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler
participants (1)
-
GHC