blob: 12bcd37ecc36dab2171b2cf681fbbbb59654439b [file] [log] [blame]
Andrew Grieve4def600e2024-04-30 14:05:501#! /usr/bin/env python3
2# Copyright 2024 The Chromium Authors
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6import argparse
7import pathlib
8
9
Andrew Grieve5f466e72025-06-17 19:21:0610def _generate(arch, hwasan, asan, env):
11 ret = """\
=afaea1b2025-03-10 11:36:1712#!/system/bin/sh
Andrew Grieve5f466e72025-06-17 19:21:0613"""
=afaea1b2025-03-10 11:36:1714
Andrew Grieve5f466e72025-06-17 19:21:0615 if hwasan:
16 # https://developer.android.com/ndk/guides/hwasan#wrapsh
17 ret += """
=afaea1b2025-03-10 11:36:1718# import options file
19_HWASAN_OPTIONS=$(cat /data/local/tmp/hwasan.options 2> /dev/null || true)
20
21log -t cr_wrap.sh -- "Launching with HWASAN enabled."
=afaea1b2025-03-10 11:36:1722"""
Andrew Grieve5f466e72025-06-17 19:21:0623 env['HWASAN_OPTIONS'] = '$_HWASAN_OPTIONS'
24 env['LD_HWASAN'] = '1'
25
26 if asan:
27 # https://github.com/google/sanitizers/wiki/AddressSanitizerOnAndroid/01f8df1ac1a447a8475cdfcb03e8b13140042dbd#running-with-wrapsh-recommended
28 ret += f"""
Andrew Grieve4def600e2024-04-30 14:05:5029HERE="$(cd "$(dirname "$0")" && pwd)"
30# Options suggested by wiki docs:
31_ASAN_OPTIONS="log_to_syslog=false,allow_user_segv_handler=1"
32# Chromium-specific option (supposedly for graphics drivers):
33_ASAN_OPTIONS="$_ASAN_OPTIONS,strict_memcmp=0,use_sigaltstack=1"
34_LD_PRELOAD="$HERE/libclang_rt.asan-{arch}-android.so"
Andrew Grieve5f466e72025-06-17 19:21:0635
Andrew Grieve4def600e2024-04-30 14:05:5036log -t cr_wrap.sh -- "Launching with ASAN enabled."
Andrew Grieve5f466e72025-06-17 19:21:0637"""
38 env['LD_PRELOAD'] = '$_LD_PRELOAD'
39 env['ASAN_OPTIONS'] = '$_ASAN_OPTIONS'
40
41 ret += 'log -t cr_wrap.sh -- "Command: $0 $@"\n'
42
43 # Cannot set env vars before calling "log" commands, because they would
44 # affect the "log" executable.
45 for key, value in env.items():
46 ret += f'log -t cr_wrap.sh -- "{key}={value}"\n'
47
48 for key, value in env.items():
49 ret += f'export {key}="{value}"\n'
50
51 ret += """
Andrew Grieve4def600e2024-04-30 14:05:5052exec "$@"
53"""
Andrew Grieve5f466e72025-06-17 19:21:0654 return ret
Andrew Grieve4def600e2024-04-30 14:05:5055
56
57def main():
58 parser = argparse.ArgumentParser()
Andrew Grieve4def600e2024-04-30 14:05:5059 parser.add_argument('--output', required=True)
Andrew Grieve5f466e72025-06-17 19:21:0660 parser.add_argument('--arch', required=True)
61 parser.add_argument('--hwasan', action='store_true', default=False)
62 parser.add_argument('--asan', action='store_true', default=False)
63 parser.add_argument('--env')
Andrew Grieve4def600e2024-04-30 14:05:5064 args = parser.parse_args()
65
Andrew Grieve5f466e72025-06-17 19:21:0666 env = {}
67 if args.env:
68 for prop in args.env.split():
69 key, value = prop.split('=', 1)
70 env[key] = value
71 pathlib.Path(args.output).write_text(
72 _generate(args.arch, args.hwasan, args.asan, env))
Andrew Grieve4def600e2024-04-30 14:05:5073
74
75if __name__ == '__main__':
76 main()