
#8935: Obscure linker bug leads to crash in GHCi -------------------------------------+------------------------------------ Reporter: simonmar | Owner: simonmar Type: bug | Status: infoneeded Priority: high | Milestone: 7.8.3 Component: Runtime System | Version: 7.8.1-rc2 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Unknown/Multiple Type of failure: GHCi crash | Difficulty: Rocket Science Test Case: | Blocked By: Blocking: | Related Tickets: -------------------------------------+------------------------------------ Comment (by trommler): Let's look at comment:12 again. We see that even for symbols defined in libgmp.so the dynamic linker searches ./check-environ (and libdl and libc and ld-linux) before it finally finds the symbol in libgmp.so {{{ 5823: symbol=__gmp_default_free; lookup in file=./check-environ [0] 5823: symbol=__gmp_default_free; lookup in file=/lib64/libdl.so.2 [0] 5823: symbol=__gmp_default_free; lookup in file=/lib64/libc.so.6 [0] 5823: symbol=__gmp_default_free; lookup in file=/lib64/ld- linux-x86-64.so.2 [0] 5823: symbol=__gmp_default_free; lookup in file=/usr/lib64/libgmp.so [0] }}} And then for {{{environ}}} the search starts in {{{libgmp.so}}}. Perhaps because {{{environ}}} is a weak symbol. It seems that openSUSE ignores the weak attribute of symbols in the dynamic linker and treats them as strong and hence starts the search in {{{./check-environ}}}. This seems to be correct as Drepper [http://www.akkadia.org/drepper/dsohowto.pdf] says on p. 6: "Note that a definition in a DSO being weak has no effects. Weak definitions only play a role in static linking." It seems Ubuntu and Fedora do not agree. There is also an environment variable {{{LD_DYNAMIC_WEAK}}} (see ld.so(8)) to allow overriding weak symbols. Is that environment variable set on your systems? -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/8935#comment:22 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler