[PATCH] D29287: [sanitizer] Fix 'dyld: Symbol not found: _memmem' linkage error on Darwin 10.6

Maxim Ostapenko via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Jan 30 09:21:16 PST 2017


m.ostapenko created this revision.
m.ostapenko added a project: Sanitizers.

This patch tries to fix sanitizer linkage errors on Darwin 10.6 (GCC's pr78663 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78663).
Since I don't have Darwin target available, I'm posting original patch for GCC as it is present in GCC bugzilla to initiate further discussion.
If (ugly) ifdef stuff is not acceptable, we can probably just introduce weak hooks for //__mmap// and //__munmap// that will fall back to regular //mmap// and //munmap// calls accordingly. For //memmem// we can probably print a warning.


Repository:
  rL LLVM

https://reviews.llvm.org/D29287

Files:
  lib/sanitizer_common/sanitizer_mac.cc
  lib/sanitizer_common/sanitizer_platform_interceptors.h


Index: lib/sanitizer_common/sanitizer_platform_interceptors.h
===================================================================
--- lib/sanitizer_common/sanitizer_platform_interceptors.h
+++ lib/sanitizer_common/sanitizer_platform_interceptors.h
@@ -47,9 +47,17 @@
 # define SI_LINUX 0
 #endif
 
+// FIXME: enable memmem on Windows.
+# define SI_MEMMEM SI_NOT_WINDOWS
+
 #if SANITIZER_MAC
 # define SI_MAC 1
 # define SI_NOT_MAC 0
+# if defined (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && \
+     __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070
+# undef SI_MEMMEM
+# define SI_MEMMEM 0
+# endif
 #else
 # define SI_MAC 0
 # define SI_NOT_MAC 1
@@ -83,8 +91,7 @@
 #define SANITIZER_INTERCEPT_MEMMOVE 1
 #define SANITIZER_INTERCEPT_MEMCPY 1
 #define SANITIZER_INTERCEPT_MEMCMP 1
-// FIXME: enable memmem on Windows.
-#define SANITIZER_INTERCEPT_MEMMEM SI_NOT_WINDOWS
+#define SANITIZER_INTERCEPT_MEMMEM SI_MEMMEM
 #define SANITIZER_INTERCEPT_MEMCHR 1
 #define SANITIZER_INTERCEPT_MEMRCHR SI_FREEBSD || SI_LINUX
 
Index: lib/sanitizer_common/sanitizer_mac.cc
===================================================================
--- lib/sanitizer_common/sanitizer_mac.cc
+++ lib/sanitizer_common/sanitizer_mac.cc
@@ -93,20 +93,24 @@
 
 #include "sanitizer_syscall_generic.inc"
 
-// Direct syscalls, don't call libmalloc hooks.
+// Direct syscalls, don't call libmalloc hooks (but not available one 10.6).
 extern "C" void *__mmap(void *addr, size_t len, int prot, int flags, int fildes,
-                        off_t off);
-extern "C" int __munmap(void *, size_t);
+                        off_t off) SANITIZER_WEAK_ATTRIBUTE;
+extern "C" int __munmap(void *, size_t) SANITIZER_WEAK_ATTRIBUTE;
 
 // ---------------------- sanitizer_libc.h
 uptr internal_mmap(void *addr, size_t length, int prot, int flags,
                    int fd, u64 offset) {
   if (fd == -1) fd = VM_MAKE_TAG(VM_MEMORY_ANALYSIS_TOOL);
-  return (uptr)__mmap(addr, length, prot, flags, fd, offset);
+  if (__mmap)
+     return (uptr)__mmap(addr, length, prot, flags, fd, offset);
+  return (uptr) mmap(addr, length, prot, flags, fd, offset);
 }
 
 uptr internal_munmap(void *addr, uptr length) {
-  return __munmap(addr, length);
+  if (__munmap)
+    return __munmap(addr, length);
+  return munmap(addr, length);
 }
 
 int internal_mprotect(void *addr, uptr length, int prot) {
@@ -192,17 +196,19 @@
   return sigprocmask(how, set, oldset);
 }
 
-// Doesn't call pthread_atfork() handlers.
-extern "C" pid_t __fork(void);
+ // Doesn't call pthread_atfork() handlers (but not available on 10.6).
+extern "C" pid_t __fork(void) SANITIZER_WEAK_ATTRIBUTE;
 
 int internal_fork() {
-  return __fork();
+  if (__fork)
+    return __fork();
+  return fork();
 }
 
 int internal_forkpty(int *amaster) {
   int master, slave;
   if (openpty(&master, &slave, nullptr, nullptr, nullptr) == -1) return -1;
-  int pid = __fork();
+  int pid = internal_fork();
   if (pid == -1) {
     close(master);
     close(slave);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D29287.86300.patch
Type: text/x-patch
Size: 2993 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170130/8471f6cf/attachment.bin>


More information about the llvm-commits mailing list