
My apologies for making a buggy test program :-) Thanks for eliminating
#8935: Obscure linker bug leads to crash in GHCi -------------------------------------+------------------------------------ Reporter: simonmar | Owner: simonmar Type: bug | Status: new 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: -------------------------------------+------------------------------------ Changes (by trommler): * status: infoneeded => new Comment: Replying to [comment:29 simonmar]: the strangeness there. No problem! I learned a lot about dynamic linking!
So it seems that `dlsym` always returns a bogus result for `environ`. No, no, it does not look bad at all. The address looks strange but that is caused by the fact that it was created by the dynamic linker. Look at `*defl_env` and `*env` in the second program in comment:25. The addresses match and I checked they really point to the environment array!
In the first program the static linker creates the reference for environ because we take its address `&environ` to print it. So there is a static symbol already there and that confuses the dynamic linker when it searches in `libgmp` and then finds `environ` in `libc`. Once we have fixed this bug I will read the ELF specs again and see if giving us a defunct symbol when we load a weak symbol again is really allowed by the specification.
Your proposed fix only works if we load libraries with `RTLD_LOCAL`
rather than `RTLD_GLOBAL`, I think. That is probably fine, but it needs testing. This commit that introduced `internal_dlsym` explains the rationale: be497c202b790999c3fd0ddc4a4176b8cf6acf7e
I'm fine with refactoring away the `hdl` argument.
There is a branch on my github [https://github.com/trommler/ghc/tree/rtld-8935] where I implemented that and what I proposed above. While my AMD 64 bit and my old PowerMac G5 build ghc, I will read up on the rationale for `internal_dlsym`. If validate succeeds and I am sufficiently confident I understand what `internal_dlsym` needs to do. I'll post my patches. We can remove the info needed. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/8935#comment:30 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler