Index: llvm/lib/Support/raw_ostream.cpp =================================================================== --- llvm/lib/Support/raw_ostream.cpp +++ llvm/lib/Support/raw_ostream.cpp @@ -982,17 +982,30 @@ void buffer_unique_ostream::anchor() {} -Error llvm::writeToOutput(StringRef OutputFileName, +Error llvm::writeToOutput(StringRef OutputCandidateFileName, std::function Write) { - if (OutputFileName == "-") + if (OutputCandidateFileName == "-") return Write(outs()); - if (OutputFileName == "/dev/null") { + if (OutputCandidateFileName == "/dev/null") { raw_null_ostream Out; return Write(Out); } unsigned Mode = sys::fs::all_read | sys::fs::all_write | sys::fs::all_exe; + + llvm::SmallString<128> RealPathOfSymlink; + if (sys::fs::is_symlink_file(OutputCandidateFileName)) { + std::error_code EC = + sys::fs::real_path(OutputCandidateFileName, RealPathOfSymlink); + if (EC) + return errorCodeToError(EC); + } + + Twine OutputFileName = RealPathOfSymlink.str().empty() + ? OutputCandidateFileName + : Twine(RealPathOfSymlink); + Expected Temp = sys::fs::TempFile::create(OutputFileName + ".temp-stream-%%%%%%", Mode); if (!Temp) Index: llvm/test/tools/llvm-objcopy/keep-dso-symlink.test =================================================================== --- /dev/null +++ llvm/test/tools/llvm-objcopy/keep-dso-symlink.test @@ -0,0 +1,8 @@ +# REQUIRES: shell +# RUN: touch empty.c +# RUN: clang empty.c -shared -o empty.so.1 +# RUN: ln -sf empty.so.1 empty.so +# RUN: llvm-strip --strip-unneeded empty.so +# RUN: [ -L empty.so ] && echo "Still symlink" | FileCheck %s + +; CHECK: Still symlink