summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2014-10-09 17:43:01 +0000
committerRui Ueyama <ruiu@google.com>2014-10-09 17:43:01 +0000
commit98d703a663f6c9d2a8f2c7b51d7e3d85d3fbac0d (patch)
treea859ee3016555a4668dba21f8adbc989b709d9f1
parent0fbf8bdb08b837061e16f70c1f8884b2535f6153 (diff)
downloadbcm5719-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.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