See the attachment.
For Darwin executables we do the same thing as for Linux (see addASanRTLinux)
For Darwin shared libraries we need to explicitly mark the interface
functions inserted by ASan as dynamic_lookup, otherwise we'll get a
linker error.
Another solution is to pass "--undefined dynamic_lookup" to the
linker, but this won't allow the users to notice their own undefined
symbols.
WBR,
Alexander Potapenko
Software Engineer
Google Moscow
Index: clang/lib/Driver/Tools.cpp
===================================================================
--- clang/lib/Driver/Tools.cpp (revision 145467)
+++ clang/lib/Driver/Tools.cpp (working copy)
@@ -1093,7 +1093,7 @@
/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
/// This needs to be called before we add the C run-time (malloc, etc).
static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
- ArgStringList &CmdArgs) {
+ ArgStringList &CmdArgs) {
// Add asan linker flags when linking an executable, but not a shared object.
if (Args.hasArg(options::OPT_shared) ||
!Args.hasFlag(options::OPT_faddress_sanitizer,
@@ -1111,6 +1111,48 @@
TC.AddCXXStdlibLibArgs(Args, CmdArgs);
}
+static void addAsanRTDarwinExe(const ToolChain &TC, const ArgList &Args,
+ ArgStringList &CmdArgs) {
+ // LibAsan is "../lib/clang/linux/ArchName/libclang_rt.asan.a
+ llvm::SmallString<128> LibAsan =
+ llvm::sys::path::parent_path(StringRef(TC.getDriver().Dir));
+ llvm::sys::path::append(LibAsan, "lib", "clang", "darwin", TC.getArchName());
+ llvm::sys::path::append(LibAsan, "libclang_rt.asan.a");
+ CmdArgs.push_back(Args.MakeArgString(LibAsan));
+ CmdArgs.push_back("-lpthread");
+ CmdArgs.push_back("-ldl");
+ CmdArgs.push_back("-framework");
+ CmdArgs.push_back("Foundation");
+ TC.AddCXXStdlibLibArgs(Args, CmdArgs);
+}
+
+const char *AsanIfaceFns[13] = {
+ "___asan_init",
+ "___asan_report_load1",
+ "___asan_report_load2",
+ "___asan_report_load4",
+ "___asan_report_load8",
+ "___asan_report_load16",
+ "___asan_report_store1",
+ "___asan_report_store2",
+ "___asan_report_store4",
+ "___asan_report_store8",
+ "___asan_report_store16",
+ "___asan_register_global",
+ "___asan_register_globals",
+};
+
+const int AsanIfaceFnsSize = sizeof(AsanIfaceFns) / sizeof(char*);
+
+static void addAsanRTDarwinDynamicLib(const ToolChain &unused_TC,
+ const ArgList &Args,
+ ArgStringList &CmdArgs) {
+ for (int index = 0; index < AsanIfaceFnsSize; ++index) {
+ CmdArgs.push_back("-U");
+ CmdArgs.push_back(Args.MakeArgString(AsanIfaceFns[index]));
+ }
+}
+
void Clang::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
@@ -3566,6 +3608,18 @@
}
Args.AddAllArgs(CmdArgs, options::OPT_L);
+
+ // AddressSanitizer support.
+ if (Args.hasArg(options::OPT_faddress_sanitizer)) {
+ if (!Args.hasArg(options::OPT_dynamiclib) &&
+ !Args.hasArg(options::OPT_bundle)) {
+ addAsanRTDarwinExe(getToolChain(), Args, CmdArgs);
+ }
+ if (Args.hasArg(options::OPT_dynamiclib) ||
+ Args.hasArg(options::OPT_bundle)) {
+ addAsanRTDarwinDynamicLib(getToolChain(), Args, CmdArgs);
+ }
+ }
if (Args.hasArg(options::OPT_fopenmp))
// This is more complicated in gcc...
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits