diff options
| author | Rui Ueyama <ruiu@google.com> | 2014-10-09 17:43:01 +0000 |
|---|---|---|
| committer | Rui Ueyama <ruiu@google.com> | 2014-10-09 17:43:01 +0000 |
| commit | 98d703a663f6c9d2a8f2c7b51d7e3d85d3fbac0d (patch) | |
| tree | a859ee3016555a4668dba21f8adbc989b709d9f1 | |
| parent | 0fbf8bdb08b837061e16f70c1f8884b2535f6153 (diff) | |
| download | bcm5719-llvm-98d703a663f6c9d2a8f2c7b51d7e3d85d3fbac0d.tar.gz bcm5719-llvm-98d703a663f6c9d2a8f2c7b51d7e3d85d3fbac0d.zip | |
[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
| -rw-r--r-- | lld/lib/ReaderWriter/PECOFF/IdataPass.cpp | 11 | ||||
| -rw-r--r-- | lld/lib/ReaderWriter/PECOFF/IdataPass.h | 14 | ||||
| -rw-r--r-- | lld/test/pecoff/delayimport.test | 8 |
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) |

