[lld] r187262 - [PATCH] [PECOFF] Fill size field of IMAGE_DATA_DIRECTORY

Rui Ueyama ruiu at google.com
Fri Jul 26 15:33:29 PDT 2013


Author: ruiu
Date: Fri Jul 26 17:33:28 2013
New Revision: 187262

URL: http://llvm.org/viewvc/llvm-project?rev=187262&view=rev
Log:
[PATCH] [PECOFF] Fill size field of IMAGE_DATA_DIRECTORY

Patch by Ron Ofir.

Modified:
    lld/trunk/lib/ReaderWriter/PECOFF/Atoms.h
    lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.h
    lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp

Modified: lld/trunk/lib/ReaderWriter/PECOFF/Atoms.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/Atoms.h?rev=187262&r1=187261&r2=187262&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/Atoms.h (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/Atoms.h Fri Jul 26 17:33:28 2013
@@ -241,8 +241,8 @@ private:
 // COFF header.
 class COFFDataDirectoryAtom : public COFFLinkerInternalAtom {
 public:
-  COFFDataDirectoryAtom(const File &file, uint64_t ordinal)
-      : COFFLinkerInternalAtom(file, std::vector<uint8_t>(8)),
+  COFFDataDirectoryAtom(const File &file, uint64_t ordinal, uint32_t entrySize)
+      : COFFLinkerInternalAtom(file, assembleRawContent(entrySize)),
         _ordinal(ordinal) {}
 
   virtual uint64_t ordinal() const { return _ordinal; }
@@ -250,6 +250,12 @@ public:
   virtual ContentPermissions permissions() const { return permR__; }
 
 private:
+  std::vector<uint8_t> assembleRawContent(uint32_t entrySize) {
+    std::vector<uint8_t> data = std::vector<uint8_t>(8, 0);
+    *(reinterpret_cast<uint32_t *>(&data[4])) = entrySize;
+    return data;
+  }
+
   uint64_t _ordinal;
 };
 

Modified: lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.h?rev=187262&r1=187261&r2=187262&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.h (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.h Fri Jul 26 17:33:28 2013
@@ -281,12 +281,14 @@ private:
   /// will be set by the writer.
   void createDataDirectoryAtoms(Context &ctx) {
     auto *dir = new (_alloc) coff::COFFDataDirectoryAtom(
-        ctx.file, llvm::COFF::DataDirectoryIndex::IMPORT_TABLE);
+        ctx.file, llvm::COFF::DataDirectoryIndex::IMPORT_TABLE,
+        ctx.importDirectories.size() * ctx.importDirectories[0]->size());
     addDir32NBReloc(dir, ctx.importDirectories[0]);
     ctx.file.addAtom(*dir);
 
     auto *iat = new (_alloc) coff::COFFDataDirectoryAtom(
-        ctx.file, llvm::COFF::DataDirectoryIndex::IAT);
+        ctx.file, llvm::COFF::DataDirectoryIndex::IAT,
+        ctx.importAddressTables.size() * ctx.importAddressTables[0]->size());
     addDir32NBReloc(iat, ctx.importAddressTables[0]);
     ctx.file.addAtom(*iat);
   }

Modified: lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp?rev=187262&r1=187261&r2=187262&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp Fri Jul 26 17:33:28 2013
@@ -384,7 +384,7 @@ public:
 
   void setBaseRelocField(uint32_t addr, uint32_t size) {
     auto *atom = new (_alloc) coff::COFFDataDirectoryAtom(
-        _file, llvm::COFF::DataDirectoryIndex::BASE_RELOCATION_TABLE);
+        _file, llvm::COFF::DataDirectoryIndex::BASE_RELOCATION_TABLE, size);
     uint64_t offset = atom->ordinal() * sizeof(llvm::object::data_directory);
     _atomLayouts.push_back(new (_alloc) AtomLayout(atom, offset, offset));
   }





More information about the llvm-commits mailing list