forked from OSchip/llvm-project
[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:
parent
0fbf8bdb08
commit
98d703a663
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue