[lld] r194349 - [ELF] Un-break undef-from-main-dso.test on MSVC 2012.

Rui Ueyama ruiu at google.com
Sat Nov 9 23:48:34 PST 2013


Author: ruiu
Date: Sun Nov 10 01:48:33 2013
New Revision: 194349

URL: http://llvm.org/viewvc/llvm-project?rev=194349&view=rev
Log:
[ELF] Un-break undef-from-main-dso.test on MSVC 2012.

The result of sizeof(SymbolTable<ELFT>::SymbolEntry) in DynamicSymbolTable
<ELFT>::write() was different from the same expression in RelocationTable
<ELFT>::write(), although the same template parameters were passed. They were
40 and 32, respectively. As a result, the same vector was treated as a
vector of 40 byte values in some places and a vector of 32 values in other
places. That caused an weird issue, resulting in collapse of the rela.dyn
section.

I suspect that this is a padding size calculation bug in MSVC 2012, but I
may be wrong. Reordering the fields to eliminate padding seems to fix the
issue.

Modified:
    lld/trunk/lib/ReaderWriter/ELF/SectionChunks.h

Modified: lld/trunk/lib/ReaderWriter/ELF/SectionChunks.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/SectionChunks.h?rev=194349&r1=194348&r2=194349&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/SectionChunks.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/SectionChunks.h Sun Nov 10 01:48:33 2013
@@ -614,12 +614,12 @@ class SymbolTable : public Section<ELFT>
   struct SymbolEntry {
     SymbolEntry(const Atom *a, const Elf_Sym &sym,
                 const lld::AtomLayout *layout)
-        : _atom(a), _symbol(sym), _atomLayout(layout) {}
+        : _atom(a), _atomLayout(layout), _symbol(sym) {}
     SymbolEntry() : _atom(nullptr) {}
 
     const Atom *_atom;
-    Elf_Sym _symbol;
     const lld::AtomLayout *_atomLayout;
+    Elf_Sym _symbol;
   };
 
 public:





More information about the llvm-commits mailing list