From: Kuba Brecka Date: Tue, 4 Nov 2014 17:35:17 +0000 (+0000) Subject: Use @rpath as LC_ID_DYLIB for ASan dylib on OS X X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=442e646c9a56353c26ff1a6a5cd714e0670df2fe;p=clang Use @rpath as LC_ID_DYLIB for ASan dylib on OS X Change the LC_ID_DYLIB of ASan's dynamic libraries on OS X to be set to "@rpath/libclang_rt.asan_osx_dynamic.dylib" and similarly for iossim. Clang driver then sets the "-rpath" to be the real path to where clang currently has the dylib (because clang uses the relative path to its current executable). This means if you move the compiler or install the binary release, -fsanitize=address will link to the proper library. Reviewed at http://reviews.llvm.org/D6018 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@221279 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index 643eeec0c9..e711e2f418 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -292,16 +292,36 @@ void DarwinClang::AddLinkARCArgs(const ArgList &Args, 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 @@ void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args, 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); } } } diff --git a/lib/Driver/ToolChains.h b/lib/Driver/ToolChains.h index 0ff3958013..532a7cf00b 100644 --- a/lib/Driver/ToolChains.h +++ b/lib/Driver/ToolChains.h @@ -236,7 +236,8 @@ public: llvm::opt::ArgStringList &CmdArgs, StringRef DarwinLibName, bool AlwaysLink = false, - bool IsEmbedded = false) const; + bool IsEmbedded = false, + bool AddRPath = false) const; /// } /// @name ToolChain Implementation diff --git a/test/Driver/darwin-sanitizer-ld.c b/test/Driver/darwin-sanitizer-ld.c index 85cfb73c4a..dcf94dceb6 100644 --- a/test/Driver/darwin-sanitizer-ld.c +++ b/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 \