[llvm] r284780 - Fix PREL31 relocation on ARM
Keno Fischer via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 20 14:15:29 PDT 2016
Author: kfischer
Date: Thu Oct 20 16:15:29 2016
New Revision: 284780
URL: http://llvm.org/viewvc/llvm-project?rev=284780&view=rev
Log:
Fix PREL31 relocation on ARM
Summary:
This is a 31bits relative relocation instead of a 32bits absolute relocation.
Reviewers: t.p.northover, peter.smith, rengolin
Subscribers: aemerson, llvm-commits, samparker
Differential Revision: https://reviews.llvm.org/D25069
Added:
llvm/trunk/test/ExecutionEngine/RuntimeDyld/ARM/ELF_ARM_EXIDX_relocations.s
Modified:
llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp
Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp?rev=284780&r1=284779&r2=284780&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp (original)
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp Thu Oct 20 16:15:29 2016
@@ -463,7 +463,11 @@ void RuntimeDyldELF::resolveARMRelocatio
case ELF::R_ARM_NONE:
break;
+ // Write a 31bit signed offset
case ELF::R_ARM_PREL31:
+ *TargetPtr &= 0x80000000;
+ *TargetPtr |= (Value - FinalAddress) & ~0x80000000;
+ break;
case ELF::R_ARM_TARGET1:
case ELF::R_ARM_ABS32:
*TargetPtr = Value;
Added: llvm/trunk/test/ExecutionEngine/RuntimeDyld/ARM/ELF_ARM_EXIDX_relocations.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/RuntimeDyld/ARM/ELF_ARM_EXIDX_relocations.s?rev=284780&view=auto
==============================================================================
--- llvm/trunk/test/ExecutionEngine/RuntimeDyld/ARM/ELF_ARM_EXIDX_relocations.s (added)
+++ llvm/trunk/test/ExecutionEngine/RuntimeDyld/ARM/ELF_ARM_EXIDX_relocations.s Thu Oct 20 16:15:29 2016
@@ -0,0 +1,23 @@
+# RUN: llvm-mc -triple=arm-linux-gnueabihf -filetype=obj -o %T/reloc.o %s
+# RUN: llvm-rtdyld -triple=arm-linux-gnueabihf -verify -map-section reloc.o,.ARM.exidx=0x6000 -map-section reloc.o,.text=0x4000 -dummy-extern __aeabi_unwind_cpp_pr0=0x1234 -check=%s %T/reloc.o
+
+ .text
+ .syntax unified
+ .eabi_attribute 67, "2.09" @ Tag_conformance
+ .cpu cortex-a8
+ .fpu neon
+ .file "reloc.c"
+ .globl g
+ .align 2
+ .type g,%function
+g:
+ .fnstart
+ movw r0, #1
+ bx lr
+ .Lfunc_end0:
+ .size g, .Lfunc_end0-g
+ .fnend
+
+# rtdyld-check: *{4}(section_addr(reloc.o, .ARM.exidx)) = (g - (section_addr(reloc.o, .ARM.exidx))) & 0x7fffffff
+# Compat unwind info: finish(0xb0), finish(0xb0), finish(0xb0)
+# rtdyld-check: *{4}(section_addr(reloc.o, .ARM.exidx) + 0x4) = 0x80b0b0b0
More information about the llvm-commits
mailing list