[elf2] Relocate against common symbols.

llvm-svn: 248054
diff --git a/lld/ELF/Symbols.h b/lld/ELF/Symbols.h
index 56c75be..7d18f9d 100644
--- a/lld/ELF/Symbols.h
+++ b/lld/ELF/Symbols.h
@@ -24,6 +24,7 @@
 class InputFile;
 class SymbolBody;
 template <class ELFT> class ObjectFile;
+template <class ELFT> class OutputSection;
 
 // A real symbol object, SymbolBody, is usually accessed indirectly
 // through a Symbol. There's always one Symbol for each symbol name.
@@ -180,6 +181,8 @@
 
   // The maximum alignment we have seen for this symbol.
   uintX_t MaxAlignment;
+
+  OutputSection<ELFT> *OutputSec = nullptr;
 };
 
 // Regular defined symbols read from object file symbol tables.
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index b2d7611..3342da9 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -738,8 +738,11 @@
     case SymbolBody::DefinedAbsoluteKind:
       SymVA = cast<DefinedAbsolute<ELFT>>(Body)->Sym.st_value;
       break;
-    case SymbolBody::DefinedCommonKind:
-      continue;
+    case SymbolBody::DefinedCommonKind: {
+      auto *DC = cast<DefinedCommon<ELFT>>(Body);
+      SymVA = DC->OutputSec->getVA() + DC->OffsetInBSS;
+      break;
+    }
     case SymbolBody::SharedKind:
       if (!relocNeedsGOT(Type))
         continue;
@@ -1063,6 +1066,7 @@
     uintX_t Align = C->MaxAlignment;
     Off = RoundUpToAlignment(Off, Align);
     C->OffsetInBSS = Off;
+    C->OutputSec = BSSSec;
     Off += Sym.st_size;
   }