[Lldb-commits] [lldb] 8cb86ea - [lldb/test][Darwin] Ask dyld where the real python is
Vedant Kumar via lldb-commits
lldb-commits at lists.llvm.org
Fri May 8 10:23:25 PDT 2020
Author: Vedant Kumar
Date: 2020-05-08T10:22:58-07:00
New Revision: 8cb86ead77417f889bf32a8f83da299215f78545
URL: https://github.com/llvm/llvm-project/commit/8cb86ead77417f889bf32a8f83da299215f78545
DIFF: https://github.com/llvm/llvm-project/commit/8cb86ead77417f889bf32a8f83da299215f78545.diff
LOG: [lldb/test][Darwin] Ask dyld where the real python is
Summary:
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).
Reviewers: JDevlieghere
Subscribers: lldb-commits
Tags: #lldb
Differential Revision: https://reviews.llvm.org/D79607
Added:
lldb/test/API/get_darwin_real_python.py
Modified:
lldb/test/API/lldbtest.py
Removed:
################################################################################
diff --git a/lldb/test/API/get_darwin_real_python.py b/lldb/test/API/get_darwin_real_python.py
new file mode 100644
index 000000000000..3521fab67579
--- /dev/null
+++ b/lldb/test/API/get_darwin_real_python.py
@@ -0,0 +1,14 @@
+# 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()
+
+print(getDarwinRealPythonExecutable())
diff --git a/lldb/test/API/lldbtest.py b/lldb/test/API/lldbtest.py
index 77654e4082eb..c6331f6a0cac 100644
--- a/lldb/test/API/lldbtest.py
+++ b/lldb/test/API/lldbtest.py
@@ -3,6 +3,7 @@
import tempfile
import subprocess
import sys
+import platform
import lit.Test
import lit.TestRunner
@@ -75,19 +76,21 @@ def execute(self, test, litConfig):
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
diff erent location.
+ # On macOS, we can't do the DYLD_INSERT_LIBRARIES trick with a shim
+ # python binary as the ASan interceptors get loaded too late. Also,
+ # when SIP is enabled, we can't inject libraries into system binaries
+ # at all, so we need a copy of the "real" python to work with.
+ #
+ # Find the "real" python binary, copy it, and invoke it.
if 'DYLD_INSERT_LIBRARIES' in test.config.environment and \
- (executable.startswith('/System/') or \
- executable.startswith('/usr/bin/')):
+ platform.system() == 'Darwin':
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)'
+ os.path.join(os.path.dirname(os.path.realpath(__file__)),
+ 'get_darwin_real_python.py')
]).decode('utf-8').strip()
shutil.copy(python, copied_python)
cmd[0] = copied_python
More information about the lldb-commits
mailing list