diff options
author | Rui Ueyama <ruiu@google.com> | 2015-07-02 23:33:50 +0300 |
---|---|---|
committer | Rui Ueyama <ruiu@google.com> | 2015-07-02 23:33:50 +0300 |
commit | 7a333c66befdc281f4027a34b8380381568a46c9 (patch) | |
tree | 6ffe40f107106480cb8df71c3d8c0605673a2a8d /lld/COFF | |
parent | 65813edfe2421ae3810f54e65a551464aa6fe0cb (diff) |
COFF: Fix locally-imported symbols.
Previously, pointers pointed by locally-imported symbols were broken.
It has only 4 bytes although the correct size is 8 byte. This patch
fixes that bug.
llvm-svn: 241295
Diffstat (limited to 'lld/COFF')
-rw-r--r-- | lld/COFF/Chunks.cpp | 13 | ||||
-rw-r--r-- | lld/COFF/Chunks.h | 3 |
2 files changed, 11 insertions, 5 deletions
diff --git a/lld/COFF/Chunks.cpp b/lld/COFF/Chunks.cpp index 30a1364cfe97..daf2ff681b58 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 40e1b254e039..074a87ae35f4 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: |