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/docs/ReleaseNotes.rst =================================================================== --- lld/docs/ReleaseNotes.rst +++ lld/docs/ReleaseNotes.rst @@ -31,6 +31,9 @@ * ``--no-fortran-common`` (pre 12.0.0 behavior) is now the default. * ``FORCE_LLD_DIAGNOSTICS_CRASH`` environment variable is now available to force LLD to crash. (`D128195 `_) +* Duplicate ``-rpath`` arguments with an identical path are ignored now, matching GNU ld and gold + behavior. + (`D129142 `_) Breaking changes ---------------- Index: lld/test/ELF/duplicated-rpath.test =================================================================== --- /dev/null +++ lld/test/ELF/duplicated-rpath.test @@ -0,0 +1,12 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o + +## Duplicated /path1 and /path2 shall only appear once each: +# 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 +# CHECK: Library runpath: [/path1:/path12:/path2] + +## 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 +# DEGENERATE: Library runpath: [/path1:/path1:/path2:/path2]