diff options
Diffstat (limited to 'lld/lib/Driver/Drivers.cpp')
| -rw-r--r-- | lld/lib/Driver/Drivers.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/lld/lib/Driver/Drivers.cpp b/lld/lib/Driver/Drivers.cpp index 466b49ed36c..9bf11d6abb2 100644 --- a/lld/lib/Driver/Drivers.cpp +++ b/lld/lib/Driver/Drivers.cpp @@ -115,6 +115,8 @@ public: std::unique_ptr<llvm::opt::DerivedArgList> newArgs( new llvm::opt::DerivedArgList(*_inputArgs)); + bool isOutputDynamic = false; + if (llvm::opt::Arg *A = _inputArgs->getLastArg(ld::OPT_target)) { newArgs->AddSeparateArg( A, _core.getOption(core::OPT_target) , A->getValue()); @@ -134,6 +136,15 @@ public: newArgs->AddJoinedArg(nullptr, _core.getOption(core::OPT_output), "a.out"); + if (llvm::opt::Arg *A = _inputArgs->getLastArg(ld::OPT_static)) + newArgs->AddJoinedArg(A, _core.getOption(core::OPT_output_type), + newArgs->MakeArgString("static")); + else { + newArgs->AddJoinedArg(nullptr, _core.getOption(core::OPT_output_type), + newArgs->MakeArgString("dynamic")); + isOutputDynamic = true; + } + if (llvm::opt::Arg *A = _inputArgs->getLastArg(ld::OPT_relocatable)) newArgs->AddFlagArg(A, _core.getOption(core::OPT_relocatable)); @@ -170,6 +181,14 @@ public: StringRef libName = (*it)->getValue(); SmallString<128> p; for (const auto &path : _inputSearchPaths) { + if (isOutputDynamic) { + p = path; + llvm::sys::path::append(p, Twine("lib") + libName + ".so"); + if (llvm::sys::fs::exists(p.str())) { + inputPath = newArgs->MakeArgString(p); + break; + } + } p = path; llvm::sys::path::append(p, Twine("lib") + libName + ".a"); if (llvm::sys::fs::exists(p.str())) { |

