From 868fc9279ef57ce4cc69feab5f1284630f16210e Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Thu, 8 Sep 2016 14:50:55 +0000 Subject: [PATCH] Handle globs in global symbol names. Fixes pr28775. llvm-svn: 280947 --- lld/ELF/SymbolTable.cpp | 14 +++++++++++- lld/test/ELF/version-script-glob.s | 45 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 lld/test/ELF/version-script-glob.s diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp index 152881d..d80e512 100644 --- a/lld/ELF/SymbolTable.cpp +++ b/lld/ELF/SymbolTable.cpp @@ -640,9 +640,21 @@ template void SymbolTable::scanVersionScript() { // in the form of { global: foo; bar; local *; }. So, local is default. // Here, we make specified symbols global. if (!Config->VersionScriptGlobals.empty()) { - for (SymbolVersion &Sym : Config->VersionScriptGlobals) + std::vector Globs; + for (SymbolVersion &Sym : Config->VersionScriptGlobals) { + if (hasWildcard(Sym.Name)) { + Globs.push_back(Sym.Name); + continue; + } if (SymbolBody *B = find(Sym.Name)) B->symbol()->VersionId = VER_NDX_GLOBAL; + } + if (Globs.empty()) + return; + Regex Re = compileGlobPatterns(Globs); + std::vector Syms = findAll(Re); + for (SymbolBody *B : Syms) + B->symbol()->VersionId = VER_NDX_GLOBAL; return; } diff --git a/lld/test/ELF/version-script-glob.s b/lld/test/ELF/version-script-glob.s new file mode 100644 index 0000000..330c068 --- /dev/null +++ b/lld/test/ELF/version-script-glob.s @@ -0,0 +1,45 @@ +# REQUIRES: x86 + +# RUN: echo "{ global: foo*; bar*; local: *; };" > %t.script +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o +# RUN: ld.lld -shared --version-script %t.script %t.o -o %t.so +# RUN: llvm-readobj -dyn-symbols %t.so | FileCheck %s + + .globl foo1 +foo1: + + .globl bar1 +bar1: + + .globl zed1 +zed1: + +# CHECK: DynamicSymbols [ +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Local +# CHECK-NEXT: Type: None +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: bar1 +# CHECK-NEXT: Value: 0x1000 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Global +# CHECK-NEXT: Type: None +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: .text +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: foo1 +# CHECK-NEXT: Value: 0x1000 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Global +# CHECK-NEXT: Type: None +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: .text +# CHECK-NEXT: } +# CHECK-NEXT: ] -- 2.7.4