# Copyright 2018 The Fuchsia 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/components.gni")
import("//build/cpp/sdk_static_library.gni")
import("//build/fuzz.gni")
import("//build/test.gni")

# A collection of utilities useful to debuggers and similar programs.

sdk_static_library("elflib") {
  category = "internal"

  sources = [ "elflib.cc" ]

  public = [ "elflib.h" ]

  deps = [ "//zircon/system/public" ]

  public_deps = [ "//zircon/system/ulib/fbl" ]

  # TODO(https://fxbug.dev/42136089): delete the below and fix compiler warnings
  configs += [ "//build/config:Wno-conversion" ]

  public_configs = [ "//src/lib/llvm:LLVMHeader_config" ]
}

test("elflib_unittest") {
  sources = [ "elflib_unittest.cc" ]

  deps = [
    ":elflib",
    ":test_data",
    "//src/lib/fxl/test:gtest_main",
    "//third_party/googletest:gtest",
  ]

  # TODO(https://fxbug.dev/42136089): delete the below and fix compiler warnings
  configs += [ "//build/config:Wno-conversion" ]
}

_test_data_sources = [
  "test_data/6d4d8ac190ecc7.debug",
  "test_data/stripped_example.elf",
]

# An example stripped binary:
# ```
# #include <stdio.h>
# #include <string.h>
# int main(int argc, char** argv) {
#   printf("%zu\n", strlen(argv[0]));
#   return 0;
# }
# ```
# Built with:
# clang -Wl,-z,{rela,rel} --target={aarch64,x86_64}-fuchsia --sysroot=...
# llvm-objcopy --strip-sections \
#   unstripped_example.{arm64,x64}.{rela,rel}.elf \
#   unstripped_example_stripped.{arm64,x64}.{rela,rel}.elf
foreach(cpu,
        [
          "arm64",
          "x64",
        ]) {
  foreach(rel,
          [
            "rela",
            "rel",
          ]) {
    _test_data_sources += [
      "test_data/unstripped_example.$cpu.$rel.elf",
      "test_data/unstripped_example_stripped.$cpu.$rel.elf",
    ]
  }
}

if (is_host) {
  host_test_data("test_data") {
    sources = _test_data_sources
  }
} else {
  resource("test_data") {
    testonly = true
    sources = _test_data_sources
    outputs = [ "data/{{source_file_part}}" ]
  }
}

fuchsia_unittest_package("elflib_tests") {
  deps = [ ":elflib_unittest" ]
}

group("tests") {
  testonly = true

  deps = [
    ":elflib-fuzzers",
    ":elflib_tests",
    ":elflib_unittest($host_toolchain)",
  ]
}

fuchsia_library_fuzzer("elflib_fuzzer") {
  sources = [ "elflib_fuzztest.cc" ]
  deps = [ ":elflib" ]

  # TODO(https://fxbug.dev/42136089): delete the below and fix compiler warnings
  configs += [ "//build/config:Wno-conversion" ]
}

fuchsia_fuzzer_component("elflib-fuzzer-component") {
  manifest = "meta/elflib_fuzzer.cml"
  deps = [
    ":elflib_fuzzer",
    ":test_data",
  ]
}

fuchsia_fuzzer_package("elflib-fuzzers") {
  cpp_fuzzer_components = [ ":elflib-fuzzer-component" ]
}
