Index: projects/compiler-rt/lib/asan/CMakeLists.txt =================================================================== --- projects/compiler-rt/lib/asan/CMakeLists.txt +++ projects/compiler-rt/lib/asan/CMakeLists.txt @@ -1,12 +1,5 @@ # Build for the AddressSanitizer runtime support library. -if(APPLE) -# Don't set rpath for the ASan libraries. Developers are encouraged to ship -# their binaries together with the corresponding ASan runtime libraries, -# so they'll anyway need to fix the rpath and the install name. -set(CMAKE_BUILD_WITH_INSTALL_RPATH OFF) -endif() - set(ASAN_SOURCES asan_allocator2.cc asan_activation.cc Index: projects/compiler-rt/test/asan/TestCases/Darwin/interface_symbols_darwin.c =================================================================== --- projects/compiler-rt/test/asan/TestCases/Darwin/interface_symbols_darwin.c +++ projects/compiler-rt/test/asan/TestCases/Darwin/interface_symbols_darwin.c @@ -5,9 +5,7 @@ // RUN: %clang_asan -dead_strip -O2 %s -o %t.exe // RUN: rm -f %t.symbols %t.interface -// RUN: nm -g `otool -L %t.exe | grep "asan_osx_dynamic.dylib" | \ -// RUN: tr -d '\011' | \ -// RUN: sed "s/.dylib.*/.dylib/"` \ +// RUN: nm -g `%clang_asan %s -fsanitize=address -### 2>&1 | grep "libclang_rt.asan_osx_dynamic.dylib" | sed -e 's/.*"\(.*libclang_rt.asan_osx_dynamic.dylib\)".*/\1/'` \ // RUN: | grep " T " | sed "s/.* T //" \ // RUN: | grep "__asan_" | sed "s/___asan_/__asan_/" \ // RUN: | sed -E "s/__asan_init_v[0-9]+/__asan_init/" \ Index: tools/clang/lib/Driver/ToolChains.h =================================================================== --- tools/clang/lib/Driver/ToolChains.h +++ tools/clang/lib/Driver/ToolChains.h @@ -236,7 +236,8 @@ llvm::opt::ArgStringList &CmdArgs, StringRef DarwinLibName, bool AlwaysLink = false, - bool IsEmbedded = false) const; + bool IsEmbedded = false, + bool AddRPath = false) const; /// } /// @name ToolChain Implementation Index: tools/clang/lib/Driver/ToolChains.cpp =================================================================== --- tools/clang/lib/Driver/ToolChains.cpp +++ tools/clang/lib/Driver/ToolChains.cpp @@ -292,16 +292,36 @@ void MachO::AddLinkRuntimeLib(const ArgList &Args, ArgStringList &CmdArgs, StringRef DarwinLibName, bool AlwaysLink, - bool IsEmbedded) const { - SmallString<128> P(getDriver().ResourceDir); - llvm::sys::path::append(P, "lib", IsEmbedded ? "macho_embedded" : "darwin", - DarwinLibName); + bool IsEmbedded, bool AddRPath) const { + SmallString<128> Dir(getDriver().ResourceDir); + llvm::sys::path::append(Dir, "lib", IsEmbedded ? "macho_embedded" : "darwin"); + + SmallString<128> P(Dir); + llvm::sys::path::append(P, DarwinLibName); // For now, allow missing resource libraries to support developers who may // not have compiler-rt checked out or integrated into their build (unless // we explicitly force linking with this library). if (AlwaysLink || llvm::sys::fs::exists(P.str())) CmdArgs.push_back(Args.MakeArgString(P.str())); + + // Adding the rpaths might negatively interact when other rpaths are involved, + // so we should make sure we add the rpaths last, after all user-specified + // rpaths. This is currently true from this place, but we need to be + // careful if this function is ever called before user's rpaths are emitted. + if (AddRPath) { + assert(DarwinLibName.endswith(".dylib") && "must be a dynamic library"); + + // Add @executable_path to rpath to support having the dylib copied with + // the executable. + CmdArgs.push_back("-rpath"); + CmdArgs.push_back("@executable_path"); + + // Add the path to the resource dir to rpath to support using the dylib + // from the default location without copying. + CmdArgs.push_back("-rpath"); + CmdArgs.push_back(Args.MakeArgString(Dir.str())); + } } void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args, @@ -379,12 +399,14 @@ if (isTargetMacOS()) { AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.asan_osx_dynamic.dylib", - true); + /*AlwaysLink*/ true, /*IsEmbedded*/ false, + /*AddRPath*/ true); } else { if (isTargetIOSSimulator()) { AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.asan_iossim_dynamic.dylib", - true); + /*AlwaysLink*/ true, /*IsEmbedded*/ false, + /*AddRPath*/ true); } } } Index: tools/clang/test/Driver/darwin-sanitizer-ld.c =================================================================== --- tools/clang/test/Driver/darwin-sanitizer-ld.c +++ tools/clang/test/Driver/darwin-sanitizer-ld.c @@ -6,7 +6,9 @@ // CHECK-ASAN: "{{.*}}ld{{(.exe)?}}" // CHECK-ASAN: stdc++ -// CHECK-ASAN: libclang_rt.asan_osx_dynamic.dylib" +// CHECK-ASAN: /lib/darwin/libclang_rt.asan_osx_dynamic.dylib" +// CHECK-ASAN: "-rpath" "@executable_path" +// CHECK-ASAN: "-rpath" "{{.*}}/lib/darwin" // RUN: %clang -no-canonical-prefixes -### -target x86_64-darwin \ // RUN: -fsanitize=address -mios-simulator-version-min=7.0 %s -o %t.o 2>&1 \ @@ -14,7 +16,9 @@ // CHECK-ASAN-IOSSIM: "{{.*}}ld{{(.exe)?}}" // CHECK-ASAN-IOSSIM: lc++ -// CHECK-ASAN-IOSSIM: libclang_rt.asan_iossim_dynamic.dylib" +// CHECK-ASAN-IOSSIM: /lib/darwin/libclang_rt.asan_iossim_dynamic.dylib" +// CHECK-ASAN-IOSSIM: "-rpath" "@executable_path" +// CHECK-ASAN-IOSSIM: "-rpath" "{{.*}}/lib/darwin" // RUN: %clang -no-canonical-prefixes -### -target x86_64-darwin \ // RUN: -fPIC -shared -fsanitize=address %s -o %t.so 2>&1 \ @@ -22,7 +26,9 @@ // CHECK-DYN-ASAN: "{{.*}}ld{{(.exe)?}}" // CHECK-DYN-ASAN: "-dylib" -// CHECK-DYN-ASAN: libclang_rt.asan_osx_dynamic.dylib +// CHECK-DYN-ASAN: /lib/darwin/libclang_rt.asan_osx_dynamic.dylib" +// CHECK-DYN-ASAN: "-rpath" "@executable_path" +// CHECK-DYN-ASAN: "-rpath" "{{.*}}/lib/darwin" // RUN: %clang -no-canonical-prefixes -### -target x86_64-darwin \ // RUN: -fsanitize=undefined %s -o %t.o 2>&1 \