#!/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()