[PATCH] D54776: Produce an error on non-encodable offsets for darwin ARM scattered relocations.

Sander Bogaert via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 20 14:54:40 PST 2018


dzn created this revision.
dzn added reviewers: t.p.northover, thegameg.
Herald added subscribers: llvm-commits, chrib, kristof.beyls, javed.absar.

Scattered ARM relocations for Mach-O's only have 24 bits available to encode the offset. This is not checked but just truncated and can result in corrupt binaries after linking because the relocations are applied to the wrong offset. This patch will check and error out in those situations instead of emitting a wrong relocation.


Repository:
  rL LLVM

https://reviews.llvm.org/D54776

Files:
  lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp
  test/MC/MachO/ARM/bad-darwin-ARM-offset-scattered.s


Index: test/MC/MachO/ARM/bad-darwin-ARM-offset-scattered.s
===================================================================
--- /dev/null
+++ test/MC/MachO/ARM/bad-darwin-ARM-offset-scattered.s
@@ -0,0 +1,15 @@
+@ RUN: not llvm-mc -n -triple armv7-apple-darwin10 %s -filetype=obj -o - 2> %t.err > %t
+@ RUN: FileCheck --check-prefix=CHECK-ERROR < %t.err %s
+
+.text
+.space 0x1029eb8
+
+fn:
+    movw  r0, :lower16:(fn2-L1)
+    andeq r0, r0, r0
+L1:
+    andeq r0, r0, r0
+
+fn2:
+
+@ CHECK-ERROR: error: can not encode offset '0x1029EB8' in resulting scattered relocation.
Index: lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp
===================================================================
--- lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp
+++ lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp
@@ -22,6 +22,8 @@
 #include "llvm/MC/MCSection.h"
 #include "llvm/MC/MCValue.h"
 #include "llvm/Support/ErrorHandling.h"
+#include "llvm/Support/ScopedPrinter.h"
+
 using namespace llvm;
 
 namespace {
@@ -144,6 +146,14 @@
                                  MCValue Target,
                                  uint64_t &FixedValue) {
   uint32_t FixupOffset = Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
+
+  if (FixupOffset & 0xff000000) {
+    Asm.getContext().reportError(Fixup.getLoc(),
+        "can not encode offset '0x" + to_hexString(FixupOffset) +
+        "' in resulting scattered relocation.");
+    return;
+  }
+
   unsigned IsPCRel = Writer->isFixupKindPCRel(Asm, Fixup.getKind());
   unsigned Type = MachO::ARM_RELOC_HALF;
 
@@ -250,6 +260,14 @@
                                                     unsigned Log2Size,
                                                     uint64_t &FixedValue) {
   uint32_t FixupOffset = Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
+
+  if (FixupOffset & 0xff000000) {
+    Asm.getContext().reportError(Fixup.getLoc(),
+        "can not encode offset '0x" + to_hexString(FixupOffset) +
+        "' in resulting scattered relocation.");
+    return;
+  }
+
   unsigned IsPCRel = Writer->isFixupKindPCRel(Asm, Fixup.getKind());
 
   // See <reloc.h>.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D54776.174848.patch
Type: text/x-patch
Size: 2133 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181120/5bb18e26/attachment.bin>


More information about the llvm-commits mailing list