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:
parent
f8749430f2
commit
33fb2cb11b
|
@ -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.
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue