Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/llvm/llvm-project.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/lld/COFF
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2015-07-02 23:33:50 +0300
committerRui Ueyama <ruiu@google.com>2015-07-02 23:33:50 +0300
commit7a333c66befdc281f4027a34b8380381568a46c9 (patch)
tree6ffe40f107106480cb8df71c3d8c0605673a2a8d /lld/COFF
parent65813edfe2421ae3810f54e65a551464aa6fe0cb (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.cpp13
-rw-r--r--lld/COFF/Chunks.h3
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: