[GHC] #12031: GHCi segfaults on Windows when compiling C code using extern-declared variable
GHC
ghc-devs at haskell.org
Wed Jun 8 19:08:18 UTC 2016
#12031: GHCi segfaults on Windows when compiling C code using extern-declared
variable
--------------------------------+----------------------------------------
Reporter: RyanGlScott | Owner: Phyx-
Type: bug | Status: new
Priority: normal | Milestone:
Component: GHCi | Version: 8.0.1
Resolution: | Keywords:
Operating System: Windows | Architecture: Unknown/Multiple
Type of failure: GHCi crash | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s):
Wiki Page: |
--------------------------------+----------------------------------------
Comment (by Phyx-):
To round up the issue, the reason this seems to go wrong is because of how
we initialize the `.bss` section for Windows in the runtime linker.
The first issue is where we calculate the zero space for the section:
{{{
zspace = stgCallocBytes(1, bss_sz, "ocGetNames_PEi386(anonymous bss)");
sectab_i->PointerToRawData = ((UChar*)zspace) - ((UChar*)(oc->image));
}}}
Where
{{{
UInt32 PointerToRawData;
}}}
This means we're stuffing a `64-bit` value into a `32-bit` one. Also
`zspace` can be larger than `oc->image`. In which case it'll overflow and
then get truncated in the cast.
The address of a value in the `.bss` section is then calculated as:
{{{
addr = ((UChar*)(oc->image))
+ (sectabent->PointerToRawData
+ symtab_i->Value);
}}}
If it does truncate then this calculation won't be correct (which is what
is happening).
We then later use the value of `addr` as the `S` (Symbol) value for the
relocations
{{{
S = (size_t) lookupSymbol_( (char*)symbol );
}}}
Now the majority of the relocations are `R_X86_64_PC32` etc. e.g. They are
guaranteed to fit in a `32-bit` value.
The `R_X86_64_64` introduced for these pseudo-relocations so they can use
the full `48-bit` addressing space isn't as lucky. As for why it sometimes
work has to do on whether the value is truncated or not.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/12031#comment:3>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list