[ELF][MIPS] Check for overflow when writing R_MIPS_CALL16 and R_MIPS_TLS_GOTTPREL

Summary:
These are 16 bit relocations and not part of a HI/LO pair so we need to
check that they don't overflow.

Reviewers: atanasyan

Reviewed By: atanasyan

Subscribers: ruiu, llvm-commits, emaste, sdardis

Tags: #lld

Differential Revision: https://reviews.llvm.org/D38614

llvm-svn: 315073
This commit is contained in:
Alexander Richardson 2017-10-06 16:15:59 +00:00
parent 195a66f6eb
commit f52a3b94e1
2 changed files with 31 additions and 2 deletions

View File

@ -501,21 +501,21 @@ void MIPS<ELFT>::relocateOne(uint8_t *Loc, uint32_t Type, uint64_t Val) const {
writeMicroRelocation32<E>(Loc, Val, 16, 0);
}
break;
case R_MIPS_CALL16:
case R_MIPS_GOT_DISP:
case R_MIPS_GOT_PAGE:
case R_MIPS_GPREL16:
case R_MIPS_TLS_GD:
case R_MIPS_TLS_GOTTPREL:
case R_MIPS_TLS_LDM:
checkInt<16>(Loc, Val, Type);
LLVM_FALLTHROUGH;
case R_MIPS_CALL16:
case R_MIPS_CALL_LO16:
case R_MIPS_GOT_LO16:
case R_MIPS_GOT_OFST:
case R_MIPS_LO16:
case R_MIPS_PCLO16:
case R_MIPS_TLS_DTPREL_LO16:
case R_MIPS_TLS_GOTTPREL:
case R_MIPS_TLS_TPREL_LO16:
writeRelocation<E>(Loc, Val, 16, 0);
break;

View File

@ -0,0 +1,29 @@
# Check that we create an error on an out-of-bounds R_MIPS_CALL_16
# REQUIRES: mips
# RUN: llvm-mc -filetype=obj -triple=mips64-unknown-linux %s -o %t1.o
# RUN: not ld.lld %t1.o -o %t.exe 2>&1 | FileCheck %s
# CHECK: relocation R_MIPS_CALL16 out of range
.macro generate_values
.irp i, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
.irp j, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
.irp k, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
.irp l, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
.text
.globl sym_\i\j\k\l
sym_\i\j\k\l:
nop
lw $25,%call16(sym_\i\j\k\l)($28)
.endr
.endr
.endr
.endr
.endm
generate_values
.globl __start
__start:
nop