diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2015-08-11 16:30:34 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2015-08-11 16:30:34 +0000 |
| commit | 7c388187c942583ad99a6ae151ab52a1ab6f0963 (patch) | |
| tree | 654dacbb3c87f1174e735c62d72bb26cf21ddc7d | |
| parent | 9aec282de2b0c1ca16e2c24178ef62149f3404c6 (diff) | |
| download | bcm5719-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.cpp | 5 | ||||
| -rw-r--r-- | lld/test/elf2/Inputs/invalid-symtab-sh_info.elf | bin | 0 -> 512 bytes | |||
| -rw-r--r-- | lld/test/elf2/Inputs/local.s | 1 | ||||
| -rw-r--r-- | lld/test/elf2/invalid-elf.test | 4 | ||||
| -rw-r--r-- | lld/test/elf2/local.s | 10 |
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 Binary files differnew file mode 100644 index 00000000000..aa63d582d75 --- /dev/null +++ b/lld/test/elf2/Inputs/invalid-symtab-sh_info.elf 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: |

