[ELF] - Relax checks for R_386_8/R_386_16 relocations.
authorGeorge Rimar <grimar@accesssoftek.com>
Tue, 3 Apr 2018 12:19:04 +0000 (12:19 +0000)
committerGeorge Rimar <grimar@accesssoftek.com>
Tue, 3 Apr 2018 12:19:04 +0000 (12:19 +0000)
commitbc1d58a6b1cfe13e4b7f24de505bbb286febc73e
tree28cd875daf31cb2a6273a20a96ca8c8d4eb2052a
parentbfbeecdc5dfab7485dfe44b8a86638253c7e6f47
[ELF] - Relax checks for R_386_8/R_386_16 relocations.

This fixes PR36927.

The issue is next. Imagine we have -Ttext 0x7c and code below.

.code16
.global _start
_start:
movb $_start+0x83,%ah

So we have R_386_8 relocation and _start at 0x7C.
Addend is 0x83 == 131. We will sign extend it to 0xffffffffffffff83.

Now, 0xffffffffffffff83 + 0x7c gives us 0xFFFFFFFFFFFFFFFF.
Techically 0x83 + 0x7c == 0xFF, we do not exceed 1 byte value, but
currently LLD errors out, because we use checkUInt<8>.

Let's try to use checkInt<8> now and the following code to see if it can help (no):
main.s:
.byte foo

input.s:
.globl foo
.hidden foo
foo = 0xff

Here, foo is 0xFF. And addend is 0x0. Final value is 0x00000000000000FF.
Again, it fits one byte well, but with checkInt<8>,
we would error out it, so we can't use it.

What we want to do is to check that the result fits 1 byte well.
Patch changes the check to checkIntUInt to fix the issue.

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

llvm-svn: 329061
lld/ELF/Arch/X86.cpp
lld/test/ELF/i386-reloc-16-large-addend.s [new file with mode: 0644]
lld/test/ELF/i386-reloc-16.s
lld/test/ELF/i386-reloc-8-large-addend.s [new file with mode: 0644]
lld/test/ELF/i386-reloc-8.s