diff --git a/aclocal.m4 b/aclocal.m4 index 0c2633a090ea38bf5a714a16d557f6725ca1eddb..2282b99c5bd5ee88f98cc28feb91eac00cd51051 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -568,10 +568,18 @@ AC_DEFUN([FPTOOLS_SET_C_LD_FLAGS], $3="$$3 -D_HPUX_SOURCE" $5="$$5 -D_HPUX_SOURCE" ;; - arm*linux* | \ - aarch64*linux* ) - # On arm/linux, aarch64/linux, arm/android and aarch64/android, tell - # gcc to link using the gold linker. + arm*linux*) + # On arm/linux and arm/android, tell gcc to generate Arm + # instructions (ie not Thumb) and to link using the gold linker. + # Forcing LD to be ld.gold is done in FIND_LD m4 macro. + $2="$$2 -marm" + $3="$$3 -fuse-ld=gold -Wl,-z,noexecstack" + $4="$$4 -z noexecstack" + ;; + + aarch64*linux*) + # On aarch64/linux and aarch64/android, tell gcc to link using the + # gold linker. # Forcing LD to be ld.gold is done in FIND_LD m4 macro. $3="$$3 -fuse-ld=gold -Wl,-z,noexecstack" $4="$$4 -z noexecstack" diff --git a/compiler/ghci/ByteCodeItbls.hs b/compiler/ghci/ByteCodeItbls.hs index cd31acb7b67cc106617c8ee451613b7dc775f176..a01fcd89b9720daac1ab17ba6254cece1926f9df 100644 --- a/compiler/ghci/ByteCodeItbls.hs +++ b/compiler/ghci/ByteCodeItbls.hs @@ -219,17 +219,17 @@ mkJumpToAddr dflags a = case platformArch (targetPlatform dflags) of , fromIntegral ((w64 `shiftR` 32) .&. 0x0000FFFF) ] ArchARM { } -> - -- Generates Thumb sequence, + -- Generates Arm sequence, -- ldr r1, [pc, #0] -- bx r1 -- -- which looks like: -- 00000000 <.addr-0x8>: - -- 0: 4900 ldr r1, [pc] ; 8 <.addr> - -- 4: 4708 bx r1 + -- 0: 00109fe5 ldr r1, [pc] ; 8 <.addr> + -- 4: 11ff2fe1 bx r1 let w32 = fromIntegral (funPtrToInt a) :: Word32 - in Left [ 0x49, 0x00 - , 0x47, 0x08 + in Left [ 0x00, 0x10, 0x9f, 0xe5 + , 0x11, 0xff, 0x2f, 0xe1 , byte0 w32, byte1 w32, byte2 w32, byte3 w32] arch -> diff --git a/compiler/llvmGen/LlvmCodeGen/Ppr.hs b/compiler/llvmGen/LlvmCodeGen/Ppr.hs index 1a9373bce274a20b58fb748c681ee1d5f5ab6d74..d7ddf804f2460f064c4078700813c2f03eee9af5 100644 --- a/compiler/llvmGen/LlvmCodeGen/Ppr.hs +++ b/compiler/llvmGen/LlvmCodeGen/Ppr.hs @@ -52,7 +52,7 @@ moduleLayout = sdocWithPlatform $ \platform -> $+$ text "target triple = \"x86_64-linux-gnu\"" Platform { platformArch = ArchARM {}, platformOS = OSLinux } -> text "target datalayout = \"e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:128-a0:0:64-n32\"" - $+$ text "target triple = \"arm-unknown-linux-gnueabi\"" + $+$ text "target triple = \"armv6-unknown-linux-gnueabihf\"" Platform { platformArch = ArchARM {}, platformOS = OSAndroid } -> text "target datalayout = \"e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:128-a0:0:64-n32\"" $+$ text "target triple = \"arm-unknown-linux-androideabi\"" diff --git a/rts/Linker.c b/rts/Linker.c index 0a13e6f0187743ebb17dcbcb73c4d6052604bf1f..355b33a769e7afce5a7459de5dcff25396af346a 100644 --- a/rts/Linker.c +++ b/rts/Linker.c @@ -5564,6 +5564,11 @@ do_Elf_Rel_relocations ( ObjectCode* oc, char* ehdrC, #ifdef arm_HOST_ARCH // Thumb instructions have bit 0 of symbol's st_value set is_target_thm = S & 0x1; + + if (is_target_thm) + errorBelch( "Symbol `%s' requires Thumb linkage which is not " + "currently supported.\n", symbol ); + T = sym.st_info & STT_FUNC && is_target_thm; // Make sure we clear bit 0. Strictly speaking we should have done