diff options
-rw-r--r-- | lld/ELF/Driver.cpp | 11 | ||||
-rw-r--r-- | lld/test/ELF/export-dynamic-symbol.s | 5 |
2 files changed, 12 insertions, 4 deletions
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index e1bac230b8d..33acded68c8 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -803,13 +803,18 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) { if (Optional<MemoryBufferRef> Buffer = readFile(Arg->getValue())) readDynamicList(*Buffer); - for (auto *Arg : Args.filtered(OPT_export_dynamic_symbol)) { + for (auto *Arg : Args.filtered(OPT_export_dynamic_symbol)) Config->DynamicList.push_back( {Arg->getValue(), /*IsExternCpp*/ false, /*HasWildcard*/ false}); - Config->Undefined.push_back(Arg->getValue()); - } } + // If --export-dynamic-symbol=foo is given and symbol foo is defined in + // an object file in an archive file, that object file should be pulled + // out and linked. (It doesn't have to behave like that from technical + // point of view, but this is needed for compatibility with GNU.) + for (auto *Arg : Args.filtered(OPT_export_dynamic_symbol)) + Config->Undefined.push_back(Arg->getValue()); + for (auto *Arg : Args.filtered(OPT_version_script)) if (Optional<MemoryBufferRef> Buffer = readFile(Arg->getValue())) readVersionScript(*Buffer); diff --git a/lld/test/ELF/export-dynamic-symbol.s b/lld/test/ELF/export-dynamic-symbol.s index 75d045950b2..22536035424 100644 --- a/lld/test/ELF/export-dynamic-symbol.s +++ b/lld/test/ELF/export-dynamic-symbol.s @@ -3,11 +3,14 @@ # RUN: rm -f %t.a # RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %S/Inputs/archive2.s -o %t1.o # RUN: llvm-ar rcs %t.a %t1.o - # RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t2.o + # RUN: ld.lld -shared -o %t.so --export-dynamic-symbol foo %t.a %t2.o +# RUN: llvm-readelf -dyn-symbols %t.so | FileCheck %s +# RUN: ld.lld -shared -o %t.so --export-dynamic --export-dynamic-symbol foo %t.a %t2.o # RUN: llvm-readelf -dyn-symbols %t.so | FileCheck %s + # CHECK: foo .global _start |