# Copyright 2015 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. # Chrome elf targets (excepting tests) should only link in kernel32. # Please don't add dependencies on any other system libraries. import("//build/config/compiler/compiler.gni") import("//build/config/win/manifest.gni") import("//chrome/process_version_rc_template.gni") import("//testing/test.gni") ##------------------------------------------------------------------------------ ## chrome_elf ##------------------------------------------------------------------------------ process_version_rc_template("chrome_elf_resources") { sources = [ "chrome_elf.ver", ] output = "$target_gen_dir/chrome_elf_version.rc" } # This manifest matches what GYP produces. It may not even be necessary. windows_manifest("chrome_elf_manifest") { sources = [ as_invoker_manifest, ] } # Users of chrome_elf exports can depend on this target, which doesn't # pin them to linking either chrome_elf.dll or test_stubs. source_set("chrome_elf_main_include") { sources = [ "chrome_elf_main.h", ] } # For code that isn't Chrome-the browser, like test binaries, these stubs stand # in for chrome_elf.; static_library("test_stubs") { testonly = true sources = [ "chrome_elf_main.h", "chrome_elf_test_stubs.cc", ] deps = [ ":sha1", ":third_party_shared_defines", "//base", "//chrome/common:constants", ] } # We should move chrome_result_codes.h to another target which does not bring # in the world. shared_library("chrome_elf") { sources = [ "chrome_elf_main.cc", "chrome_elf_main.h", ] if (target_cpu == "x86") { sources += [ "chrome_elf_x86.def" ] } else { sources += [ "chrome_elf_x64.def" ] } deps = [ ":blacklist", ":chrome_elf_manifest", ":chrome_elf_resources", ":constants", ":crash", ":hook_util", ":nt_registry", ":security", ":third_party_dlls", "//chrome/install_static:install_static_util", "//chrome/install_static:primary_module", "//components/crash/content/app:crash_export_thunks", ] configs += [ "//build/config/win:windowed" ] configs -= [ "//build/config/win:console" ] # Delay loads in this list will prevent user32.dll # from loading too early. ldflags = [ "/DELAYLOAD:advapi32.dll", "/DELAYLOAD:dbghelp.dll", "/DELAYLOAD:rpcrt4.dll", "/DELAYLOAD:winmm.dll", ] if (current_cpu == "x86") { # Don"t set an x64 base address (to avoid breaking HE-ASLR). ldflags += [ "/BASE:0x01c20000" ] } } ##------------------------------------------------------------------------------ ## chrome_elf sub targets ##------------------------------------------------------------------------------ static_library("blacklist") { sources = [ "blacklist/blacklist.cc", "blacklist/blacklist.h", ] deps = [ ":constants", ":nt_registry", "//chrome/install_static:install_static_util", ] } source_set("constants") { sources = [ "chrome_elf_constants.cc", "chrome_elf_constants.h", ] } static_library("crash") { sources = [ "../chrome/app/chrome_crash_reporter_client_win.cc", "../chrome/app/chrome_crash_reporter_client_win.h", "../chrome/common/chrome_result_codes.h", "crash/crash_helper.cc", "crash/crash_helper.h", ] deps = [ ":hook_util", "//base", # This needs to go. DEP of app, crash_keys, client. "//base:base_static", # pe_image "//chrome/install_static:install_static_util", "//components/crash/content/app", "//components/crash/core/common", # crash_keys "//components/version_info:channel", "//content/public/common:result_codes", "//third_party/crashpad/crashpad/client", # DumpWithoutCrash ] } source_set("dll_hash") { deps = [ "//base", ] sources = [ "dll_hash/dll_hash.cc", "dll_hash/dll_hash.h", ] } executable("dll_hash_main") { sources = [ "dll_hash/dll_hash_main.cc", ] deps = [ ":dll_hash", "//build/win:default_exe_manifest", ] } static_library("hook_util") { sources = [ "../base/macros.h", "hook_util/hook_util.cc", "hook_util/hook_util.h", ] deps = [ ":nt_registry", # utils "//base:base_static", # pe_image ] public_deps = [ "//sandbox", ] } # This target contains utility functions which must only depend on # kernel32. Please don't add dependencies on other system libraries. static_library("nt_registry") { sources = [ "../sandbox/win/src/nt_internals.h", "nt_registry/nt_registry.cc", "nt_registry/nt_registry.h", ] if (is_official_build && full_wpo_on_official == true) { # This library doen't build with WPO enabled due to a MSVC compiler bug. # TODO(pennymac|sebmarchand): Remove this once MS has fixed this compiler # bug: https://connect.microsoft.com/VisualStudio/feedback/details/3104499 configs -= [ "//build/config/compiler:default_optimization" ] configs += [ "//build/config/compiler:optimize_no_wpo" ] } libs = [ "kernel32.lib" ] } source_set("pe_image_safe") { sources = [ "pe_image_safe/pe_image_safe.cc", "pe_image_safe/pe_image_safe.h", ] } source_set("security") { sources = [ "chrome_elf_security.cc", "chrome_elf_security.h", ] deps = [ ":constants", ":nt_registry", "//chrome/install_static:install_static_util", ] } source_set("sha1") { sources = [ "sha1/sha1.cc", "sha1/sha1.h", ] } static_library("third_party_dlls") { visibility = [ ":*" ] # Only targets in this file can depend on this. sources = [ "third_party_dlls/hook.cc", "third_party_dlls/hook.h", "third_party_dlls/logs.cc", "third_party_dlls/logs.h", "third_party_dlls/main.cc", "third_party_dlls/main.h", "third_party_dlls/packed_list_file.cc", "third_party_dlls/packed_list_file.h", ] public_deps = [ ":blacklist", ":crash", ":hook_util", ":nt_registry", ":pe_image_safe", ":sha1", ":third_party_shared_defines", "//chrome/install_static:install_static_util", ] } # This source_set defines third-party-related structures and APIs used from # outside chrome_elf.dll. The APIs are exported from chrome_elf (add a # data_dep on //chrome_elf:chrome_elf), which will always be loaded before # chrome.dll. source_set("third_party_shared_defines") { sources = [ "sha1/sha1.h", "third_party_dlls/logging_api.cc", "third_party_dlls/logging_api.h", "third_party_dlls/packed_list_format.cc", "third_party_dlls/packed_list_format.h", "third_party_dlls/status_codes.cc", "third_party_dlls/status_codes.h", ] } ##------------------------------------------------------------------------------ ## tests ##------------------------------------------------------------------------------ test("chrome_elf_unittests") { output_name = "chrome_elf_unittests" sources = [ "blacklist/test/blacklist_test.cc", "chrome_elf_util_unittest.cc", "hook_util/test/hook_util_test.cc", "nt_registry/nt_registry_unittest.cc", "pe_image_safe/pe_image_safe_unittest.cc", "run_all_unittests.cc", "sha1/sha1_unittest.cc", "third_party_dlls/logs_unittest.cc", "third_party_dlls/main_unittest.cc", "third_party_dlls/main_unittest_exe.h", "third_party_dlls/packed_list_file_unittest.cc", ] include_dirs = [ "$target_gen_dir" ] deps = [ ":blacklist", ":constants", ":crash", ":hook_util", ":hook_util_test_dll", ":nt_registry", ":pe_image_safe", ":security", ":sha1", ":third_party_dlls", ":third_party_shared_defines", "//base", "//base/test:test_support", "//chrome/common:version_header", "//chrome/install_static:install_static_util", "//chrome/install_static/test:test_support", "//components/crash/content/app:test_support", "//sandbox", "//testing/gtest", ] data_deps = [ ":chrome_elf", ":main_unittest_dll_1", ":main_unittest_dll_2", ":third_party_dlls_test_exe", ] } test("chrome_elf_import_unittests") { output_name = "chrome_elf_import_unittests" sources = [ "elf_imports_unittest.cc", ] include_dirs = [ "$target_gen_dir" ] deps = [ "//base", "//base/test:test_support", "//chrome", "//chrome/install_static:install_static_util", "//chrome/install_static/test:test_support", "//testing/gtest", ] # It's not easily possible to have //chrome in data_deps without changing # the //chrome target to bundle up both initial/chrome.exe and chrome.exe. # As a workaround, explicitly include a data dep on just chrome.exe, and # add //chrome to deps above to make sure it's been built. data = [ "$root_out_dir/chrome.exe", ] data_deps = [ ":chrome_elf", ] # Don't want the test-specific dependencies to affect ChromeElfLoadSanityTest. # In particular, a few system DLLs cause user32 to be loaded, which is bad. ldflags = [ "/DELAYLOAD:advapi32.dll", "/DELAYLOAD:ole32.dll", "/DELAYLOAD:shell32.dll", "/DELAYLOAD:shlwapi.dll", "/DELAYLOAD:user32.dll", "/DELAYLOAD:winmm.dll", ] } ##------------------------------------------------------------------------------ ## tests - data_deps ##------------------------------------------------------------------------------ shared_library("hook_util_test_dll") { testonly = true sources = [ "hook_util/test/hook_util_test_dll.cc", "hook_util/test/hook_util_test_dll.h", ] } shared_library("main_unittest_dll_1") { testonly = true sources = [ "third_party_dlls/main_unittest_dll_1.cc", ] # Disable sanitizer instrumentation in the test DLLs to avoid unwanted # exports. configs -= [ "//build/config/sanitizers:default_sanitizer_flags", "//build/config:shared_library_config", ] } shared_library("main_unittest_dll_2") { testonly = true sources = [ "third_party_dlls/main_unittest_dll_2.cc", "third_party_dlls/main_unittest_dll_2.def", ] # Disable sanitizer instrumentation in the test DLLs to avoid unwanted # exports. configs -= [ "//build/config/sanitizers:default_sanitizer_flags", "//build/config:shared_library_config", ] } executable("third_party_dlls_test_exe") { testonly = true sources = [ "third_party_dlls/main_unittest_exe.cc", "third_party_dlls/main_unittest_exe.h", ] deps = [ ":third_party_dlls", "//base", "//base/test:test_support", "//build/win:default_exe_manifest", "//chrome/install_static:install_static_util", "//components/crash/content/app:crash_export_stubs", ] }