[PECOFF] Emit ModuleHandle field in delay-import table.

Previously the field was not set. The field should be pointing to
a placeholder where the DLL delay-loader writes the base address
of a DLL.

llvm-svn: 219415
This commit is contained in:
Rui Ueyama 2014-10-09 17:43:01 +00:00
parent 0fbf8bdb08
commit 98d703a663
3 changed files with 26 additions and 7 deletions

View File

@ -135,6 +135,11 @@ std::vector<uint8_t> DelayImportDirectoryAtom::createContent() {
void DelayImportDirectoryAtom::addRelocations(
IdataContext &context, StringRef loadName,
const std::vector<COFFSharedLibraryAtom *> &sharedAtoms) {
// "ModuleHandle" field
auto *hmodule = new (_alloc) DelayImportHModuleAtom(context);
addDir32NBReloc(this, hmodule, context.ctx.getMachineType(),
offsetof(delay_import_directory_table_entry, ModuleHandle));
// "NameTable" field
std::vector<ImportTableEntryAtom *> nameTable =
createImportTableAtoms(context, sharedAtoms, true, ".didat", _alloc);
@ -143,11 +148,11 @@ void DelayImportDirectoryAtom::addRelocations(
offsetof(delay_import_directory_table_entry, DelayImportNameTable));
// "Name" field
auto *atom = new (_alloc)
auto *name = new (_alloc)
COFFStringAtom(context.dummyFile, context.dummyFile.getNextOrdinal(),
".didat", loadName);
context.file.addAtom(*atom);
addDir32NBReloc(this, atom, context.ctx.getMachineType(),
context.file.addAtom(*name);
addDir32NBReloc(this, name, context.ctx.getMachineType(),
offsetof(delay_import_directory_table_entry, Name));
// TODO: emit other fields
}

View File

@ -161,6 +161,20 @@ private:
}
};
class DelayImportHModuleAtom : public IdataAtom {
public:
explicit DelayImportHModuleAtom(IdataContext &context)
: IdataAtom(context, createContent(context.ctx)) {}
StringRef customSectionName() const override { return ".data"; }
ContentPermissions permissions() const override { return permRW_; }
Alignment alignment() const override { return Alignment(3); }
private:
std::vector<uint8_t> createContent(const PECOFFLinkingContext &ctx) const {
return std::vector<uint8_t>(ctx.is64Bit() ? 8 : 4, 0);
}
};
} // namespace idata
class IdataPass : public lld::Pass {

View File

@ -12,9 +12,9 @@
X86: DelayImport {
X86-NEXT: Name: vars.dll
X86-NEXT: Attributes: 0x1
X86-NEXT: ModuleHandle: 0x0
X86-NEXT: ModuleHandle: 0x1000
X86-NEXT: ImportAddressTable: 0x0
X86-NEXT: ImportNameTable: 0x1000
X86-NEXT: ImportNameTable: 0x2000
X86-NEXT: BoundDelayImportTable: 0x0
X86-NEXT: UnloadDelayImportTable: 0x0
X86-NEXT: Symbol: _name_with_underscore (0)
@ -25,9 +25,9 @@ X86-NEXT: }
X64: DelayImport {
X64-NEXT: Name: vars64.dll
X64-NEXT: Attributes: 0x1
X64-NEXT: ModuleHandle: 0x0
X64-NEXT: ModuleHandle: 0x1000
X64-NEXT: ImportAddressTable: 0x0
X64-NEXT: ImportNameTable: 0x1000
X64-NEXT: ImportNameTable: 0x2000
X64-NEXT: BoundDelayImportTable: 0x0
X64-NEXT: UnloadDelayImportTable: 0x0
X64-NEXT: Symbol: _name_with_underscore (0)