[GHC] #11317: Test prog003 fails with segfault on Windows (GHCi)

GHC ghc-devs at haskell.org
Sun Jun 12 11:39:48 UTC 2016


#11317: Test prog003 fails with segfault on Windows (GHCi)
---------------------------------+----------------------------------------
        Reporter:  rdragon       |                Owner:
            Type:  bug           |               Status:  new
        Priority:  normal        |            Milestone:
       Component:  GHCi          |              Version:  7.11
      Resolution:                |             Keywords:  GC
Operating System:  Windows       |         Architecture:  Unknown/Multiple
 Type of failure:  GHCi crash    |            Test Case:  prog003
      Blocked By:                |             Blocking:
 Related Tickets:  #11234 #3408  |  Differential Rev(s):
       Wiki Page:                |
---------------------------------+----------------------------------------

Comment (by Tamar Christina <tamar@…>):

 In [changeset:"b40e1b4c6746bdc34e6a53548a3925d309201c4d/ghc"
 b40e1b4c/ghc]:
 {{{
 #!CommitTicketReference repository="ghc"
 revision="b40e1b4c6746bdc34e6a53548a3925d309201c4d"
 Fix incorrect calculated relocations on Windows x86_64

 Summary:
 See #12031 for analysis, but essentially what happens is:

 To sum 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.

 `PointerToRawData` can't be changed because it's size is fixed by the PE
 specification.

 Instead just like with the other platforms, we now use `section` on
 Windows as well.
 This gives us a `start` parameter of type `void*` which solves the issue.

 This refactors the code to use `section.start` and to fix the issues.

 Test Plan: ./validate and new test added T12031

 Reviewers: RyanGlScott, erikd, bgamari, austin, simonmar

 Reviewed By: simonmar

 Subscribers: thomie, #ghc_windows_task_force

 Differential Revision: https://phabricator.haskell.org/D2316

 GHC Trac Issues: #12031, #11317
 }}}

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


More information about the ghc-tickets mailing list