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