summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2015-08-11 16:30:34 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2015-08-11 16:30:34 +0000
commit7c388187c942583ad99a6ae151ab52a1ab6f0963 (patch)
tree654dacbb3c87f1174e735c62d72bb26cf21ddc7d
parent9aec282de2b0c1ca16e2c24178ef62149f3404c6 (diff)
downloadbcm5719-llvm-7c388187c942583ad99a6ae151ab52a1ab6f0963.tar.gz
bcm5719-llvm-7c388187c942583ad99a6ae151ab52a1ab6f0963.zip
Don't report a conflict between two local symbols.
llvm-svn: 244624
-rw-r--r--lld/ELF/InputFiles.cpp5
-rw-r--r--lld/test/elf2/Inputs/invalid-symtab-sh_info.elfbin0 -> 512 bytes
-rw-r--r--lld/test/elf2/Inputs/local.s1
-rw-r--r--lld/test/elf2/invalid-elf.test4
-rw-r--r--lld/test/elf2/local.s10
5 files changed, 19 insertions, 1 deletions
diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp
index ef4333ff9d8..9dcd2faede8 100644
--- a/lld/ELF/InputFiles.cpp
+++ b/lld/ELF/InputFiles.cpp
@@ -59,8 +59,11 @@ template <class ELFT> void elf2::ObjectFile<ELFT>::initializeSymbols() {
StringRef StringTable = *StringTableOrErr;
Elf_Sym_Range Syms = ELFObj->symbols(Symtab);
- Syms = Elf_Sym_Range(Syms.begin() + 1, Syms.end());
auto NumSymbols = std::distance(Syms.begin(), Syms.end());
+ uint32_t FirstNonLocal = Symtab->sh_info;
+ if (FirstNonLocal > NumSymbols)
+ error("Invalid sh_info in symbol table");
+ Syms = llvm::make_range(Syms.begin() + FirstNonLocal, Syms.end());
SymbolBodies.reserve(NumSymbols);
for (const Elf_Sym &Sym : Syms)
SymbolBodies.push_back(createSymbolBody(StringTable, &Sym));
diff --git a/lld/test/elf2/Inputs/invalid-symtab-sh_info.elf b/lld/test/elf2/Inputs/invalid-symtab-sh_info.elf
new file mode 100644
index 00000000000..aa63d582d75
--- /dev/null
+++ b/lld/test/elf2/Inputs/invalid-symtab-sh_info.elf
Binary files differ
diff --git a/lld/test/elf2/Inputs/local.s b/lld/test/elf2/Inputs/local.s
new file mode 100644
index 00000000000..a5c4ffc9952
--- /dev/null
+++ b/lld/test/elf2/Inputs/local.s
@@ -0,0 +1 @@
+local:
diff --git a/lld/test/elf2/invalid-elf.test b/lld/test/elf2/invalid-elf.test
index 11e76375d98..95fd67164d5 100644
--- a/lld/test/elf2/invalid-elf.test
+++ b/lld/test/elf2/invalid-elf.test
@@ -5,3 +5,7 @@ INVALID-DATA-ENC: Invalid data encoding
RUN: not lld -flavor gnu2 %p/Inputs/invalid-file-class.elf -o %t2 2>&1 | \
RUN: FileCheck --check-prefix=INVALID-FILE-CLASS %s
INVALID-FILE-CLASS: Invalid file class
+
+RUN: not lld -flavor gnu2 %p/Inputs/invalid-symtab-sh_info.elf -o %t2 2>&1 | \
+RUN: FileCheck --check-prefix=INVALID-SYMTAB-SHINFO %s
+INVALID-SYMTAB-SHINFO: Invalid sh_info in symbol table
diff --git a/lld/test/elf2/local.s b/lld/test/elf2/local.s
new file mode 100644
index 00000000000..295ff614547
--- /dev/null
+++ b/lld/test/elf2/local.s
@@ -0,0 +1,10 @@
+// RUN: llvm-mc -filetype=obj -triple=i686-unknown-linux %s -o %t
+// RUN: llvm-mc -filetype=obj -triple=i686-unknown-linux %p/Inputs/local.s -o %t2
+// RUN: lld -flavor gnu2 %t %t2 -o %t3
+// REQUIRES: x86
+
+.globl _start
+_start:
+ nop
+
+local:
OpenPOWER on IntegriCloud