Skip to content
  • Zejun Wu's avatar
    Add a RTS option -xp to load PIC object anywhere in address space · 104599f3
    Zejun Wu authored and Ben Gamari's avatar Ben Gamari committed
    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:
    ```
    $ uname -a
    Linux localhost 4.18.8-arch1-1-ARCH #1 SMP PREEMPT Sat Sep 15 20:34:48
    UTC 2018 x86_64 GNU/Linux
    $ cat mk/build.mk
    DYNAMIC_GHC_PROGRAMS = NO
    DYNAMIC_BY_DEFAULT = NO
    
    GhcRTSWays += thr_debug
    EXTRA_HC_OPTS += -debug
    WAY_p_HC_OPTS += -fPIC -fexternal-dynamic-refs
    $ inplace/bin/ghc-stage2 --interactive -prof +RTS -xp
    GHCi, version 8.7.20180928: http://www.haskell.org/ghc/  :? for help
    ghc-stage2: R_X86_64_32 relocation out of range:
    ghczmprim_GHCziTypes_ZMZN_closure = 7f690bffab59
    Recompile
    /data/users/watashi/ghc/libraries/ghc-prim/dist-install/build/HSghc-prim
    -0.5.3.o with -fPIC -fexternal-dynamic-refs.
    ghc-stage2: unable to load package `ghc-prim-0.5.3'
    $ strace -f -e open,mmap inplace/bin/ghc-stage2 --interactive -prof
    -fexternal-interpreter  -opti+RTS -opti-xp
    ...
    [pid 1355283]
    open("/data/users/watashi/ghc/libraries/base/dist-install/build/libHSbas
    e-4.12.0.0_p.a", O_RDONLY) = 14
    [pid 1355283] mmap(NULL, 8192, PROT_READ|PROT_WRITE|PROT_EXEC,
    MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f6a84842000
    [pid 1355283]
    open("/data/users/watashi/ghc/libraries/base/dist-install/build/libHSbas
    e-4.12.0.0_p.a", O_RDONLY) = 14
    [pid 1355283] mmap(NULL, 8192, PROT_READ|PROT_WRITE|PROT_EXEC,
    MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f6a84676000
    ...
    Prelude> System.Posix.Process.getProcessID
    ...
    [pid 1355283]
    open("/data/users/watashi/ghc/libraries/unix/dist-install/build/libHSuni
    x-2.7.2.2_p.a", O_RDONLY) = 14
    [pid 1355283] mmap(NULL, 45056, PROT_READ|PROT_WRITE|PROT_EXEC,
    MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f6a67d60000
    [pid 1355283]
    open("/data/users/watashi/ghc/libraries/unix/dist-install/build/libHSuni
    x-2.7.2.2_p.a", O_RDONLY) = 14
    [pid 1355283] mmap(NULL, 57344, PROT_READ|PROT_WRITE|PROT_EXEC,
    MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f6a67d52000
    ...
    ```
    
    ```
    $ uname -a
    Darwin watashis-iMac.local 18.0.0 Darwin Kernel Version 18.0.0: Wed Aug
    22 20:13:40 PDT 2018; root:xnu-4903.201.2~1/RELEASE_X86_64 x86_64
    $ mv
    /Users/watashi/gao/ghc/libraries/integer-gmp/dist-install/build/HSintege
    r-gmp-1.0.2.0.o{,._DISABLE_GHC_ISSUE_15105}
    $ inplace/bin/ghc-stage2 --interactive  +RTS -xp
    GHCi, version 8.7.20181003: http://www.haskell.org/ghc/  :? for help
    Prelude> System.Posix.Process.getProcessID
    42791
    Prelude> Data.Set.fromList [1 .. 10]
    fromList [1,2,3,4,5,6,7,8,9,10]
    Prelude>
    Leaving GHCi.
    $ inplace/bin/ghc-stage2 --interactive -prof -fexternal-interpreter
    GHCi, version 8.7.20181003: http://www.haskell.org/ghc/  :? for help
    Prelude> System.Posix.Process.getProcessID
    42806
    Prelude> Data.Set.fromList [1 .. 10]
    fromList [1,2,3,4,5,6,7,8,9,10]
    Prelude>
    Leaving GHCi.
    ```
    
    Also test with something that used to hit the 2Gb limit and it loads
    and runs without problem.
    
    Reviewers: simonmar, bgamari, angerman, Phyx, hvr, erikd
    
    Reviewed By: simonmar
    
    Subscribers: rwbarton, carter
    
    Differential Revision: https://phabricator.haskell.org/D5195
    104599f3