blob: c3e72769afef7ccc829e2cfc89d8e5e3bd6ef648 [file] [log] [blame]
# Copyright 2014 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/android/config.gni")
import("//testing/test.gni")
assert(is_android)
config("crazy_config") {
include_dirs = [ "src/include" ]
libs = [
"log",
"dl",
]
}
group("android_crazy_linker_tests") {
deps = [
":android_crazy_linker_unittests",
":crazy_linker_bench_load_library",
":crazy_linker_test_constructors_destructors",
":crazy_linker_test_dl_wrappers",
":crazy_linker_test_dl_wrappers_valid_handles",
":crazy_linker_test_dl_wrappers_with_system_handle",
":crazy_linker_test_load_library",
":crazy_linker_test_load_library_callbacks",
":crazy_linker_test_load_library_depends",
":crazy_linker_test_relocated_shared_relro",
":crazy_linker_test_search_path_list",
":crazy_linker_test_shared_relro",
":crazy_linker_test_two_shared_relros",
":run_android_crazy_linker_tests",
]
testonly = true
}
# Template to define a source set for the crazy linker.
# This takes a single boolean parameter:
#
# unit_tests: if true, build a version with unit-testing support.
#
template("crazy_linker_library") {
source_set(target_name) {
forward_variables_from(invoker, [ "*" ])
sources = [
"src/include/crazy_linker.h",
"src/src/crazy_linker_api.cpp",
"src/src/crazy_linker_ashmem.cpp",
"src/src/crazy_linker_ashmem.h",
"src/src/crazy_linker_debug.cpp",
"src/src/crazy_linker_debug.h",
"src/src/crazy_linker_defines.h",
"src/src/crazy_linker_elf_loader.cpp",
"src/src/crazy_linker_elf_loader.h",
"src/src/crazy_linker_elf_relocations.cpp",
"src/src/crazy_linker_elf_relocations.h",
"src/src/crazy_linker_elf_relro.cpp",
"src/src/crazy_linker_elf_relro.h",
"src/src/crazy_linker_elf_symbols.cpp",
"src/src/crazy_linker_elf_symbols.h",
"src/src/crazy_linker_elf_view.cpp",
"src/src/crazy_linker_elf_view.h",
"src/src/crazy_linker_error.cpp",
"src/src/crazy_linker_error.h",
"src/src/crazy_linker_globals.cpp",
"src/src/crazy_linker_globals.h",
"src/src/crazy_linker_library_list.cpp",
"src/src/crazy_linker_library_list.h",
"src/src/crazy_linker_library_view.cpp",
"src/src/crazy_linker_library_view.h",
"src/src/crazy_linker_line_reader.cpp",
"src/src/crazy_linker_line_reader.h",
"src/src/crazy_linker_memory_mapping.h",
"src/src/crazy_linker_pointer_set.cpp",
"src/src/crazy_linker_pointer_set.h",
"src/src/crazy_linker_proc_maps.cpp",
"src/src/crazy_linker_proc_maps.h",
"src/src/crazy_linker_rdebug.cpp",
"src/src/crazy_linker_rdebug.h",
"src/src/crazy_linker_search_path_list.cpp",
"src/src/crazy_linker_search_path_list.h",
"src/src/crazy_linker_shared_library.cpp",
"src/src/crazy_linker_shared_library.h",
"src/src/crazy_linker_system.cpp",
"src/src/crazy_linker_system.h",
"src/src/crazy_linker_thread.cpp",
"src/src/crazy_linker_thread.h",
"src/src/crazy_linker_util.cpp",
"src/src/crazy_linker_util.h",
"src/src/crazy_linker_wrappers.cpp",
"src/src/crazy_linker_wrappers.h",
"src/src/crazy_linker_zip.cpp",
"src/src/crazy_linker_zip.h",
"src/src/elf_traits.h",
"src/src/linker_phdr.cpp",
"src/src/linker_phdr.h",
"src/src/linker_reloc_iterators.h",
"src/src/linker_sleb128.h",
]
include_dirs = [ "src/src" ]
if (defined(invoker.unit_tests) && invoker.unit_tests) {
sources += [
"src/src/crazy_linker_system_mock.cpp",
"src/src/crazy_linker_system_mock.h",
]
defines = [
"UNIT_TESTS",
"CRAZY_DEBUG=1",
]
} else {
# Disable r_brk() calls for release builds. This is a work-around for
# unexplained runtime crashes that happen on Intel-based Android
# devices that run ARM binaries through Houdini. For more details
# see https://crbug.com/796938
if (!is_debug) {
defines = [ "CRAZY_DISABLE_R_BRK" ]
}
}
public_configs = [ ":crazy_config" ]
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [ "//build/config/compiler:no_chromium_code" ]
}
}
crazy_linker_library("android_crazy_linker") {
}
crazy_linker_library("android_crazy_linker_for_unittests") {
unit_tests = true
}
test("android_crazy_linker_unittests") {
sources = [
"src/src/crazy_linker_ashmem_unittest.cpp",
"src/src/crazy_linker_error_unittest.cpp",
"src/src/crazy_linker_globals_unittest.cpp",
"src/src/crazy_linker_line_reader_unittest.cpp",
"src/src/crazy_linker_pointer_set_unittest.cpp",
"src/src/crazy_linker_proc_maps_unittest.cpp",
"src/src/crazy_linker_search_path_list_unittest.cpp",
"src/src/crazy_linker_system_unittest.cpp",
"src/src/crazy_linker_thread_unittest.cpp",
"src/src/crazy_linker_util_unittest.cpp",
"src/src/crazy_linker_zip_unittest.cpp",
]
include_dirs = [ "src/src" ]
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [ "//build/config/compiler:no_chromium_code" ]
deps = [
":android_crazy_linker_for_unittests",
"//testing/gtest",
"//testing/gtest:gtest_main",
]
use_raw_android_executable = true
}
# The following are shared libraries used by the integration tests.
template("crazy_linker_test_library") {
shared_library(target_name) {
sources = invoker.sources
libs = [ "log" ]
if (defined(invoker.deps)) {
deps = invoker.deps
}
if (defined(invoker.data_deps)) {
data_deps = invoker.data_deps
}
if (defined(invoker.libs)) {
libs += invoker.libs
}
# This is not Chromium code.
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [ "//build/config/compiler:no_chromium_code" ]
# All libraries expects their symbols to be visible.
configs -= [ "//build/config/android:hide_all_but_jni_onload" ]
configs -= [ "//build/config/gcc:symbol_visibility_hidden" ]
configs += [ "//build/config/gcc:symbol_visibility_default" ]
}
}
crazy_linker_test_library("crazy_linker_tests_libfoo") {
sources = [
"src/tests/foo.cpp",
]
}
crazy_linker_test_library("crazy_linker_tests_libfoo2") {
sources = [
"src/tests/foo2.cpp",
]
}
crazy_linker_test_library("crazy_linker_tests_libfoo_with_relro") {
sources = [
"src/tests/foo_with_relro.cpp",
]
}
crazy_linker_test_library("crazy_linker_tests_libfoo_with_static_constructor") {
sources = [
"src/tests/foo_with_static_constructor.cpp",
]
}
crazy_linker_test_library("crazy_linker_tests_libbar") {
sources = [
"src/tests/bar.cpp",
]
deps = [
":crazy_linker_tests_libfoo",
]
}
crazy_linker_test_library("crazy_linker_tests_libbar_with_relro") {
sources = [
"src/tests/bar_with_relro.cpp",
]
deps = [
":crazy_linker_tests_libfoo_with_relro",
]
}
crazy_linker_test_library("crazy_linker_tests_libbar_with_two_dlopens") {
sources = [
"src/tests/bar_with_two_dlopens.cpp",
]
data_deps = [
":crazy_linker_tests_libfoo",
":crazy_linker_tests_libfoo2",
]
libs = [ "dl" ]
}
crazy_linker_test_library("crazy_linker_tests_libzoo") {
sources = [
"src/tests/zoo.cpp",
]
data_deps = [
":crazy_linker_tests_libbar",
]
}
crazy_linker_test_library("crazy_linker_tests_libzoo_with_dlopen_handle") {
sources = [
"src/tests/zoo_with_dlopen_handle.cpp",
]
libs = [ "dl" ]
}
# Integration tests are provided as standalone executables for now.
executable("crazy_linker_bench_load_library") {
sources = [
"src/tests/bench_load_library.cpp",
]
data_deps = [
":crazy_linker_tests_libfoo",
]
deps = [
":android_crazy_linker",
]
}
executable("crazy_linker_test_load_library") {
sources = [
"src/tests/test_load_library.cpp",
]
data_deps = [
":crazy_linker_tests_libfoo",
]
deps = [
":android_crazy_linker",
]
}
executable("crazy_linker_test_load_library_depends") {
sources = [
"src/tests/test_load_library_depends.cpp",
]
data_deps = [
":crazy_linker_tests_libbar",
]
deps = [
":android_crazy_linker",
]
}
executable("crazy_linker_test_load_library_callbacks") {
sources = [
"src/tests/test_load_library_callbacks.cpp",
]
data_deps = [
":crazy_linker_tests_libbar",
]
deps = [
":android_crazy_linker",
]
}
executable("crazy_linker_test_constructors_destructors") {
sources = [
"src/tests/test_constructors_destructors.cpp",
]
data_deps = [
":crazy_linker_tests_libfoo_with_static_constructor",
]
deps = [
":android_crazy_linker",
]
}
executable("crazy_linker_test_dl_wrappers") {
sources = [
"src/tests/test_dl_wrappers.cpp",
]
data_deps = [
":crazy_linker_tests_libzoo",
]
deps = [
":android_crazy_linker",
]
}
executable("crazy_linker_test_dl_wrappers_with_system_handle") {
sources = [
"src/tests/test_dl_wrappers_with_system_handle.cpp",
]
data_deps = [
":crazy_linker_tests_libzoo_with_dlopen_handle",
]
deps = [
":android_crazy_linker",
]
}
executable("crazy_linker_test_dl_wrappers_valid_handles") {
sources = [
"src/tests/test_dl_wrappers_valid_handles.cpp",
]
data_deps = [
":crazy_linker_tests_libbar_with_two_dlopens",
]
deps = [
":android_crazy_linker",
]
}
executable("crazy_linker_test_search_path_list") {
sources = [
"src/tests/test_search_path_list.cpp",
]
data_deps = [
":crazy_linker_tests_libfoo",
":crazy_linker_tests_libfoo2",
]
deps = [
":android_crazy_linker",
]
}
executable("crazy_linker_test_relocated_shared_relro") {
sources = [
"src/tests/test_relocated_shared_relro.cpp",
]
data_deps = [
":crazy_linker_tests_libfoo_with_relro",
]
deps = [
":android_crazy_linker",
]
}
executable("crazy_linker_test_shared_relro") {
sources = [
"src/tests/test_shared_relro.cpp",
]
data_deps = [
":crazy_linker_tests_libfoo_with_relro",
]
deps = [
":android_crazy_linker",
]
}
executable("crazy_linker_test_two_shared_relros") {
sources = [
"src/tests/test_two_shared_relros.cpp",
]
data_deps = [
":crazy_linker_tests_libfoo_with_relro",
":crazy_linker_tests_libbar_with_relro",
]
deps = [
":android_crazy_linker",
]
}
# Copy the script that runs all integration tests to the right directory.
copy("run_android_crazy_linker_tests") {
sources = [
"src/run_tests.sh",
]
outputs = [
"$root_out_dir/bin/run_android_crazy_linker_tests",
]
}