forked from OSchip/llvm-project
[lld-macho] Support X86_64_RELOC_UNSIGNED
Note that it's only used for non-pc-relative contexts. Reviewed By: MaskRay, smeenai Differential Revision: https://reviews.llvm.org/D80048
This commit is contained in:
parent
e270b2f172
commit
1f820e3559
|
@ -47,6 +47,8 @@ uint64_t X86_64::getImplicitAddend(const uint8_t *loc, uint8_t type) const {
|
|||
case X86_64_RELOC_SIGNED_4:
|
||||
case X86_64_RELOC_GOT_LOAD:
|
||||
return read32le(loc);
|
||||
case X86_64_RELOC_UNSIGNED:
|
||||
return read64le(loc);
|
||||
default:
|
||||
error("TODO: Unhandled relocation type " + std::to_string(type));
|
||||
return 0;
|
||||
|
@ -65,6 +67,9 @@ void X86_64::relocateOne(uint8_t *loc, uint8_t type, uint64_t val) const {
|
|||
// since the RIP has advanced by 4 at this point.
|
||||
write32le(loc, val - 4);
|
||||
break;
|
||||
case X86_64_RELOC_UNSIGNED:
|
||||
write64le(loc, val);
|
||||
break;
|
||||
default:
|
||||
llvm_unreachable(
|
||||
"getImplicitAddend should have flagged all unhandled relocation types");
|
||||
|
|
|
@ -173,11 +173,10 @@ void InputFile::parseRelocations(const section_64 &sec,
|
|||
fatal("TODO: Scattered relocations not supported");
|
||||
|
||||
auto rel = reinterpret_cast<const relocation_info &>(anyRel);
|
||||
if (!rel.r_pcrel)
|
||||
fatal("TODO: Only pcrel relocations are supported");
|
||||
|
||||
Reloc r;
|
||||
r.type = rel.r_type;
|
||||
r.pcrel = rel.r_pcrel;
|
||||
uint32_t secRelOffset = rel.r_address;
|
||||
uint64_t rawAddend =
|
||||
target->getImplicitAddend(buf + sec.offset + secRelOffset, r.type);
|
||||
|
@ -186,6 +185,9 @@ void InputFile::parseRelocations(const section_64 &sec,
|
|||
r.target = symbols[rel.r_symbolnum];
|
||||
r.addend = rawAddend;
|
||||
} else {
|
||||
if (!rel.r_pcrel)
|
||||
fatal("TODO: Only pcrel section relocations are supported");
|
||||
|
||||
if (rel.r_symbolnum == 0 || rel.r_symbolnum > subsections.size())
|
||||
fatal("invalid section index in relocation for offset " +
|
||||
std::to_string(r.offset) + " in section " + sec.sectname +
|
||||
|
|
|
@ -43,7 +43,7 @@ void InputSection::writeTo(uint8_t *buf) {
|
|||
}
|
||||
|
||||
uint64_t val = va + r.addend;
|
||||
if (1) // TODO: handle non-pcrel relocations
|
||||
if (r.pcrel)
|
||||
val -= getVA() + r.offset;
|
||||
target->relocateOne(buf + r.offset, r.type, val);
|
||||
}
|
||||
|
|
|
@ -24,12 +24,13 @@ class Symbol;
|
|||
|
||||
struct Reloc {
|
||||
uint8_t type;
|
||||
// Adding this offset to the address of the target symbol or subsection gives
|
||||
// the destination that this relocation refers to.
|
||||
uint32_t addend;
|
||||
bool pcrel;
|
||||
// The offset from the start of the subsection that this relocation belongs
|
||||
// to.
|
||||
uint32_t offset;
|
||||
// Adding this offset to the address of the target symbol or subsection gives
|
||||
// the destination that this relocation refers to.
|
||||
uint64_t addend;
|
||||
llvm::PointerUnion<Symbol *, InputSection *> target;
|
||||
};
|
||||
|
||||
|
|
|
@ -29,6 +29,7 @@ enum {
|
|||
class TargetInfo {
|
||||
public:
|
||||
virtual ~TargetInfo() = default;
|
||||
|
||||
virtual uint64_t getImplicitAddend(const uint8_t *loc,
|
||||
uint8_t type) const = 0;
|
||||
virtual void relocateOne(uint8_t *loc, uint8_t type, uint64_t val) const = 0;
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
# REQUIRES: x86
|
||||
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t.o
|
||||
# RUN: lld -flavor darwinnew -o %t %t.o
|
||||
# RUN: llvm-objdump --full-contents %t | FileCheck %s
|
||||
# CHECK: Contents of section foo:
|
||||
# CHECK: 2000 08200000 00000000
|
||||
# CHECK: Contents of section bar:
|
||||
# CHECK: 2008 11311111 01000000
|
||||
|
||||
.globl _main, _foo, _bar
|
||||
|
||||
.section __DATA,foo
|
||||
_foo:
|
||||
.quad _bar
|
||||
|
||||
.section __DATA,bar
|
||||
_bar:
|
||||
## The unsigned relocation should support 64-bit addends
|
||||
.quad _foo + 0x111111111
|
||||
|
||||
.text
|
||||
_main:
|
||||
mov $0, %rax
|
||||
ret
|
Loading…
Reference in New Issue