COFF: Fix base relocations for __imp_ symbols on x86.

Because thunks for dllimported symbols contain absolute addresses on x86,
they need to be relocated at load-time. This bug was a cause of crashes
in DLL initialization routines.

llvm-svn: 242259
This commit is contained in:
Rui Ueyama 2015-07-15 00:25:38 +00:00
parent f8749430f2
commit 33fb2cb11b
3 changed files with 8 additions and 1 deletions

View File

@ -252,6 +252,12 @@ ImportThunkChunk::ImportThunkChunk(Defined *S) : ImpSymbol(S) {
Align = 16;
}
void ImportThunkChunk::getBaserels(std::vector<uint32_t> *Res,
Defined *ImageBase) {
if (!Config->is64())
Res->push_back(getRVA() + 2);
}
void ImportThunkChunk::writeTo(uint8_t *Buf) {
memcpy(Buf + FileOff, ImportThunkData, sizeof(ImportThunkData));
// The first two bytes is a JMP instruction. Fill its operand.

View File

@ -234,6 +234,7 @@ class ImportThunkChunk : public Chunk {
public:
explicit ImportThunkChunk(Defined *ImpSymbol);
size_t getSize() const override { return sizeof(ImportThunkData); }
void getBaserels(std::vector<uint32_t> *Res, Defined *ImageBase) override;
void writeTo(uint8_t *Buf) override;
private:

View File

@ -64,7 +64,7 @@ HEADER-NEXT: ExceptionTableSize: 0x0
HEADER-NEXT: CertificateTableRVA: 0x0
HEADER-NEXT: CertificateTableSize: 0x0
HEADER-NEXT: BaseRelocationTableRVA: 0x4000
HEADER-NEXT: BaseRelocationTableSize: 0xC
HEADER-NEXT: BaseRelocationTableSize: 0x10
HEADER-NEXT: DebugRVA: 0x0
HEADER-NEXT: DebugSize: 0x0
HEADER-NEXT: ArchitectureRVA: 0x0