Allow use define symbols to override linker defined ones.
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 17 Nov 2016 21:20:16 +0000 (21:20 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 17 Nov 2016 21:20:16 +0000 (21:20 +0000)
I hit an internal linker script that was defining _DYNAMIC instead of
letting the linker do it. It turns out that both bfd and gold allow
that.

This is pretty easy to implement, just make the linker defined symbol
weak. This should have no impact in the case where there is no user
defined symbol: The visibility is hidden, which causes the output to
still be local.

llvm-svn: 287260

lld/ELF/Writer.cpp
lld/test/ELF/duplicate-internal.s [deleted file]
lld/test/ELF/linkerscript/dynamic-sym.s [new file with mode: 0644]

index 9565a31..3b3bd88 100644 (file)
@@ -569,7 +569,9 @@ template <class ELFT>
 static Symbol *addRegular(StringRef Name, InputSectionBase<ELFT> *IS,
                           typename ELFT::uint Value) {
   typename ELFT::Sym LocalHidden = {};
-  LocalHidden.setBindingAndType(STB_LOCAL, STT_NOTYPE);
+  // The linker generated symbols are added as STB_WEAK to allow user defined
+  // ones to override them.
+  LocalHidden.setBindingAndType(STB_WEAK, STT_NOTYPE);
   LocalHidden.setVisibility(STV_HIDDEN);
   LocalHidden.st_value = Value;
   return Symtab<ELFT>::X->addRegular(Name, LocalHidden, IS, nullptr);
diff --git a/lld/test/ELF/duplicate-internal.s b/lld/test/ELF/duplicate-internal.s
deleted file mode 100644 (file)
index b609307..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-# Should print an expected message in case of conflict with an internally generated symbol.
-
-# RUN: llvm-mc -filetype=obj -triple=mips-unknown-linux %s -o %t.o
-# RUN: not ld.lld -shared %t.o -o %t.so 2>&1 | FileCheck %s
-
-# CHECK: duplicate symbol '_gp' in {{.*}} and (internal)
-
-# REQUIRES: mips
-
-  .globl  _gp
-_gp = 0
diff --git a/lld/test/ELF/linkerscript/dynamic-sym.s b/lld/test/ELF/linkerscript/dynamic-sym.s
new file mode 100644 (file)
index 0000000..e3193b1
--- /dev/null
@@ -0,0 +1,17 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
+# RUN: echo "_DYNAMIC = 0x123;" > %t.script
+# RUN: ld.lld -T %t.script %t.o -shared -o %t.so
+# RUN: llvm-readobj -t %t.so | FileCheck %s
+
+# CHECK:      Symbol {
+# CHECK:        Name: _DYNAMIC
+# CHECK-NEXT:   Value: 0x123
+# CHECK-NEXT:   Size: 0
+# CHECK-NEXT:   Binding: Local
+# CHECK-NEXT:   Type: None
+# CHECK-NEXT:   Other [
+# CHECK-NEXT:     STV_HIDDEN
+# CHECK-NEXT:   ]
+# CHECK-NEXT:   Section: Absolute
+# CHECK-NEXT: }