Index: lld/ELF/Driver.cpp =================================================================== --- lld/ELF/Driver.cpp +++ lld/ELF/Driver.cpp @@ -47,6 +47,7 @@ #include "llvm/ADT/SetVector.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringSwitch.h" +#include "llvm/ADT/UniqueVector.h" #include "llvm/Config/llvm-config.h" #include "llvm/LTO/LTO.h" #include "llvm/Object/Archive.h" @@ -594,7 +595,10 @@ static std::string getRpath(opt::InputArgList &args) { std::vector v = args::getStrings(args, OPT_rpath); - return llvm::join(v.begin(), v.end(), ":"); + llvm::UniqueVector u; + for (StringRef p : v) + u.insert(p); + return llvm::join(u.begin(), u.end(), ":"); } // Determines what we should do if there are remaining unresolved Index: lld/test/ELF/rpath.test =================================================================== --- /dev/null +++ lld/test/ELF/rpath.test @@ -0,0 +1,12 @@ +# REQUIRES: x86 +// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o +// RUN: ld.lld %t.o -rpath=/path1 -rpath=/path12 -rpath=/path2 -rpath=/path2 -rpath=/path1 -shared -o %t +// RUN: llvm-readobj --dynamic-table %t | FileCheck %s + +// Degenerate case where an -rpath argument already contains a colon: +// RUN: ld.lld %t.o -rpath=/path1 -rpath=/path1:/path2 -rpath=/path2 -shared -o %t +// RUN: llvm-readobj --dynamic-table %t | FileCheck --check-prefix=DEGENERATE %s + +// CHECK: Library runpath: [/path1:/path12:/path2] + +// DEGENERATE: Library runpath: [/path1:/path1:/path2:/path2]