summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/lib/ReaderWriter/PECOFF/IdataPass.cpp11
-rw-r--r--lld/lib/ReaderWriter/PECOFF/IdataPass.h14
-rw-r--r--lld/test/pecoff/delayimport.test8
3 files changed, 26 insertions, 7 deletions
diff --git a/lld/lib/ReaderWriter/PECOFF/IdataPass.cpp b/lld/lib/ReaderWriter/PECOFF/IdataPass.cpp
index f0e30b40364..45900bb4376 100644
--- a/lld/lib/ReaderWriter/PECOFF/IdataPass.cpp
+++ b/lld/lib/ReaderWriter/PECOFF/IdataPass.cpp
@@ -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
}
diff --git a/lld/lib/ReaderWriter/PECOFF/IdataPass.h b/lld/lib/ReaderWriter/PECOFF/IdataPass.h
index efba5835e1d..70f882b489b 100644
--- a/lld/lib/ReaderWriter/PECOFF/IdataPass.h
+++ b/lld/lib/ReaderWriter/PECOFF/IdataPass.h
@@ -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 {
diff --git a/lld/test/pecoff/delayimport.test b/lld/test/pecoff/delayimport.test
index d122178b914..21cc929a309 100644
--- a/lld/test/pecoff/delayimport.test
+++ b/lld/test/pecoff/delayimport.test
@@ -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)
OpenPOWER on IntegriCloud