[commit: ghc] master: powerpc: add basic support for PLT relocations (#10402) (c084796)

git at git.haskell.org git at git.haskell.org
Tue Jun 23 12:39:43 UTC 2015


Repository : ssh://git@git.haskell.org/ghc

On branch  : master
Link       : http://ghc.haskell.org/trac/ghc/changeset/c0847967caf51ea4ca88d0ffc25fe1bd99dcabed/ghc

>---------------------------------------------------------------

commit c0847967caf51ea4ca88d0ffc25fe1bd99dcabed
Author: Sergei Trofimovich <slyfox at gentoo.org>
Date:   Tue Jun 23 07:39:34 2015 -0500

    powerpc: add basic support for PLT relocations (#10402)
    
    Commit a93ab43ab5f40cadbedea2f6342b93c245e91434
    enabled support for proper PIC relocations from
    assembler.
    
    Commit adds support for relocations of type:
        R_PPC_REL16_HI
        R_PPC_REL16_HA
        R_PPC_REL16_LO
        R_PPC_PLTREL24
    
    They are used only when GHC is built in
        DYNAMIC_GHC_PROGRAMS = NO
    mode.
    
    Verified by running the following test:
    
        // cat a.c
        #include <stdio.h>
    
        void ffi_a_hello (int i) {
            fprintf (stderr, "WEEEEEEEE: i=%d\n", i);
        }
    
        -- cat A.hs
        {-# LANGUAGE ForeignFunctionInterface #-}
        module A where
    
        import Foreign.C
    
        foreign import ccall "ffi_a_hello" a :: CInt -> IO ()
    
        # ghc -fPIC -c a.c -fforce-recomp
        # ghc -fPIC -c A.hs -fforce-recomp
        # ghc --interactive ./a.o A
        ...
        *A> a 42
        WEEEEEEEE: i=42
    See gory details in Trac #10402.
    
    Signed-off-by: Colin Watson <cjwatson at debian.org>
    Signed-off-by: Sergei Trofimovich <siarheit at google.com>
    
    Reviewed By: bgamari, austin
    
    Differential Revision: https://phabricator.haskell.org/D996
    
    GHC Trac Issues: #10402


>---------------------------------------------------------------

c0847967caf51ea4ca88d0ffc25fe1bd99dcabed
 rts/Linker.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/rts/Linker.c b/rts/Linker.c
index f3b170b..2437e83 100644
--- a/rts/Linker.c
+++ b/rts/Linker.c
@@ -5952,6 +5952,9 @@ do_Elf_Rela_relocations ( ObjectCode* oc, char* ehdrC,
             *(Elf32_Word *) P = value - P;
             break;
 
+         case R_PPC_PLTREL24:
+            value -= 0x8000; /* See Note [.LCTOC1 in PPC PIC code] */
+            /* fallthrough */
          case R_PPC_REL24:
             delta = value - P;
 
@@ -5972,6 +5975,18 @@ do_Elf_Rela_relocations ( ObjectCode* oc, char* ehdrC,
             *(Elf_Word *) P = (*(Elf_Word *) P & 0xfc000003)
                                           | (delta & 0x3fffffc);
             break;
+
+         case R_PPC_REL16_LO:
+            *(Elf32_Half*) P = value - P;
+            break;
+
+         case R_PPC_REL16_HI:
+            *(Elf32_Half*) P = (value - P) >> 16;
+            break;
+
+         case R_PPC_REL16_HA:
+            *(Elf32_Half*) P = (value + 0x8000 - P) >> 16;
+            break;
 #        endif
 
 #if x86_64_HOST_ARCH



More information about the ghc-commits mailing list