# 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") import("//testing/libfuzzer/fuzzer_test.gni") # NOTE: This file is included in Linux builds to build the # crazy_linker_zip_fuzzer target (see below). However, the rest of the # crazy linker doesn't build or work on Linux yet. config("crazy_config") { include_dirs = [ "src/include" ] if (is_android) { libs = [ "log", "dl", ] } } if (is_android) { 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_recursive", ":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_system_linker.cpp", "src/src/crazy_linker_system_linker.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(unit_tests) && unit_tests) { sources += [ "src/src/crazy_linker_system_mock.cpp", "src/src/crazy_linker_system_mock.h", ] defines = [ "UNIT_TEST", "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_test_data.cpp", "src/src/crazy_linker_zip_test_data.h", "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", ] if (is_android) { 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 } if (defined(invoker.defines)) { defines = invoker.defines } # 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. if (is_android) { 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" ] } crazy_linker_test_library("crazy_linker_tests_libzoo_dlopen_in_initializer") { sources = [ "src/tests/zoo_with_dlopen_in_elf_initializer.cpp", ] defines = [ "THIS_LIB_NAME=\"libzoo_dlopen_in_initializer\"", "LIB_NAME=\"libcrazy_linker_tests_libzoo_dlopen_in_initializer_inner.so\"", ] data_deps = [ ":crazy_linker_tests_libzoo_dlopen_in_initializer_inner", ] libs = [ "dl" ] } crazy_linker_test_library( "crazy_linker_tests_libzoo_dlopen_in_initializer_inner") { sources = [ "src/tests/zoo_with_dlopen_in_elf_initializer.cpp", ] defines = [ "THIS_LIB_NAME=\"libzoo_dlopen_in_initializer_inner\"", "LIB_NAME=\"libcrazy_linker_tests_libzoo.so\"", ] data_deps = [ ":crazy_linker_tests_libzoo", ] 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_recursive") { sources = [ "src/tests/test_dl_wrappers_recursive.cpp", ] data_deps = [ ":crazy_linker_tests_libzoo_dlopen_in_initializer", ] 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", ] } } # is_android # NOTE: To build and run this on Linux, use the following commands after # performing a Release build for Android: # # cd $CHROMIUM_SRC_DIR # mkdir out/Fuzz # gn gen out/Fuzz '--args=use_libfuzzer=true is_asan=true is_debug=false' # gn out/Fuzz android_crazy_linker_zip_fuzzer # out/Fuzz/android_crazy_linker_zip_fuzzer out/Release/apks # fuzzer_test("android_crazy_linker_zip_fuzzer") { sources = [ "src/src/crazy_linker_system.cpp", "src/src/crazy_linker_systeml.h", "src/src/crazy_linker_util.cpp", "src/src/crazy_linker_util.h", "src/src/crazy_linker_zip.cpp", "src/src/crazy_linker_zip.h", ] defines = [ "CRAZY_LINKER_ENABLE_FUZZING" ] }