[Lldb-commits] [PATCH] D79607: [lldb/test][Darwin] Ask dyld where the real python is

Vedant Kumar via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Thu May 7 16:19:53 PDT 2020


vsk created this revision.
vsk added a reviewer: JDevlieghere.
Herald added a project: LLDB.

On macOS, we can't do the DYLD_INSERT_LIBRARIES trick with a shim
python binary as the ASan interceptors get loaded too late. Find the
"real" python binary, copy it, and invoke it.

Hopefully this makes the GreenDragon and swift-ci sanitizer bots
happy...

I tested this out by running `../llvm-macosx-x86_64/bin/llvm-lit test
--filter TestNSDictionarySynthetic.py` in an ASanified swift-lldb build
directory and it worked (i.e. no more "interceptors loaded too late"
messages).


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D79607

Files:
  lldb/test/API/lldbtest.py


Index: lldb/test/API/lldbtest.py
===================================================================
--- lldb/test/API/lldbtest.py
+++ lldb/test/API/lldbtest.py
@@ -28,6 +28,19 @@
     if not os.path.isdir(path):
         raise OSError(errno.ENOTDIR, "%s is not a directory"%path)
 
+# On macOS, system python binaries like /usr/bin/python and $(xcrun -f python3)
+# are shims. They do some light validation work and then spawn the "real" python
+# binary. Find the "real" python by asking dyld -- sys.executable reports the
+# wrong thing more often than not. This is also useful when we're running under
+# a Homebrew python3 binary, which also appears to be some kind of shim.
+def getDarwinRealPythonExecutable():
+    import ctypes
+    dyld = ctypes.cdll.LoadLibrary('/usr/lib/system/libdyld.dylib')
+    namelen = ctypes.c_ulong(1024)
+    name = ctypes.create_string_buffer(b'\000', namelen.value)
+    dyld._NSGetExecutablePath(ctypes.byref(name), ctypes.byref(namelen))
+    return name.value.decode('utf-8').strip()
+
 class LLDBTest(TestFormat):
     def __init__(self, dotest_cmd):
         self.dotest_cmd = dotest_cmd
@@ -75,20 +88,14 @@
         builddir = getBuildDir(cmd)
         mkdir_p(builddir)
 
-        # The macOS system integrity protection (SIP) doesn't allow injecting
-        # libraries into system binaries, but this can be worked around by
-        # copying the binary into a different location.
-        if 'DYLD_INSERT_LIBRARIES' in test.config.environment and \
-                (executable.startswith('/System/') or \
-                executable.startswith('/usr/bin/')):
+        # On macOS, we can't do the DYLD_INSERT_LIBRARIES trick with a shim
+        # python binary as the ASan interceptors get loaded too late. Find the
+        # "real" python binary, copy it, and invoke it.
+        if 'DYLD_INSERT_LIBRARIES' in test.config.environment:
             copied_python = os.path.join(builddir, 'copied-system-python')
             if not os.path.isfile(copied_python):
-                import shutil, subprocess
-                python = subprocess.check_output([
-                    executable,
-                    '-c',
-                    'import sys; print(sys.executable)'
-                ]).decode('utf-8').strip()
+                import shutil
+                python = getDarwinRealPythonExecutable()
                 shutil.copy(python, copied_python)
             cmd[0] = copied_python
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D79607.262783.patch
Type: text/x-patch
Size: 2451 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20200507/8434c44e/attachment.bin>


More information about the lldb-commits mailing list