diff options
-rw-r--r-- | lld/COFF/Chunks.cpp | 13 | ||||
-rw-r--r-- | lld/COFF/Chunks.h | 3 | ||||
-rw-r--r-- | lld/test/COFF/locally-imported.test | 2 |
3 files changed, 12 insertions, 6 deletions
diff --git a/lld/COFF/Chunks.cpp b/lld/COFF/Chunks.cpp index 30a1364cfe9..daf2ff681b5 100644 --- a/lld/COFF/Chunks.cpp +++ b/lld/COFF/Chunks.cpp @@ -221,6 +221,15 @@ void ImportThunkChunk::writeTo(uint8_t *Buf) { write32le(Buf + FileOff + 2, Operand); } +void LocalImportChunk::getBaserels(std::vector<uint32_t> *Res, + Defined *ImageBase) { + Res->push_back(getRVA() + Config->ImageBase); +} + +void LocalImportChunk::writeTo(uint8_t *Buf) { + write64le(Buf + FileOff, Sym->getRVA() + Config->ImageBase); +} + // Windows-specific. // This class represents a block in .reloc section. BaserelChunk::BaserelChunk(uint32_t Page, uint32_t *Begin, uint32_t *End) { @@ -237,10 +246,6 @@ BaserelChunk::BaserelChunk(uint32_t Page, uint32_t *Begin, uint32_t *End) { } } -void LocalImportChunk::writeTo(uint8_t *Buf) { - write32le(Buf + FileOff, Sym->getRVA()); -} - void BaserelChunk::writeTo(uint8_t *Buf) { memcpy(Buf + FileOff, Data.data(), Data.size()); } diff --git a/lld/COFF/Chunks.h b/lld/COFF/Chunks.h index 40e1b254e03..074a87ae35f 100644 --- a/lld/COFF/Chunks.h +++ b/lld/COFF/Chunks.h @@ -243,7 +243,8 @@ private: class LocalImportChunk : public Chunk { public: explicit LocalImportChunk(Defined *S) : Sym(S) {} - size_t getSize() const override { return 4; } + size_t getSize() const override { return 8; } + void getBaserels(std::vector<uint32_t> *Res, Defined *ImageBase) override; void writeTo(uint8_t *Buf) override; private: diff --git a/lld/test/COFF/locally-imported.test b/lld/test/COFF/locally-imported.test index 523cd14a52d..7f985536e7a 100644 --- a/lld/test/COFF/locally-imported.test +++ b/lld/test/COFF/locally-imported.test @@ -6,7 +6,7 @@ # CHECK-NEXT: 1000 00200000 # CHECK: Contents of section .rdata: -# CHECK-NEXT: 2000 04100000 +# CHECK-NEXT: 2000 04100040 01000000 --- header: |