Index: lld/ELF/Driver.cpp =================================================================== --- lld/ELF/Driver.cpp +++ lld/ELF/Driver.cpp @@ -790,13 +790,18 @@ if (Optional 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 Buffer = readFile(Arg->getValue())) readVersionScript(*Buffer); Index: lld/test/ELF/export-dynamic-symbol.s =================================================================== --- lld/test/ELF/export-dynamic-symbol.s +++ 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