[GHC] #13617: GHCI Linker incorrectly handles the R_X86_64_PC32 relocation (was: Segfault in Windows GHCi involving C code compiled with -O4)
GHC
ghc-devs at haskell.org
Sun Jul 9 11:33:26 UTC 2017
#13617: GHCI Linker incorrectly handles the R_X86_64_PC32 relocation
--------------------------------+----------------------------------------
Reporter: RyanGlScott | Owner: Phyx-
Type: bug | Status: new
Priority: normal | Milestone:
Component: GHCi | Version: 8.0.2
Resolution: | Keywords:
Operating System: Windows | Architecture: Unknown/Multiple
Type of failure: GHCi crash | Test Case:
Blocked By: | Blocking:
Related Tickets: #7134 | Differential Rev(s):
Wiki Page: |
--------------------------------+----------------------------------------
Changes (by Phyx-):
* owner: (none) => Phyx-
* related: => #7134
Comment:
So I've finally had some time to track this one down.
The difference between the `-O2` and the `-O3` code is that the `-O3` code
is vectorized and the constants are moved to `.rdata`. To get to the
constants a `R_X86_64_PC32` relocation is used.
{{{
ac: 48 c1 e0 02 shl $0x2,%rax
b0: 31 db xor %ebx,%ebx
b2: 66 0f 6f 15 00 00 00 movdqa 0x0(%rip),%xmm2 # ba
<stepI+0xba>
b9: 00
b6: R_X86_64_PC32 .rdata
ba: 48 8d 2c 02 lea (%rdx,%rax,1),%rbp
be: 41 c1 ea 02 shr $0x2,%r10d
}}}
At runtime the program segfaults at `0xb2` when attempting to read from
`.rdata`.
{{{
│0xced01d2 shl $0x2,%rax
│
│0xced01d6 xor %ebx,%ebx
│
>│0xced01d8 movdqa 0xd8(%rip),%xmm2 # 0xced02b8
│
│0xced01e0 lea (%rdx,%rax,1),%rbp
│
│0xced01e4 shr $0x2,%r10d
}}}
The calculated address for `.rdata` is correct, `0xced02b8`:
{{{
(gdb) x/10i 0xced02b8
0xced02b8: add %eax,(%rax)
0xced02ba: add %al,(%rax)
0xced02bc: add %eax,(%rax)
0xced02be: add %al,(%rax)
0xced02c0: add %eax,(%rax)
0xced02c2: add %al,(%rax)
0xced02c4: add %eax,(%rax)
0xced02c6: add %al,(%rax)
0xced02c8: rex.RXB
0xced02c9: rex.XB
}}}
and the object file has
{{{
Disassembly of section .rdata:
0000000000000000 <.rdata>:
0: 01 00 add %eax,(%rax)
2: 00 00 add %al,(%rax)
4: 01 00 add %eax,(%rax)
6: 00 00 add %al,(%rax)
8: 01 00 add %eax,(%rax)
a: 00 00 add %al,(%rax)
c: 01 00 add %eax,(%rax)
...
}}}
However the code is referencing this address. So I suspect it's expecting
a trampoline here. So perhaps `R_X86_64_PC32` should be allocated using a
jump island.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13617#comment:2>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list