diff options
author | Rui Ueyama <ruiu@google.com> | 2014-11-13 02:58:36 +0000 |
---|---|---|
committer | Rui Ueyama <ruiu@google.com> | 2014-11-13 02:58:36 +0000 |
commit | 904cf593c1a3b372cf7d3ccb425d704faf35c7ab (patch) | |
tree | 68be0898bd755d40e50d0a950ab75699addeae5b | |
parent | 253dd39a9ac5e8abe0f12723c6b4a22109293e7a (diff) | |
download | bcm5719-llvm-904cf593c1a3b372cf7d3ccb425d704faf35c7ab.tar.gz bcm5719-llvm-904cf593c1a3b372cf7d3ccb425d704faf35c7ab.zip |
[PECOFF] Fix delay-import address table contents.
Each entry in the delay-import address table had a wrong alignment
requirement if 32 bit. As a result it got wrong delay-import table.
Because llvm-readobj doesn't print out that field, we don't have a
test for that. I'll submit a test that would catch this bug after
improving llvm-readobj.
llvm-svn: 221853
-rw-r--r-- | lld/lib/ReaderWriter/PECOFF/IdataPass.cpp | 5 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/PECOFF/IdataPass.h | 7 | ||||
-rw-r--r-- | lld/test/pecoff/delayimport.test | 2 |
3 files changed, 10 insertions, 4 deletions
diff --git a/lld/lib/ReaderWriter/PECOFF/IdataPass.cpp b/lld/lib/ReaderWriter/PECOFF/IdataPass.cpp index 925a262416f..1357168d9a1 100644 --- a/lld/lib/ReaderWriter/PECOFF/IdataPass.cpp +++ b/lld/lib/ReaderWriter/PECOFF/IdataPass.cpp @@ -185,7 +185,10 @@ void DelayImportDirectoryAtom::addRelocations( for (int i = 0, e = sharedAtoms.size(); i < e; ++i) { const DefinedAtom *loader = new (_alloc) DelayLoaderAtom( context, addrTable[i], this, delayLoadHelper); - addDir64Reloc(addrTable[i], loader, context.ctx.getMachineType(), 0); + if (context.ctx.is64Bit()) + addDir64Reloc(addrTable[i], loader, context.ctx.getMachineType(), 0); + else + addDir32NBReloc(addrTable[i], loader, context.ctx.getMachineType(), 0); } } diff --git a/lld/lib/ReaderWriter/PECOFF/IdataPass.h b/lld/lib/ReaderWriter/PECOFF/IdataPass.h index 143634131f2..9db82160339 100644 --- a/lld/lib/ReaderWriter/PECOFF/IdataPass.h +++ b/lld/lib/ReaderWriter/PECOFF/IdataPass.h @@ -162,15 +162,18 @@ private: class DelayImportAddressAtom : public IdataAtom { public: explicit DelayImportAddressAtom(IdataContext &context) - : IdataAtom(context, createContent(context.ctx)) {} + : IdataAtom(context, createContent(context.ctx)), + _align(Alignment(context.ctx.is64Bit() ? 3 : 2)) {} StringRef customSectionName() const override { return ".data"; } ContentPermissions permissions() const override { return permRW_; } - Alignment alignment() const override { return Alignment(3); } + Alignment alignment() const override { return _align; } private: std::vector<uint8_t> createContent(const PECOFFLinkingContext &ctx) const { return std::vector<uint8_t>(ctx.is64Bit() ? 8 : 4, 0); } + + Alignment _align; }; // DelayLoaderAtom contains a wrapper function for __delayLoadHelper2. diff --git a/lld/test/pecoff/delayimport.test b/lld/test/pecoff/delayimport.test index 946e32ae909..eb7a31df13c 100644 --- a/lld/test/pecoff/delayimport.test +++ b/lld/test/pecoff/delayimport.test @@ -13,7 +13,7 @@ X86: DelayImport { X86-NEXT: Name: vars.dll X86-NEXT: Attributes: 0x1 X86-NEXT: ModuleHandle: 0x1000 -X86-NEXT: ImportAddressTable: 0x1008 +X86-NEXT: ImportAddressTable: 0x1004 X86-NEXT: ImportNameTable: 0x2000 X86-NEXT: BoundDelayImportTable: 0x0 X86-NEXT: UnloadDelayImportTable: 0x0 |