summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIgor Kudrin <ikudrin.dev@gmail.com>2015-11-19 19:08:45 +0000
committerIgor Kudrin <ikudrin.dev@gmail.com>2015-11-19 19:08:45 +0000
commit4bc5ad4c37483fc250e936189b90fc6682df1b35 (patch)
treedb8c4c4ff9cfbd940d6b49ae913a0018338b892c
parentc12c2790e1c3c5ebf9029f273aea8b320dabf852 (diff)
downloadbcm5719-llvm-4bc5ad4c37483fc250e936189b90fc6682df1b35.tar.gz
bcm5719-llvm-4bc5ad4c37483fc250e936189b90fc6682df1b35.zip
[ELF] Prevent SEGFAULT in case of conflict with an internally defined symbol.
Differential Revision: http://reviews.llvm.org/D14832 llvm-svn: 253588
-rw-r--r--lld/ELF/SymbolTable.cpp3
-rw-r--r--lld/test/ELF/duplicate-internal.s11
2 files changed, 13 insertions, 1 deletions
diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp
index f47035be9cc..6e4f55ac832 100644
--- a/lld/ELF/SymbolTable.cpp
+++ b/lld/ELF/SymbolTable.cpp
@@ -139,7 +139,8 @@ void SymbolTable<ELFT>::reportConflict(const Twine &Message,
}
std::string Msg = (Message + ": " + Old.getName() + " in " +
- OldFile->getName() + " and " + NewFile->getName())
+ (OldFile ? OldFile->getName() : "(internal)") + " and " +
+ (NewFile ? NewFile->getName() : "(internal)"))
.str();
if (Warning)
warning(Msg);
diff --git a/lld/test/ELF/duplicate-internal.s b/lld/test/ELF/duplicate-internal.s
new file mode 100644
index 00000000000..2395a6cae0d
--- /dev/null
+++ b/lld/test/ELF/duplicate-internal.s
@@ -0,0 +1,11 @@
+# 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 (internal) and {{.*}}
+
+# REQUIRES: mips
+
+ .globl _gp
+_gp = 0
OpenPOWER on IntegriCloud