| # 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/libfuzzer/fuzzer_test.gni") |
| import("//testing/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_jni_hooks", |
| ":crazy_linker_test_load_library", |
| ":crazy_linker_test_load_library_depends", |
| ":crazy_linker_test_load_library_with_gnu_hash_table", |
| ":crazy_linker_test_load_library_with_relr_relocations", |
| ":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_hash_table.cpp", |
| "src/src/crazy_linker_elf_hash_table.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_gnu_hash_table.cpp", |
| "src/src/crazy_linker_gnu_hash_table.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.cpp", |
| "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_relr_relocations.cpp", |
| "src/src/crazy_linker_relr_relocations.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_android.cpp", |
| "src/src/crazy_linker_system_android.h", |
| "src/src/crazy_linker_system_linker.cpp", |
| "src/src/crazy_linker_system_linker.h", |
| "src/src/crazy_linker_thread_data.cpp", |
| "src/src/crazy_linker_thread_data.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_elf_hash_table_unittest.cpp", |
| "src/src/crazy_linker_elf_symbols_unittest.cpp", |
| "src/src/crazy_linker_error_unittest.cpp", |
| "src/src/crazy_linker_globals_unittest.cpp", |
| "src/src/crazy_linker_gnu_hash_table_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_relr_relocations_unittest.cpp", |
| "src/src/crazy_linker_search_path_list_unittest.cpp", |
| "src/src/crazy_linker_system_unittest.cpp", |
| "src/src/crazy_linker_thread_data_unittest.cpp", |
| "src/src/crazy_linker_util_threads_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) { |
| forward_variables_from(invoker, |
| [ |
| "deps", |
| "data_deps", |
| "defines", |
| "ldflags", |
| ]) |
| sources = invoker.sources |
| libs = [ "log" ] |
| 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. |
| 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_libfoo_with_gnu_hash_table") { |
| sources = [ |
| "src/tests/foo.cpp", |
| ] |
| ldflags = [ "-Wl,--hash-style=gnu" ] |
| } |
| |
| 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_relro_and_relr") { |
| sources = [ |
| "src/tests/foo_with_relro.cpp", |
| ] |
| ldflags = [ "-Wl,--pack-dyn-relocs=relr,--use-android-relr-tags" ] |
| } |
| |
| 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" ] |
| } |
| |
| crazy_linker_test_library("crazy_linker_tests_libjni_lib") { |
| sources = [ |
| "src/tests/jni_lib.cpp", |
| ] |
| } |
| |
| # 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_jni_hooks") { |
| sources = [ |
| "src/tests/test_jni_hooks.cpp", |
| ] |
| data_deps = [ |
| ":crazy_linker_tests_libjni_lib", |
| ] |
| 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_with_relr_relocations") { |
| sources = [ |
| "src/tests/test_load_library.cpp", |
| ] |
| data_deps = [ |
| ":crazy_linker_tests_libfoo_with_relro_and_relr", |
| ] |
| defines = |
| [ "LIB_NAME=\"libcrazy_linker_tests_libfoo_with_relro_and_relr.so\"" ] |
| 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_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_load_library_with_gnu_hash_table") { |
| sources = [ |
| "src/tests/test_load_library.cpp", |
| ] |
| defines = |
| [ "LIB_NAME=\"libcrazy_linker_tests_libfoo_with_gnu_hash_table.so\"" ] |
| data_deps = [ |
| ":crazy_linker_tests_libfoo_with_gnu_hash_table", |
| ] |
| 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' |
| # ninja -C 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_system.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" ] |
| } |