diff --git a/llvm/docs/CommandGuide/llvm-ar.rst b/llvm/docs/CommandGuide/llvm-ar.rst
--- a/llvm/docs/CommandGuide/llvm-ar.rst
+++ b/llvm/docs/CommandGuide/llvm-ar.rst
@@ -274,6 +274,11 @@
  This option allows for MRI scripts to be read through the standard input
  stream. No other options are compatible with this option.
 
+.. option:: --output=
+
+ Specify a directory where archive members should be extracted. By default the
+ current working directory is used.
+
 .. option:: --rsp-quoting=
  This option selects the quoting style ```` for response files, either
  ``posix`` or ``windows``. The default when on Windows is ``windows``, otherwise the
diff --git a/llvm/test/tools/llvm-ar/absolute-paths.test b/llvm/test/tools/llvm-ar/absolute-paths.test
--- a/llvm/test/tools/llvm-ar/absolute-paths.test
+++ b/llvm/test/tools/llvm-ar/absolute-paths.test
@@ -26,3 +26,7 @@
 RUN: llvm-ar x %S/Inputs/absolute-paths.lib
 RUN: llvm-nm a.o | FileCheck %s --check-prefix=CHECK-A
 RUN: llvm-nm b.o | FileCheck %s --check-prefix=CHECK-B
+
+RUN: mkdir dir
+RUN: llvm-ar x %S/Inputs/absolute-paths.lib --output=dir/
+RUN: cmp a.o dir/a.o
diff --git a/llvm/test/tools/llvm-ar/extract.test b/llvm/test/tools/llvm-ar/extract.test
--- a/llvm/test/tools/llvm-ar/extract.test
+++ b/llvm/test/tools/llvm-ar/extract.test
@@ -34,3 +34,18 @@
 # RUN: llvm-ar x %t/archive.a 2>&1 | count 0
 # RUN: diff %t/a.txt %t/extracted/a.txt
 # RUN: diff %t/b.txt %t/extracted/b.txt
+
+## --output specifies the directory to extract archive members.
+# RUN: mkdir %t/extracted/dir
+# RUN: llvm-ar --output=dir x %t/archive.a
+# RUN: diff %t/a.txt %t/extracted/dir/a.txt
+# RUN: diff %t/b.txt %t/extracted/dir/b.txt
+
+## Test --output with an absolute path after the operation.
+# RUN: rm -f %t/extracted/dir/a.txt
+# RUN: llvm-ar xv %t/archive.a a.txt --output=%t/extracted/dir/../dir | FileCheck %s --check-prefix=OUTPUT-A
+# RUN: diff %t/a.txt %t/extracted/dir/a.txt
+# OUTPUT-A: x - {{.*}}extracted{{.*}}a.txt
+
+# RUN: not llvm-ar rc --output=dir %t/archive.a %t/a.txt 2>&1 | FileCheck %s --check-prefix=OUTPUT-ERR
+# OUTPUT-ERR: error: --output is only applicable to the 'x' operation
diff --git a/llvm/tools/llvm-ar/llvm-ar.cpp b/llvm/tools/llvm-ar/llvm-ar.cpp
--- a/llvm/tools/llvm-ar/llvm-ar.cpp
+++ b/llvm/tools/llvm-ar/llvm-ar.cpp
@@ -237,6 +237,9 @@
 // command line.
 static std::string ArchiveName;
 
+// Output directory specified by --output.
+static std::string OutputDir;
+
 static std::vector> ArchiveBuffers;
 static std::vector> Archives;
 
@@ -449,6 +452,8 @@
                "operations");
   if (OriginalDates && Operation != Extract)
     badUsage("the 'o' modifier is only applicable to the 'x' operation");
+  if (!OutputDir.empty() && Operation != Extract)
+    badUsage("--output is only applicable to the 'x' operation");
   if (OnlyUpdate && Operation != ReplaceOrInsert)
     badUsage("the 'u' modifier is only applicable to the 'r' operation");
   if (AddLibrary && Operation != QuickAppend)
@@ -554,7 +559,15 @@
   failIfError(ModeOrErr.takeError());
   sys::fs::perms Mode = ModeOrErr.get();
 
-  llvm::StringRef outputFilePath = sys::path::filename(Name);
+  StringRef outputFilePath;
+  SmallString<128> path;
+  if (OutputDir.empty()) {
+    outputFilePath = sys::path::filename(Name);
+  } else {
+    sys::path::append(path, OutputDir, sys::path::filename(Name));
+    outputFilePath = path.str();
+  }
+
   if (Verbose)
     outs() << "x - " << outputFilePath << '\n';
 
@@ -1216,6 +1229,11 @@
       continue;
     }
 
+    if ((Match = matchFlagWithArg("output", ArgIt, Argv))) {
+      OutputDir = Match;
+      continue;
+    }
+
     if (matchFlagWithArg("plugin", ArgIt, Argv) ||
         matchFlagWithArg("rsp-quoting", ArgIt, Argv))
       continue;