Commit 99e0e200 authored by Christopher Grant's avatar Christopher Grant Committed by Commit Bot

Dynamically generate the native library linker script

Credit to digit@ who supplied much of this change via a reference CL.

Rather than including one of two static linker scripts, generate the
desired script instead.  This allows an arbitrary list of additional
exported methods to be supplied if desired.

BUG=874587

Change-Id: I88eb0469dfb764bf910b8c3fe76fd4ed2c91c1e4
Reviewed-on: https://chromium-review.googlesource.com/c/1338141
Commit-Queue: Christopher Grant <cjgrant@chromium.org>
Reviewed-by: default avatarTibor Goldschwendt <tiborg@chromium.org>
Reviewed-by: default avataragrieve <agrieve@chromium.org>
Cr-Commit-Position: refs/heads/master@{#610217}
parent f570d28f
......@@ -671,6 +671,7 @@ _ANDROID_SPECIFIC_PYDEPS_FILES = [
'build/android/gyp/emma_instr.pydeps',
'build/android/gyp/filter_zip.pydeps',
'build/android/gyp/gcc_preprocess.pydeps',
'build/android/gyp/generate_linker_version_script.pydeps',
'build/android/gyp/generate_proguarded_module_jar.pydeps',
'build/android/gyp/ijar.pydeps',
'build/android/gyp/java_cpp_enum.pydeps',
......
#!/usr/bin/env vpython
# 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-whitelist-file',
help='Path to input file containing whitelist of extra '
'symbols to export. One symbol per line.')
options = parser.parse_args()
# JNI_OnLoad is always exported.
symbol_list = ['JNI_OnLoad']
if options.export_java_symbols:
symbol_list.append('Java_*')
if options.export_symbol_whitelist_file:
with open(options.export_symbol_whitelist_file, '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) as f:
f.write(script)
if __name__ == '__main__':
main()
# Generated by running:
# build/print_python_deps.py --root build/android/gyp --output build/android/gyp/generate_linker_version_script.pydeps build/android/gyp/generate_linker_version_script.py
../../gn_helpers.py
generate_linker_version_script.py
util/__init__.py
util/build_utils.py
util/md5_check.py
# 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.
import("//build/config/python.gni")
# Generate a custom linker version script that can later be used with
# "-Wl,--version-script=<path>" ldflags.
#
# Variables:
# export_java_symbols: Optional. If true, also export all Java_* symbols
# exported for JNI.
# export_symbol_whitelist_file: Optional. Path to an input file containing
# a whitelist of exported symbols.
# linker_script: Path to output linker version script.
#
template("generate_linker_version_script") {
action_with_pydeps(target_name) {
script = "//build/android/gyp/generate_linker_version_script.py"
outputs = [
invoker.linker_script,
]
inputs = []
args = [ "--output=" + rebase_path(invoker.linker_script, root_build_dir) ]
if (defined(invoker.export_java_symbols) && invoker.export_java_symbols) {
args += [ "--export-java-symbols" ]
}
if (defined(invoker.export_symbol_whitelist_file)) {
inputs += [ invoker.export_symbol_whitelist_file ]
args +=
[ "--export-symbol-whitelist-file=" +
rebase_path(invoker.export_symbol_whitelist_file, root_build_dir) ]
}
}
}
......@@ -4,6 +4,7 @@
import("//build/config/android/chrome_version.gni")
import("//build/config/android/config.gni")
import("//build/config/android/linker_version_script.gni")
import("//build/config/android/rules.gni")
import("//build/util/process_version.gni")
import("//chrome/android/chrome_public_apk_tmpl.gni")
......@@ -976,31 +977,53 @@ jinja_template_resources("chrome_test_apk_template_resources") {
# Variables:
# export_java_symbols: Optional. If true, export Java_* native library
# symbols required for lazy JNI registration.
# export_symbol_whitelist: Optional. If set, a pre-determined list of additional
# methods are exposed by the resulting library.
# enable_compressed_relocations: Optional. If true, enable compressed
# ELF relocations to reduce native library size.
# use_gnu_hash_style: If true, the final library will include only GNU hash
# tables, rather than both SysV and GNU types (the default).
template("chrome_common_shared_library") {
_export_java_symbols =
defined(invoker.export_java_symbols) && invoker.export_java_symbols
_linker_script = "$target_gen_dir/${target_name}_linker_script.txt"
_linker_script_target = "${target_name}_linker_script"
# Create a custom linker script based on JNI and feature module requirements.
generate_linker_version_script(_linker_script_target) {
linker_script = _linker_script
export_java_symbols = _export_java_symbols
if (defined(invoker.export_symbol_whitelist)) {
export_symbol_whitelist_file =
"//chrome/android/feature_module_exports.lst"
}
}
shared_library(target_name) {
forward_variables_from(invoker,
"*",
[
"enable_compressed_relocations",
"export_java_symbols",
"export_symbol_whitelist",
"use_gnu_hash_style",
])
_export_java_symbols =
defined(invoker.export_java_symbols) && invoker.export_java_symbols
deps += [ "//chrome:chrome_android_core" ]
public_configs = extra_chrome_shared_library_configs
deps += extra_chrome_shared_library_deps
if (_export_java_symbols) {
configs -= [ "//build/config/android:hide_all_but_jni_onload" ]
configs += [ "//build/config/android:hide_all_but_jni" ]
# Use a dynamically-generated linker script.
configs -= [ "//build/config/android:hide_all_but_jni_onload" ]
deps += [ ":$_linker_script_target" ]
inputs = [
"$_linker_script",
]
if (!defined(ldflags)) {
ldflags = []
}
ldflags += [ "-Wl,--version-script=" +
rebase_path(_linker_script, root_build_dir) ]
# Handle VR JNI regisration and dependencies.
if (enable_vr) {
......@@ -1030,9 +1053,6 @@ template("chrome_common_shared_library") {
# never compiled in the final library (http://crbug.com/742525#c28). GNU
# hash support was added in Android M. Also not supported on MIPS
# architecture (http://crbug.com/811306).
if (!defined(ldflags)) {
ldflags = []
}
ldflags += [ "-Wl,--hash-style=gnu" ]
}
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment