summary refs log tree commit diff
path: root/pkgs/development/compilers/ghc/osx-dylib-resolver.patch
blob: 50236026031e8b48f266877ffbcab6e1ffdc7ab4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
diff --git a/compiler/ghci/Linker.hs b/compiler/ghci/Linker.hs
--- a/compiler/ghci/Linker.hs
+++ b/compiler/ghci/Linker.hs
@@ -119,9 +119,9 @@
         -- that is really important
         pkgs_loaded :: ![PackageKey],
 
-        -- we need to remember the name of the last temporary DLL/.so
-        -- so we can link it
-        last_temp_so :: !(Maybe (FilePath, String)) }
+        -- we need to remember the name of previous temporary DLL/.so
+        -- libraries so we can link them (see #10322)
+        temp_sos :: ![(FilePath, String)] }
 
 
 emptyPLS :: DynFlags -> PersistentLinkerState
@@ -131,7 +131,7 @@
                         pkgs_loaded = init_pkgs,
                         bcos_loaded = [],
                         objs_loaded = [],
-                        last_temp_so = Nothing }
+                        temp_sos = [] }
 
   -- Packages that don't need loading, because the compiler
   -- shares them with the interpreted program.
@@ -841,19 +841,19 @@
         dflags2 = dflags1 {
                       -- We don't want the original ldInputs in
                       -- (they're already linked in), but we do want
-                      -- to link against the previous dynLoadObjs
-                      -- library if there was one, so that the linker
+                      -- to link against previous dynLoadObjs
+                      -- libraries if there were any, so that the linker
                       -- can resolve dependencies when it loads this
                       -- library.
                       ldInputs =
-                        case last_temp_so pls of
-                          Nothing -> []
-                          Just (lp, l)  ->
+                        concatMap
+                            (\(lp, l) ->
                                  [ Option ("-L" ++ lp)
                                  , Option ("-Wl,-rpath")
                                  , Option ("-Wl," ++ lp)
                                  , Option ("-l" ++  l)
-                                 ],
+                                 ])
+                            (temp_sos pls),
                       -- Even if we're e.g. profiling, we still want
                       -- the vanilla dynamic libraries, so we set the
                       -- ways / build tag to be just WayDyn.
@@ -868,7 +868,7 @@
     consIORef (filesToNotIntermediateClean dflags) soFile
     m <- loadDLL soFile
     case m of
-        Nothing -> return pls { last_temp_so = Just (libPath, libName) }
+        Nothing -> return pls { temp_sos = (libPath, libName) : temp_sos pls }
         Just err -> panic ("Loading temp shared object failed: " ++ err)
 
 rmDupLinkables :: [Linkable]    -- Already loaded