diff options
author | Zejun Wu <watashi@fb.com> | 2018-12-28 20:37:13 -0800 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2019-01-30 10:06:32 -0500 |
commit | e29b1ee72d77d5a06ac949f9dcc80108243a25c0 (patch) | |
tree | 3c2104b52c52d77b130c98d3cd486eb47ed2f347 /includes | |
parent | 4bf35da4fccd2a21153a1c19bfa80006e99e02a1 (diff) | |
download | haskell-e29b1ee72d77d5a06ac949f9dcc80108243a25c0.tar.gz |
Add a RTS option -xp to load PIC object anywhere in address space
Summary:
This re-applies {D5195} with fixes for i386:
* Fix unused label warnings, see {D5230} or {D5273}
* Fix a silly bug introduced by moving `#if`
{P190}
Add a RTS option -xp to load PIC object anywhere in address space. We do
this by relaxing the requirement of <0x80000000 result of
`mmapForLinker` and implying USE_CONTIGUOUS_MMAP.
We also need to change calls to `ocInit` and `ocGetNames` to avoid
dangling pointers when the address of `oc->image` is changed by
`ocAllocateSymbolExtra`.
Test Plan:
See {D5195}, also test under i386:
```
$ uname -a
Linux watashi-arch32 4.18.5-arch1-1.0-ARCH #1 SMP PREEMPT Tue Aug 28
20:45:30 CEST 2018 i686 GNU/Linux
$ cd testsuite/tests/th/ && make test
...
```
will run `./validate` on stacked diff.
Reviewers: simonmar, bgamari, alpmestan, trommler, hvr, erikd
Reviewed By: simonmar
Subscribers: rwbarton, carter
Differential Revision: https://phabricator.haskell.org/D5289
Diffstat (limited to 'includes')
-rw-r--r-- | includes/rts/Flags.h | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/includes/rts/Flags.h b/includes/rts/Flags.h index 63450d5ece..3582e6abde 100644 --- a/includes/rts/Flags.h +++ b/includes/rts/Flags.h @@ -188,6 +188,17 @@ typedef struct _CONCURRENT_FLAGS { */ #define DEFAULT_TICK_INTERVAL USToTime(10000) +/* + * When linkerAlwaysPic is true, the runtime linker assume that all object + * files were compiled with -fPIC -fexternal-dynamic-refs and load them + * anywhere in the address space. + */ +#if defined(x86_64_HOST_ARCH) && defined(darwin_HOST_OS) +#define DEFAULT_LINKER_ALWAYS_PIC true +#else +#define DEFAULT_LINKER_ALWAYS_PIC false +#endif + /* See Note [Synchronization of flags and base APIs] */ typedef struct _MISC_FLAGS { Time tickInterval; /* units: TIME_RESOLUTION */ @@ -197,6 +208,7 @@ typedef struct _MISC_FLAGS { bool generate_stack_trace; bool machineReadable; bool internalCounters; /* See Note [Internal Counter Stats] */ + bool linkerAlwaysPic; /* Assume the object code is always PIC */ StgWord linkerMemBase; /* address to ask the OS for memory * for the linker, NULL ==> off */ } MISC_FLAGS; |