[sanitizer] Add -lresolv only for non-Android non-musl Linux
authorFangrui Song <i@maskray.me>
Tue, 14 Jun 2022 02:12:13 +0000 (19:12 -0700)
committerFangrui Song <i@maskray.me>
Tue, 14 Jun 2022 02:12:13 +0000 (19:12 -0700)
Refine the D127145 logic with my original suggestion.
It turns out that many OSes don't have libresolv.

clang/lib/Driver/ToolChains/CommonArgs.cpp
clang/test/Driver/sanitizer-ld.c

index db022d1..7be2507 100644 (file)
@@ -838,8 +838,11 @@ void tools::linkSanitizerRuntimeDeps(const ToolChain &TC,
       TC.getTriple().isOSNetBSD() ||
       TC.getTriple().isOSOpenBSD())
     CmdArgs.push_back("-lexecinfo");
-  // There is no libresolv on Android.
-  if (!TC.getTriple().isAndroid())
+  // There is no libresolv on Android, FreeBSD, OpenBSD, etc. On musl
+  // libresolv.a, even if exists, is an empty archive to satisfy POSIX -lresolv
+  // requirement.
+  if (TC.getTriple().isOSLinux() && !TC.getTriple().isAndroid() &&
+      !TC.getTriple().isMusl())
     CmdArgs.push_back("-lresolv");
 }
 
index b043a4d..423ce8b 100644 (file)
 // CHECK-ASAN-FREEBSD: "--export-dynamic"
 // CHECK-ASAN-FREEBSD: "-lpthread"
 // CHECK-ASAN-FREEBSD: "-lrt"
-// CHECK-ASAN-FREEBSD: "-lresolv"
 
 // RUN: %clang -### %s 2>&1 \
 // RUN:     --target=i386-unknown-freebsd -fuse-ld=ld -fsanitize=address \