forked from OSchip/llvm-project
[ELF] - Use SignExtend when reading R_386_PC8, R_386_PC16 addends.
Previously we did not do that. For example, for R_386_PC8, 0xFF addend was not treated as 0xFFFFFFFF(-1), but was 0x000000FF. Recently added checks for R_386_PC8/R_386_PC16 failed because of calculation overflow as a result. Differential revision: https://reviews.llvm.org/D29490 llvm-svn: 294289
This commit is contained in:
parent
84b3cc394d
commit
89108cc1c6
|
@ -491,11 +491,13 @@ int64_t X86TargetInfo::getImplicitAddend(const uint8_t *Buf,
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
case R_386_8:
|
case R_386_8:
|
||||||
case R_386_PC8:
|
|
||||||
return *Buf;
|
return *Buf;
|
||||||
|
case R_386_PC8:
|
||||||
|
return SignExtend64<8>(*Buf);
|
||||||
case R_386_16:
|
case R_386_16:
|
||||||
case R_386_PC16:
|
|
||||||
return read16le(Buf);
|
return read16le(Buf);
|
||||||
|
case R_386_PC16:
|
||||||
|
return SignExtend64<16>(read16le(Buf));
|
||||||
case R_386_32:
|
case R_386_32:
|
||||||
case R_386_GOT32:
|
case R_386_GOT32:
|
||||||
case R_386_GOT32X:
|
case R_386_GOT32X:
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
# REQUIRES: x86
|
||||||
|
# RUN: llvm-mc -filetype=obj -triple=i386-pc-linux-gnu %s -o %t1.o
|
||||||
|
|
||||||
|
# RUN: ld.lld %t1.o -o %t.out
|
||||||
|
# RUN: llvm-objdump -s -t %t.out | FileCheck %s
|
||||||
|
# CHECK: Contents of section .text:
|
||||||
|
# CHECK-NEXT: 11000 020000
|
||||||
|
## 0x11003 - 0x11000 + addend(-1) = 0x02
|
||||||
|
## 0x11003 - 0x11001 + addend(-2) = 0x0000
|
||||||
|
# CHECK: SYMBOL TABLE:
|
||||||
|
# CHECK: 00011003 .und
|
||||||
|
|
||||||
|
.byte und-.-1
|
||||||
|
.short und-.-2
|
||||||
|
|
||||||
|
.section .und, "ax"
|
||||||
|
und:
|
Loading…
Reference in New Issue