diff options
author | Zejun Wu <watashi@fb.com> | 2018-12-28 20:48:31 -0800 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2019-01-30 10:06:32 -0500 |
commit | 6e96aa2d503ddeeef1fa1f37b45d5c744522b64d (patch) | |
tree | b02a6f5307a20efc25ddb27c58977069b48972b6 /rts | |
parent | 740534d43cf9f1635c60f6311b7e0d89af962617 (diff) | |
download | haskell-6e96aa2d503ddeeef1fa1f37b45d5c744522b64d.tar.gz |
Don't use X86_64_ELF_NONPIC_HACK for +RTS -xp
Summary:
When `+RTS -xp` is passed, when don't need the X86_64_ELF_NONPIC_HACK,
becasue the relocation offset should only be out of range if
* the object file was not compiled with `-fPIC -fexternal-dynamic-refs`;
* ghc generates non-pic code while it should (e.g. #15723)
In either case, we should print an error message rather that silently
attempt to use a hacky workaround that may not work.
This could have made debugging #15723 and #15729 much easier.
Test Plan:
Run this in a case where ghci used to crash becasue of T15723. Now we
see helpful message like:
```
ghc-iserv-prof: R_X86_64_PC32 relocation out of range:
stmzm2zi4zi4zi1zmJQn4hNPyYjP5m9AcbI88Ve_ControlziConcurrentziSTMziTMVar_readTMVar_C61n_cc
= 9b95ffac
```
Reviewers: simonmar, bgamari, erikd
Reviewed By: simonmar, bgamari
Subscribers: rwbarton, carter
Differential Revision: https://phabricator.haskell.org/D5233
Diffstat (limited to 'rts')
-rw-r--r-- | rts/linker/Elf.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/rts/linker/Elf.c b/rts/linker/Elf.c index 6de531a920..b647d207cb 100644 --- a/rts/linker/Elf.c +++ b/rts/linker/Elf.c @@ -53,11 +53,13 @@ * SILENTLY generate crashing code for data references. This hack is * enabled by X86_64_ELF_NONPIC_HACK. * - * One workaround is to use shared Haskell libraries. This is - * coming. Another workaround is to keep the static libraries but - * compile them with -fPIC, because that will generate PIC references - * to data which can be relocated. The PIC code is still too green to - * do this systematically, though. + * One workaround is to use shared Haskell libraries. This is the case + * when dynamically-linked GHCi is used. + * + * Another workaround is to keep the static libraries but compile them + * with -fPIC -fexternal-dynamic-refs, because that will generate PIC + * references to data which can be relocated. This is the case when + * +RTS -xp is passed. * * See bug #781 * See thread http://www.haskell.org/pipermail/cvs-ghc/2007-September/038458.html @@ -74,7 +76,7 @@ * Sym*_NeedsProto: the symbol is undefined and we add a dummy * default proto extern void sym(void); */ -#define X86_64_ELF_NONPIC_HACK 1 +#define X86_64_ELF_NONPIC_HACK (!RtsFlags.MiscFlags.linkerAlwaysPic) #if defined(sparc_HOST_ARCH) # define ELF_TARGET_SPARC /* Used inside <elf.h> */ |