1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00

Produce an error on non-encodable offsets for darwin ARM scattered relocations.

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.

Patch by: Sander Bogaert (dzn)

Differential revision: https://reviews.llvm.org/D54776

llvm-svn: 347922
This commit is contained in:
Jonas Devlieghere 2018-11-29 21:58:23 +00:00
parent 9276bb5427
commit 48fe864a41
2 changed files with 35 additions and 0 deletions

View File

@ -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,15 @@ RecordARMScatteredHalfRelocation(MachObjectWriter *Writer,
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 +261,15 @@ void ARMMachObjectWriter::RecordARMScatteredRelocation(MachObjectWriter *Writer,
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>.

View File

@ -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.