[GHC] #12147: GHC's Linker Should Support Relocation Type 42
GHC
ghc-devs at haskell.org
Sun Jun 5 07:18:48 UTC 2016
#12147: GHC's Linker Should Support Relocation Type 42
-------------------------------------+-------------------------------------
Reporter: gershomb | Owner: Phyx-
Type: bug | Status: patch
Priority: high | Milestone: 8.0.2
Component: Runtime System | Version: 8.0.1
(Linker) |
Resolution: | Keywords:
Operating System: Linux | Architecture:
| Unknown/Multiple
Type of failure: None/Unknown | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s): Phab:D2303
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by Phyx-):
I haven't written a testcase since you need `binutils-2.26` for it to
trigger and I don't think I can force the test only then.
In any case, simplest case to reproduce this is to compile `GHC` with
`DYNAMIC_GHC_PROGRAMS=NO`
I use this assembly file as input:
{{{
# x86_64
# as as_test.s -o as_test.o && objdump -Dr as_test.o
# ghc --interactive hs_test as_test.o
.text
.globl foo
foo:
push %rbp
mov %rsp, %rbp
mov msg at GOTPCREL(%rip), %rdi
call puts at PLT
pop %rbp
ret
.data
msg:
.ascii "Hello World!\0"
len = . - msg
}}}
Which with
{{{
[phyx at localhost ~]$ as --version
GNU assembler (GNU Binutils) 2.26.20160125
}}}
returns the expected relocation
{{{
[phyx at localhost ~]$ as as_test.s -o as_test.o && objdump -Dr as_test.o
as_test.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <foo>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 48 8b 3d 00 00 00 00 mov 0x0(%rip),%rdi # b <foo+0xb>
7: R_X86_64_REX_GOTPCRELX msg-0x4
b: e8 00 00 00 00 callq 10 <foo+0x10>
c: R_X86_64_PLT32 puts-0x4
10: 5d pop %rbp
11: c3 retq
Disassembly of section .data:
0000000000000000 <msg>:
0: 48 rex.W
1: 65 6c gs insb (%dx),%es:(%rdi)
3: 6c insb (%dx),%es:(%rdi)
4: 6f outsl %ds:(%rsi),(%dx)
5: 20 57 6f and %dl,0x6f(%rdi)
8: 72 6c jb 76 <len+0x69>
a: 64 21 00 and %eax,%fs:(%rax)
}}}
Before the patch it crashes as expected
{{{
[phyx at localhost ~]$ ghc/inplace/bin/ghc-stage2 --interactive as_test.o
hs_test.hs
GHCi, version 8.1.20160604: http://www.haskell.org/ghc/ :? for help
ghc-stage2: as_test.o: unhandled ELF relocation(RelA) type 42
linking extra libraries/objects failed
}}}
And after the patch
{{{
GHCi, version 8.1.20160604: http://www.haskell.org/ghc/ :? for help
[1 of 1] Compiling Main ( hs_test.hs, interpreted )
Ok, modules loaded: Main.
*Main> main
Hello World!
}}}
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/12147#comment:7>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list