[ELF] Never allocate content to weak symbols as they may be merged away.
authorMichael J. Spencer <bigcheesegs@gmail.com>
Tue, 15 Jan 2013 21:13:02 +0000 (21:13 +0000)
committerMichael J. Spencer <bigcheesegs@gmail.com>
Tue, 15 Jan 2013 21:13:02 +0000 (21:13 +0000)
This is done by creating a new non-weak anonymous symbol and creating
an atom with content for that symbol. This is added after the weak symbol
so that they have the same address.

llvm-svn: 172553

lld/lib/ReaderWriter/ELF/ReaderELF.cpp
lld/test/elf/check.objtxt

index 29d25ca..0f2f31f 100644 (file)
@@ -215,6 +215,22 @@ public:
                                    : (*(si + 1))->st_value - (*si)->st_value;
         }
 
+
+        // Don't allocate content to a weak symbol, as they may be merged away.
+        // Create an anonymous atom to hold the data.
+        ELFDefinedAtom<ELFT> *anonAtom = nullptr;
+        if ((*si)->getBinding() == llvm::ELF::STB_WEAK && contentSize != 0) {
+          // Create a new non-weak ELF symbol.
+          auto sym = new (_readerStorage.Allocate<Elf_Sym>()) Elf_Sym;
+          *sym = **si;
+          sym->setBinding(llvm::ELF::STB_GLOBAL);
+          anonAtom = createDefinedAtomAndAssignRelocations(
+            "", sectionName, sym, i.first,
+            ArrayRef<uint8_t>(
+              (uint8_t *)sectionContents.data() + (*si)->st_value, contentSize));
+          contentSize = 0;
+        }
+
         ArrayRef<uint8_t> symbolData = ArrayRef<uint8_t>(
           (uint8_t *)sectionContents.data() + (*si)->st_value, contentSize);
 
@@ -223,6 +239,8 @@ public:
 
         _definedAtoms._atoms.push_back(newAtom);
         _symbolToAtomMapping.insert(std::make_pair((*si), newAtom));
+        if (anonAtom)
+          _definedAtoms._atoms.push_back(anonAtom);
       }
     }
 
index 6ad87fb..21e219b 100644 (file)
@@ -13,9 +13,9 @@ ELF-i386:                           00, E8, FC, FF, FF, FF, C9, C3 ]
 
 ELF-i386:    - name:              weak_func
 ELF-i386:      scope:             global
-ELF-i386:      content:           [ 55, 89, E5, 83, EC, 18, C7, 04, 24, 0E, 00, 00, 
-ELF-i386:                           00, E8, FC, FF, FF, FF, C9, C3 ]
 ELF-i386:      merge:             as-weak
+ELF-i386:      content:           [ 55, 89, E5, 83, EC, 18, C7, 04, 24, 0E, 00, 00,
+ELF-i386:                           00, E8, FC, FF, FF, FF, C9, C3 ]
 
 ELF-i386:    - name:              hidden_func
 ELF-i386:      scope:             hidden
@@ -65,9 +65,9 @@ ELF-hexagon:                           00, C0, 00, 5A, 1E, C0, 1E, 96 ]
 
 ELF-hexagon:    - name:              weak_func
 ELF-hexagon:      scope:             global
-ELF-hexagon:      content:           [ 00, C0, 9D, A0, 00, 40, 00, 00, 00, C0, 00, 78, 
-ELF-hexagon:                           00, C0, 00, 5A, 1E, C0, 1E, 96 ]
 ELF-hexagon:      merge:             as-weak
+ELF-hexagon:      content:           [ 00, C0, 9D, A0, 00, 40, 00, 00, 00, C0, 00, 78,
+ELF-hexagon:                           00, C0, 00, 5A, 1E, C0, 1E, 96 ]
 
 ELF-hexagon:    - name:              hidden_func
 ELF-hexagon:      scope:             hidden