
#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 simonmar): `libgmp` is not symbolic on my system either. Symbol information and relocs for the program: {{{ $ objdump --syms --dynamic-syms --reloc --dynamic-reloc ./a.out | grep envir 0000000000000000 l df *ABS* 0000000000000000 check- environ.c 0000000000601060 w O .bss 0000000000000008 environ@@GLIBC_2.2.5 0000000000601060 g O .bss 0000000000000008 __environ@@GLIBC_2.2.5 0000000000601060 w DO .bss 0000000000000008 GLIBC_2.2.5 _environ 0000000000601060 w DO .bss 0000000000000008 GLIBC_2.2.5 environ 0000000000601060 g DO .bss 0000000000000008 GLIBC_2.2.5 __environ 0000000000601060 R_X86_64_COPY __environ }}} Note there are 3 symbols at the same location (`environ`, `_environ`, and `__environ`). The first two are weak, the third is global. The third is also a copy reloc, which means its contents is copied to this location when the program starts up. Symbol information and relocs for libc: {{{ $ objdump --syms --dynamic-syms --reloc --dynamic-reloc /lib/x86_64-linux- gnu/libc-2.17.so | grep envir 00000000003c44e8 w DO .bss 0000000000000008 GLIBC_2.2.5 _environ 00000000003c44e8 w DO .bss 0000000000000008 GLIBC_2.2.5 environ 00000000003c44e8 g DO .bss 0000000000000008 GLIBC_2.2.5 __environ 00000000003c0de0 R_X86_64_GLOB_DAT _environ 00000000003c0ea8 R_X86_64_GLOB_DAT __environ }}} Again we have 3 symbols at the same location, all 8 bytes long. There are no mentions of any `environ` symbol in `libgmp`'s symbol table or relocations. `LD_DEBUG=all` shows a normal lookup like this: {{{ 23419: symbol=environ; lookup in file=./a.out [0] 23419: binding file ./a.out [0] to ./a.out [0]: normal symbol `environ' }}} but the lookup in `libgmp` looks like this: {{{ 23419: symbol=environ; lookup in file=/usr/lib/x86_64-linux- gnu/libgmp.so [0] 23419: symbol=environ; lookup in file=/lib/x86_64-linux- gnu/libc.so.6 [0] 23419: binding file /usr/lib/x86_64-linux-gnu/libgmp.so [0] to /lib/x86_64-linux-gnu/libc.so.6 [0]: normal symbol `environ' }}} I still have no idea why the lookup in `libgmp` is behaving differently from the others. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/8935#comment:17 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler