blob: e40174ca5bbe0d549c69216a76362c133f458fd3 [file] [log] [blame] [edit]
#! /usr/bin/env python3
# Copyright 2024 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import argparse
import pathlib
def _generate(arch):
return f"""\
#!/system/bin/sh
# See: https://github.com/google/sanitizers/wiki/AddressSanitizerOnAndroid/\
01f8df1ac1a447a8475cdfcb03e8b13140042dbd#running-with-wrapsh-recommended
HERE="$(cd "$(dirname "$0")" && pwd)"
# Options suggested by wiki docs:
_ASAN_OPTIONS="log_to_syslog=false,allow_user_segv_handler=1"
# Chromium-specific option (supposedly for graphics drivers):
_ASAN_OPTIONS="$_ASAN_OPTIONS,strict_memcmp=0,use_sigaltstack=1"
_LD_PRELOAD="$HERE/libclang_rt.asan-{arch}-android.so"
log -t cr_wrap.sh -- "Launching with ASAN enabled."
log -t cr_wrap.sh -- "LD_PRELOAD=$_LD_PRELOAD"
log -t cr_wrap.sh -- "ASAN_OPTIONS=$_ASAN_OPTIONS"
log -t cr_wrap.sh -- "Command: $0 $@"
# Export LD_PRELOAD after running "log" commands to not risk it affecting
# them.
export LD_PRELOAD=$_LD_PRELOAD
export ASAN_OPTIONS=$_ASAN_OPTIONS
exec "$@"
"""
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--arch', required=True)
parser.add_argument('--output', required=True)
args = parser.parse_args()
pathlib.Path(args.output).write_text(_generate(args.arch))
if __name__ == '__main__':
main()