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 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits