r221279 - Use @rpath as LC_ID_DYLIB for ASan dylib on OS X

Aaron Ballman aaron at aaronballman.com
Tue Nov 4 14:58:20 PST 2014


This is failing on Windows:

http://bb.pgr.jp/builders/ninja-clang-i686-msc17-R/builds/11355

~Aaron

On Tue, Nov 4, 2014 at 12:35 PM, Kuba Brecka <kuba.brecka at gmail.com> wrote:
> Author: kuba.brecka
> Date: Tue Nov  4 11:35:17 2014
> New Revision: 221279
>
> URL: http://llvm.org/viewvc/llvm-project?rev=221279&view=rev
> Log:
> 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
>
>
> Modified:
>     cfe/trunk/lib/Driver/ToolChains.cpp
>     cfe/trunk/lib/Driver/ToolChains.h
>     cfe/trunk/test/Driver/darwin-sanitizer-ld.c
>
> Modified: cfe/trunk/lib/Driver/ToolChains.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.cpp?rev=221279&r1=221278&r2=221279&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Driver/ToolChains.cpp (original)
> +++ cfe/trunk/lib/Driver/ToolChains.cpp Tue Nov  4 11:35:17 2014
> @@ -292,16 +292,36 @@ void DarwinClang::AddLinkARCArgs(const A
>
>  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(
>        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);
>          }
>        }
>      }
>
> Modified: cfe/trunk/lib/Driver/ToolChains.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.h?rev=221279&r1=221278&r2=221279&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Driver/ToolChains.h (original)
> +++ cfe/trunk/lib/Driver/ToolChains.h Tue Nov  4 11:35:17 2014
> @@ -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
>
> Modified: cfe/trunk/test/Driver/darwin-sanitizer-ld.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/darwin-sanitizer-ld.c?rev=221279&r1=221278&r2=221279&view=diff
> ==============================================================================
> --- cfe/trunk/test/Driver/darwin-sanitizer-ld.c (original)
> +++ cfe/trunk/test/Driver/darwin-sanitizer-ld.c Tue Nov  4 11:35:17 2014
> @@ -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 \
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list