| #!/usr/bin/env python3 | |
| # Copyright 2018 The Chromium Authors. All rights reserved. | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| """Generate linker version scripts for Chrome on Android shared libraries.""" | |
| import argparse | |
| import os | |
| from util import build_utils | |
| _SCRIPT_HEADER = """\ | |
| # AUTO-GENERATED FILE. DO NOT MODIFY. | |
| # | |
| # See: %s | |
| { | |
| global: | |
| """ % os.path.relpath(__file__, build_utils.DIR_SOURCE_ROOT) | |
| _SCRIPT_FOOTER = """\ | |
| local: | |
| *; | |
| }; | |
| """ | |
| def main(): | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument( | |
| '--output', | |
| required=True, | |
| help='Path to output linker version script file.') | |
| parser.add_argument( | |
| '--export-java-symbols', | |
| action='store_true', | |
| help='Export Java_* JNI methods') | |
| parser.add_argument( | |
| '--export-symbol-allowlist-file', | |
| action='append', | |
| default=[], | |
| dest='allowlists', | |
| help='Path to an input file containing an allowlist of extra symbols to ' | |
| 'export, one symbol per line. Multiple files may be specified.') | |
| parser.add_argument( | |
| '--export-feature-registrations', | |
| action='store_true', | |
| help='Export JNI_OnLoad_* methods') | |
| options = parser.parse_args() | |
| # JNI_OnLoad is always exported. | |
| # CrashpadHandlerMain() is the entry point to the Crashpad handler, required | |
| # for libcrashpad_handler_trampoline.so. | |
| symbol_list = ['CrashpadHandlerMain', 'JNI_OnLoad'] | |
| if options.export_java_symbols: | |
| symbol_list.append('Java_*') | |
| if options.export_feature_registrations: | |
| symbol_list.append('JNI_OnLoad_*') | |
| for allowlist in options.allowlists: | |
| with open(allowlist, 'rt') as f: | |
| for line in f: | |
| line = line.strip() | |
| if not line or line[0] == '#': | |
| continue | |
| symbol_list.append(line) | |
| script_content = [_SCRIPT_HEADER] | |
| for symbol in symbol_list: | |
| script_content.append(' %s;\n' % symbol) | |
| script_content.append(_SCRIPT_FOOTER) | |
| script = ''.join(script_content) | |
| with build_utils.AtomicOutput(options.output, mode='w') as f: | |
| f.write(script) | |
| if __name__ == '__main__': | |
| main() |