diff options
| author | Saleem Abdulrasool <compnerd@compnerd.org> | 2015-01-01 03:11:53 +0000 |
|---|---|---|
| committer | Saleem Abdulrasool <compnerd@compnerd.org> | 2015-01-01 03:11:53 +0000 |
| commit | 93930b65b8e3888a3adb4d1bdfe74c2bc93a1fe5 (patch) | |
| tree | 0547ce847817406dd047ba3962171a5924d7440c /lld/lib | |
| parent | c58ce4132a05f75aa5ac9794defe38cf2a8aa24f (diff) | |
| download | bcm5719-llvm-93930b65b8e3888a3adb4d1bdfe74c2bc93a1fe5.tar.gz bcm5719-llvm-93930b65b8e3888a3adb4d1bdfe74c2bc93a1fe5.zip | |
ReaderWriter: teach the writer about IMAGE_REL_ARM_ADDR32
This implements the IMAGE_REL_ARM_ADDR32 relocation. There are still a few more
relocation types that need to resolved before lld can even attempt to link a
trivial program for Windows on ARM.
llvm-svn: 225057
Diffstat (limited to 'lld/lib')
| -rw-r--r-- | lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp b/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp index 06d1c030bf4..0df42314e2b 100644 --- a/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp +++ b/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp @@ -547,10 +547,31 @@ static uint32_t getSectionStartAddr(uint64_t targetAddr, llvm_unreachable("Section missing"); } -void AtomChunk::applyRelocationsARM(uint8_t *buffer, - std::map<const Atom *, uint64_t> &atomRva, - std::vector<uint64_t> §ionRva, - uint64_t imageBaseAddress) { +void AtomChunk::applyRelocationsARM(uint8_t *Buffer, + std::map<const Atom *, uint64_t> &AtomRVA, + std::vector<uint64_t> &SectionRVA, + uint64_t ImageBase) { + Buffer = Buffer + _fileOffset; + for (const auto *Layout : _atomLayouts) { + const DefinedAtom *Atom = cast<DefinedAtom>(Layout->_atom); + for (const Reference *R : *Atom) { + if (R->kindNamespace() != Reference::KindNamespace::COFF) + continue; + + const auto AtomOffset = R->offsetInAtom(); + const auto FileOffset = Layout->_fileOffset; + const auto TargetAddr = AtomRVA[R->target()]; + auto RelocSite32 = + reinterpret_cast<ulittle32_t *>(Buffer + FileOffset + AtomOffset); + + switch (R->kindValue()) { + default: llvm_unreachable("unsupported relocation type"); + case llvm::COFF::IMAGE_REL_ARM_ADDR32: + *RelocSite32 = *RelocSite32 + TargetAddr + ImageBase; + break; + } + } + } } void AtomChunk::applyRelocationsX86(uint8_t *buffer, |

