chromium/chrome/chrome_elf/BUILD.gn

# Copyright 2015 The Chromium Authors
# 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 if (target_cpu == "arm64") {
    sources += [ "chrome_elf_arm64.def" ]
  } else {
    sources += [ "chrome_elf_x64.def" ]
  }

  deps = [
    ":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/core/app:crash_export_thunks",
  ]

  configs += [ "//build/config/win:windowed" ]
  configs -= [ "//build/config/win:console" ]

  configs += [
    "//build/config/win:delayloads",
    "//build/config/win:delayloads_not_for_child_dll",
  ]

  if (current_cpu == "x86") {
    # Don"t set an x64 base address (to avoid breaking HE-ASLR).
    ldflags = [ "/BASE:0x01c20000" ]
  }
}

##------------------------------------------------------------------------------
## chrome_elf sub targets
##------------------------------------------------------------------------------

source_set("constants") {
  sources = [
    "blocklist_constants.cc",
    "blocklist_constants.h",
    "chrome_elf_constants.cc",
    "chrome_elf_constants.h",
  ]
}

static_library("crash") {
  sources = [
    "../app/chrome_crash_reporter_client_win.cc",
    "../app/chrome_crash_reporter_client_win.h",
    "../common/chrome_result_codes.h",
    "crash/crash_helper.cc",
    "crash/crash_helper.h",
  ]
  deps = [
    ":constants",
    ":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/core/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 = [
    "hook_util/hook_util.cc",
    "hook_util/hook_util.h",
  ]
  deps = [
    "//base:base_static",  # pe_image
  ]
}

# This target contains utility functions which must only depend on
# kernel32 or ntdll. Please don't add dependencies on other system libraries.
static_library("nt_registry") {
  sources = [
    "nt_registry/nt_registry.cc",
    "nt_registry/nt_registry.h",
    "nt_registry/nt_registry_functions.h",
  ]

  libs = [
    "kernel32.lib",
    "ntdll.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",
    "//base:base",
    "//chrome/install_static:install_static_util",
  ]
}

source_set("sha1") {
  sources = [
    "sha1/sha1.cc",
    "sha1/sha1.h",
  ]
}

source_set("third_party_dlls") {
  visibility = [ ":*" ]  # Only targets in this file can depend on this.
  sources = [
    "third_party_dlls/beacon.cc",
    "third_party_dlls/beacon.h",
    "third_party_dlls/hardcoded_blocklist.cc",
    "third_party_dlls/hardcoded_blocklist.h",
    "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",
  ]
  deps = [
    "//base:base_static",
    "//sandbox/win:service_resolver",
  ]
  public_deps = [
    ":constants",
    ":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/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/packed_list_format.cc",
    "third_party_dlls/packed_list_format.h",
    "third_party_dlls/public_api.cc",
    "third_party_dlls/public_api.h",
    "third_party_dlls/status_codes.cc",
    "third_party_dlls/status_codes.h",
  ]
}

##------------------------------------------------------------------------------
## tests
##------------------------------------------------------------------------------

test("chrome_elf_unittests") {
  output_name = "chrome_elf_unittests"
  sources = [
    "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/beacon_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 = [
    ":chrome_elf",
    ":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/core/app:test_support",
    "//testing/gtest",
  ]
  data_deps = [
    ":chrome_elf",
    ":main_unittest_dll_1",
    ":main_unittest_dll_2",
    ":third_party_dlls_test_exe",
  ]
}

##------------------------------------------------------------------------------
## 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.
  no_default_deps = true
  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.
  no_default_deps = true
  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/core/app:crash_export_stubs",
  ]
}