From 1f492893ac015ed6aae8427a6de4f30dd9d2feb8 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Fri, 8 Apr 2016 20:49:31 +0000 Subject: [PATCH] Fix a crash bug in --start-lib. Previously, Lazy symbols were created for undefined symbols even though such symbols cannot be resolved by loading object files. This patch fixes that bug. llvm-svn: 265847 --- lld/ELF/InputFiles.cpp | 7 +++++-- lld/test/ELF/Inputs/start-lib1.s | 3 +++ lld/test/ELF/Inputs/start-lib2.s | 2 ++ lld/test/ELF/start-lib.s | 23 ++++++++++++++++------- 4 files changed, 26 insertions(+), 9 deletions(-) create mode 100644 lld/test/ELF/Inputs/start-lib1.s create mode 100644 lld/test/ELF/Inputs/start-lib2.s diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index 52b6d44..b8681e5 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -594,7 +594,8 @@ template std::vector LazyObjectFile::getElfSymbols() { StringRef StringTable = check(Obj.getStringTableForSymtab(Sec)); std::vector V; for (const Elf_Sym &Sym : Syms.slice(FirstNonLocal)) - V.push_back(check(Sym.getName(StringTable))); + if (Sym.st_shndx != SHN_UNDEF) + V.push_back(check(Sym.getName(StringTable))); return V; } return {}; @@ -608,6 +609,8 @@ std::vector LazyObjectFile::getBitcodeSymbols() { for (const BasicSymbolRef &Sym : Obj->symbols()) { if (BitcodeFile::shouldSkip(Sym)) continue; + if (Sym.getFlags() == BasicSymbolRef::SF_Undefined) + continue; SmallString<64> Name; raw_svector_ostream OS(Name); Sym.printName(OS); @@ -616,7 +619,7 @@ std::vector LazyObjectFile::getBitcodeSymbols() { return V; } -// Returns a vector of globally-visible symbol names. +// Returns a vector of globally-visible defined symbol names. std::vector LazyObjectFile::getSymbols() { if (isBitcode(this->MB)) return getBitcodeSymbols(); diff --git a/lld/test/ELF/Inputs/start-lib1.s b/lld/test/ELF/Inputs/start-lib1.s new file mode 100644 index 0000000..d401b20 --- /dev/null +++ b/lld/test/ELF/Inputs/start-lib1.s @@ -0,0 +1,3 @@ +.globl foo +foo: + call bar diff --git a/lld/test/ELF/Inputs/start-lib2.s b/lld/test/ELF/Inputs/start-lib2.s new file mode 100644 index 0000000..f500936 --- /dev/null +++ b/lld/test/ELF/Inputs/start-lib2.s @@ -0,0 +1,2 @@ +.globl bar +bar: diff --git a/lld/test/ELF/start-lib.s b/lld/test/ELF/start-lib.s index caec1a5..013a2b2 100644 --- a/lld/test/ELF/start-lib.s +++ b/lld/test/ELF/start-lib.s @@ -2,15 +2,24 @@ // RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t1.o // RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux \ -// RUN: %p/Inputs/whole-archive.s -o %t2.o +// RUN: %p/Inputs/start-lib1.s -o %t2.o +// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux \ +// RUN: %p/Inputs/start-lib2.s -o %t3.o + +// RUN: ld.lld -o %t3 %t1.o %t2.o %t3.o +// RUN: llvm-readobj --symbols %t3 | FileCheck --check-prefix=TEST1 %s +// TEST1: Name: bar +// TEST1: Name: foo -// RUN: ld.lld -o %t3 %t1.o %t2.o -// RUN: llvm-readobj --symbols %t3 | FileCheck --check-prefix=ADDED %s -// ADDED: Name: _bar +// RUN: ld.lld -o %t3 %t1.o -u bar --start-lib %t2.o %t3.o +// RUN: llvm-readobj --symbols %t3 | FileCheck --check-prefix=TEST2 %s +// TEST2: Name: bar +// TEST2-NOT: Name: foo -// RUN: ld.lld -o %t3 %t1.o --start-lib %t2.o -// RUN: llvm-readobj --symbols %t3 | FileCheck --check-prefix=LIB %s -// LIB-NOT: Name: _bar +// RUN: ld.lld -o %t3 %t1.o --start-lib %t2.o %t3.o +// RUN: llvm-readobj --symbols %t3 | FileCheck --check-prefix=TEST3 %s +// TEST3-NOT: Name: bar +// TEST3-NOT: Name: foo .globl _start _start: -- 2.7.4