[GHC] #12983: Loading temp shared object failed: TemplateHaskell and recompilation

GHC ghc-devs at haskell.org
Thu Dec 15 09:13:05 UTC 2016


#12983: Loading temp shared object failed: TemplateHaskell and recompilation
-------------------------------------+-------------------------------------
           Reporter:  StefanWehr     |             Owner:
               Type:  bug            |            Status:  new
           Priority:  normal         |         Milestone:
          Component:  Compiler       |           Version:  8.0.1
           Keywords:  template       |  Operating System:  Unknown/Multiple
  haskell, recompilation             |
       Architecture:                 |   Type of failure:  Compile-time
  Unknown/Multiple                   |  crash or panic
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 In our project, we get from time to time an error like this:

 {{{
 ghc: panic! (the 'impossible' happened)
   (GHC version 8.0.1 for x86_64-apple-darwin):
         Loading temp shared object failed:
 dlopen(/var/folders/8r/25v12lxd02zdm7lpky3xcnh80000gn/T/ghc40483_0/libghc_1.dylib,
 5): Symbol not found: _ShortText_ShortText_con_info
   Referenced from:
 /var/folders/8r/25v12lxd02zdm7lpky3xcnh80000gn/T/ghc40483_0/libghc_1.dylib
   Expected in: flat namespace
  in
 /var/folders/8r/25v12lxd02zdm7lpky3xcnh80000gn/T/ghc40483_0/libghc_1.dylib
 }}}

 I was able to create a somewhat minimal setup for reproducing the problem.
 I've reproduced the problem on Mac and Linux with GHC 8.0.1, didn't try on
 Windows.

 The root of the problem seems to be an interaction with template haskell
 and the recompilation manager.

 I'll now explain the setup. I've attached an archive which contains all
 code and a simple build script. Just unpack the archive and execute
 ./build.sh to reproduce the problem.

 The setup consists of four files. (Don't be confused by the module names.
 They are derived from our project). The problem arises after a change to
 one of these files and a recompilation.

 Here are the initial versions of the four files.

 {{{#!hs
 -- src/ShortText.hs
 module ShortText where

 data ShortText = ShortText String

 toString :: ShortText -> String
 toString (ShortText s) = s
 }}}

 {{{#!hs
 -- src/Hospital.hs
 module Hospital where

 foo :: Int -> String
 foo i = show i
 }}}

 {{{#!hs
 -- src/Types.hs
 {-# LANGUAGE TemplateHaskell #-}
 module Types where

 import qualified Hospital
 import Language.Haskell.TH

 genCode :: Q [Dec]
 genCode =
     let s = Hospital.foo 5
     in [d|string = s|]
 }}}

 {{{#!hs
 -- src/MetaHandler.hs
 {-# LANGUAGE TemplateHaskell #-}
 module Main where

 import qualified Types

 -- splices in "string :: String"
 $(Types.genCode)

 main :: IO ()
 main = putStrLn string
 }}}

 Compiling the project for the first time works without problems:


 {{{
 $ /Users/swehr/.stack/programs/x86_64-osx/ghc-8.0.1/bin/ghc -O0 -isrc
 -ibuild -dynamic -outputdir build -package template-haskell --make
 src/MetaHandler.hs
 [1 of 3] Compiling Hospital         ( src/Hospital.hs, build/Hospital.o )
 [2 of 3] Compiling Types            ( src/Types.hs, build/Types.o )
 [3 of 3] Compiling Main             ( src/MetaHandler.hs, build/Main.o )
 Linking src/MetaHandler ...
 }}}

 I then changed the content of src/Hospital.hs to use the ShortText module.
 Here is the new content:

 {{{#!hs
 -- src/Hospital.hs
 module Hospital where

 import ShortText

 foo :: Int -> String
 foo i = toString (ShortText (show i))
 }}}

 Then recompilation fails:

 {{{
 [1 of 4] Compiling ShortText        ( src/ShortText.hs, build/ShortText.o
 )
 [2 of 4] Compiling Hospital         ( src/Hospital.hs, build/Hospital.o )
 [4 of 4] Compiling Main             ( src/MetaHandler.hs, build/Main.o )
 [TH]
 ghc: panic! (the 'impossible' happened)
   (GHC version 8.0.1 for x86_64-apple-darwin):
         Loading temp shared object failed:
 dlopen(/var/folders/8r/25v12lxd02zdm7lpky3xcnh80000gn/T/ghc40827_0/libghc_7.dylib,
 5): Symbol not found: _ShortText_ShortText_con_info
   Referenced from:
 /var/folders/8r/25v12lxd02zdm7lpky3xcnh80000gn/T/ghc40827_0/libghc_7.dylib
   Expected in: flat namespace
  in
 /var/folders/8r/25v12lxd02zdm7lpky3xcnh80000gn/T/ghc40827_0/libghc_7.dylib

 Please report this as a GHC bug:  http://www.haskell.org/ghc/reportabug
 }}}

 Looking at the output when compiling with -v3 gives a clue why:


 {{{
 ...
 *** Linker:
 /usr/bin/gcc -m64 -fno-stack-protector -DTABLES_NEXT_TO_CODE -m64
 -dynamiclib -o
 /var/folders/8r/25v12lxd02zdm7lpky3xcnh80000gn/T/ghc40913_0/libghc_7.dylib
 build/Hospital.o build/Types.o -undefined dynamic_lookup -single_module
 -install_name '@rpath/libghc_7.dylib'
 -L/Users/swehr/.stack/programs/x86_64-osx/ghc-8.0.1/lib/ghc-8.0.1
 /template-haskell-2.11.0.0 -Wl,-rpath
 -Wl,/Users/swehr/.stack/programs/x86_64-osx/ghc-8.0.1/lib/ghc-8.0.1
 /template-haskell-2.11.0.0
 -L/Users/swehr/.stack/programs/x86_64-osx/ghc-8.0.1/lib/ghc-8.0.1/pretty-1.1.3.3
 -Wl,-rpath
 -Wl,/Users/swehr/.stack/programs/x86_64-osx/ghc-8.0.1/lib/ghc-8.0.1/pretty-1.1.3.3
 -L/Users/swehr/.stack/programs/x86_64-osx/ghc-8.0.1/lib/ghc-8.0.1/deepseq-1.4.2.0
 -Wl,-rpath
 -Wl,/Users/swehr/.stack/programs/x86_64-osx/ghc-8.0.1/lib/ghc-8.0.1/deepseq-1.4.2.0
 -L/Users/swehr/.stack/programs/x86_64-osx/ghc-8.0.1/lib/ghc-8.0.1/array-0.5.1.1
 -Wl,-rpath
 -Wl,/Users/swehr/.stack/programs/x86_64-osx/ghc-8.0.1/lib/ghc-8.0.1/array-0.5.1.1
 -L/Users/swehr/.stack/programs/x86_64-osx/ghc-8.0.1/lib/ghc-8.0.1/ghc-
 boot-th-8.0.1 -Wl,-rpath
 -Wl,/Users/swehr/.stack/programs/x86_64-osx/ghc-8.0.1/lib/ghc-8.0.1/ghc-
 boot-th-8.0.1
 -L/Users/swehr/.stack/programs/x86_64-osx/ghc-8.0.1/lib/ghc-8.0.1/base-4.9.0.0
 -Wl,-rpath
 -Wl,/Users/swehr/.stack/programs/x86_64-osx/ghc-8.0.1/lib/ghc-8.0.1/base-4.9.0.0
 -L/Users/swehr/.stack/programs/x86_64-osx/ghc-8.0.1/lib/ghc-8.0.1/integer-
 gmp-1.0.0.1 -Wl,-rpath
 -Wl,/Users/swehr/.stack/programs/x86_64-osx/ghc-8.0.1/lib/ghc-8.0.1
 /integer-gmp-1.0.0.1
 -L/Users/swehr/.stack/programs/x86_64-osx/ghc-8.0.1/lib/ghc-8.0.1/ghc-
 prim-0.5.0.0 -Wl,-rpath
 -Wl,/Users/swehr/.stack/programs/x86_64-osx/ghc-8.0.1/lib/ghc-8.0.1/ghc-
 prim-0.5.0.0
 -L/Users/swehr/.stack/programs/x86_64-osx/ghc-8.0.1/lib/ghc-8.0.1/rts
 -Wl,-rpath
 -Wl,/Users/swehr/.stack/programs/x86_64-osx/ghc-8.0.1/lib/ghc-8.0.1/rts
 -lHStemplate-haskell-2.11.0.0-ghc8.0.1 -lHSpretty-1.1.3.3-ghc8.0.1
 -lHSdeepseq-1.4.2.0-ghc8.0.1 -lHSarray-0.5.1.1-ghc8.0.1 -lHSghc-boot-
 th-8.0.1-ghc8.0.1 -lHSbase-4.9.0.0-ghc8.0.1 -lHSinteger-
 gmp-1.0.0.1-ghc8.0.1 -lHSghc-prim-0.5.0.0-ghc8.0.1 -liconv
 *** Deleting temp files:
 Deleting:
 /var/folders/8r/25v12lxd02zdm7lpky3xcnh80000gn/T/ghc40913_0/ghc_8.rsp
 /var/folders/8r/25v12lxd02zdm7lpky3xcnh80000gn/T/ghc40913_0/libghc_7.dylib
 *** Deleting temp dirs:
 Deleting: /var/folders/8r/25v12lxd02zdm7lpky3xcnh80000gn/T/ghc40913_0
 ghc: panic! (the 'impossible' happened)
   (GHC version 8.0.1 for x86_64-apple-darwin):
         Loading temp shared object failed:
 dlopen(/var/folders/8r/25v12lxd02zdm7lpky3xcnh80000gn/T/ghc40913_0/libghc_7.dylib,
 5): Symbol not found: _ShortText_ShortText_con_info
   Referenced from:
 /var/folders/8r/25v12lxd02zdm7lpky3xcnh80000gn/T/ghc40913_0/libghc_7.dylib
   Expected in: flat namespace
  in
 /var/folders/8r/25v12lxd02zdm7lpky3xcnh80000gn/T/ghc40913_0/libghc_7.dylib
 }}}

 We can see here that the .o file for ShortText is not passed to gcc when
 building libghc_7.dylib. I suspect that libghc_7.dylib is used to run
 template haskell code, but this is only a guess.

 Looking at the .hi file for MetaHandler, we can see why gcc does not get
 the .o file for ShortText: ShortText is not included in the module
 dependencies:

 {{{
 $ /Users/swehr/.stack/programs/x86_64-osx/ghc-8.0.1/bin/ghc --show-iface
 build/Main.hi
 Magic: Wanted 33214052,
        got    33214052
 Version: Wanted [8, 0, 0, 1],
          got    [8, 0, 0, 1]
 Way: Wanted [],
      got    [d, y, n]
 interface Main 8001
   interface hash: def8085a5dcb4980922089d5d21cf0f9
   ABI hash: 1a46783c6a6c6b308503cf705db45d4d
   export-list hash: d2d75d71ebb6963f6e9c9a5b4050ef71
   orphan hash: 693e9af84d3dfcc71e640e005bdc5e2e
   flag hash: 3468616c2ba87fe39e866ff30d651f01
   sig of: Nothing
   used TH splices: True
   where
 exports:
   main
   string
 module dependencies: Hospital Types
 package dependencies: array-0.5.1.1 base-4.9.0.0 deepseq-1.4.2.0
                       ghc-boot-th-8.0.1 ghc-prim-0.5.0.0 integer-
 gmp-1.0.0.1
                       pretty-1.1.3.3 template-haskell-2.11.0.0
 orphans: GHC.Base GHC.Float
 }}}

 I think the main problem is that src/Types.hs is not recompiled in the
 second run. I also experimented with compiling each file separately, using
 the -c flag. When I then compile src/Types.hs, ghc outputs "compilation
 NOT required" in the second run. If a compile src/Types.hs with -fforce-
 recomp in the 2nd run, everything works fine.

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


More information about the ghc-tickets mailing list