diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2017-04-11 22:37:54 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2017-04-11 22:37:54 +0000 |
commit | 6c973d647f20483bfd1c1e9f92a0cde5cba816f8 (patch) | |
tree | ab6b9c9320a15163db5ea070d3ffb6cbad52ae58 | |
parent | 304ef22e6eac477726e7d35693d2b1f56238477d (diff) | |
download | bcm5719-llvm-6c973d647f20483bfd1c1e9f92a0cde5cba816f8.tar.gz bcm5719-llvm-6c973d647f20483bfd1c1e9f92a0cde5cba816f8.zip |
[lld] --export-dynamic overrides --dynamic-list.
Fixes PR32573.
--export-dynamic exports everything, even in the presence of a --dynamic-list,
or --export-dynamic-symbol.
llvm-svn: 300002
-rw-r--r-- | lld/ELF/Driver.cpp | 3 | ||||
-rw-r--r-- | lld/test/ELF/dynamic-list.s | 59 |
2 files changed, 62 insertions, 0 deletions
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index 9f66360e6e2..8e7ada6ec10 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -713,6 +713,9 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) { Config->DefaultSymbolVersion = VER_NDX_LOCAL; } + if (getArg(Args, OPT_export_dynamic, OPT_no_export_dynamic, false)) + Config->DefaultSymbolVersion = VER_NDX_GLOBAL; + if (auto *Arg = Args.getLastArg(OPT_version_script)) if (Optional<MemoryBufferRef> Buffer = readFile(Arg->getValue())) readVersionScript(*Buffer); diff --git a/lld/test/ELF/dynamic-list.s b/lld/test/ELF/dynamic-list.s index 80e480b9e3d..7cd587380e5 100644 --- a/lld/test/ELF/dynamic-list.s +++ b/lld/test/ELF/dynamic-list.s @@ -95,6 +95,65 @@ # CHECK2-NEXT: } # CHECK2-NEXT: ] + +## --export-dynamic overrides --dynamic-list, i.e. --export-dynamic with an +## incomplete dynamic-list still exports everything. +# RUN: echo "{ foo2; };" > %t.list +# RUN: ld.lld --dynamic-list %t.list --export-dynamic %t %t2.so -o %t.exe +# RUN: llvm-readobj -dyn-symbols %t.exe | FileCheck -check-prefix=CHECK3 %s + +## The same with --export-dynamic-symbol. +# RUN: ld.lld --export-dynamic-symbol=foo2 --export-dynamic %t %t2.so -o %t.exe +# RUN: llvm-readobj -dyn-symbols %t.exe | FileCheck -check-prefix=CHECK3 %s + +# CHECK3: DynamicSymbols [ +# CHECK3-NEXT: Symbol { +# CHECK3-NEXT: Name: @ +# CHECK3-NEXT: Value: 0x0 +# CHECK3-NEXT: Size: 0 +# CHECK3-NEXT: Binding: Local +# CHECK3-NEXT: Type: None +# CHECK3-NEXT: Other: 0 +# CHECK3-NEXT: Section: Undefined +# CHECK3-NEXT: } +# CHECK3-NEXT: Symbol { +# CHECK3-NEXT: Name: _start@ +# CHECK3-NEXT: Value: 0x201003 +# CHECK3-NEXT: Size: 0 +# CHECK3-NEXT: Binding: Global (0x1) +# CHECK3-NEXT: Type: None (0x0) +# CHECK3-NEXT: Other: 0 +# CHECK3-NEXT: Section: .text (0x4) +# CHECK3-NEXT: } +# CHECK3-NEXT: Symbol { +# CHECK3-NEXT: Name: foo1@ +# CHECK3-NEXT: Value: 0x201000 +# CHECK3-NEXT: Size: 0 +# CHECK3-NEXT: Binding: Global (0x1) +# CHECK3-NEXT: Type: None (0x0) +# CHECK3-NEXT: Other: 0 +# CHECK3-NEXT: Section: .text (0x4) +# CHECK3-NEXT: } +# CHECK3-NEXT: Symbol { +# CHECK3-NEXT: Name: foo2@ +# CHECK3-NEXT: Value: 0x201001 +# CHECK3-NEXT: Size: 0 +# CHECK3-NEXT: Binding: Global (0x1) +# CHECK3-NEXT: Type: None (0x0) +# CHECK3-NEXT: Other: 0 +# CHECK3-NEXT: Section: .text (0x4) +# CHECK3-NEXT: } +# CHECK3-NEXT: Symbol { +# CHECK3-NEXT: Name: foo31@ +# CHECK3-NEXT: Value: 0x201002 +# CHECK3-NEXT: Size: 0 +# CHECK3-NEXT: Binding: Global (0x1) +# CHECK3-NEXT: Type: None (0x0) +# CHECK3-NEXT: Other: 0 +# CHECK3-NEXT: Section: .text (0x4) +# CHECK3-NEXT: } +# CHECK3-NEXT: ] + .globl foo1 foo1: ret |