| # Copyright 2022 The Pigweed Authors |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| # use this file except in compliance with the License. You may obtain a copy of |
| # the License at |
| # |
| # https://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| # License for the specific language governing permissions and limitations under |
| # the License. |
| |
| load("//pw_build:binary_tools.bzl", "pw_elf_to_bin", "pw_elf_to_dump") |
| load("//pw_build:pigweed.bzl", "pw_linker_script") |
| |
| cc_library( |
| name = "header_test", |
| hdrs = ["header_test.h"], |
| includes = ["."], |
| ) |
| |
| pw_linker_script( |
| name = "linker_script_test", |
| defines = [ |
| "PW_BOOT_FLASH_BEGIN=0x08000200", |
| "PW_BOOT_FLASH_SIZE=1024K", |
| "PW_BOOT_HEAP_SIZE=112K", |
| "PW_BOOT_MIN_STACK_SIZE=1K", |
| "PW_BOOT_RAM_BEGIN=0x20000000", |
| "PW_BOOT_RAM_SIZE=192K", |
| "PW_BOOT_VECTOR_TABLE_BEGIN=0x08000000", |
| "PW_BOOT_VECTOR_TABLE_SIZE=1M", |
| ], |
| linker_script = "linker_script.ld", |
| deps = [ |
| ":header_test", |
| "//pw_build:must_place", |
| ], |
| ) |
| |
| # Use cc_binary to build the test to avoid duplicating the linker script in the |
| # command line via implicit deps in pw_cc_binary. |
| cc_binary( |
| name = "test_linker_script", |
| srcs = ["test.cc"], |
| copts = ["-Wno-unused-variable"], |
| # Only compatible with platforms that support linker scripts. |
| # This test and its siblings will not link with asan: |
| # ld.lld: error: section '.text' will not fit in region 'VECTOR_TABLE': overflowed by 319296 bytes |
| # ld.lld: error: section '.init' will not fit in region 'VECTOR_TABLE': overflowed by 319319 bytes |
| # ld.lld: error: section '.fini' will not fit in region 'VECTOR_TABLE': overflowed by 319329 bytes |
| # ld.lld: error: section '.plt' will not fit in region 'VECTOR_TABLE': overflowed by 320096 bytes |
| # ld.lld: error: section '.bss' will not fit in region 'RAM': overflowed by 10135216 bytes |
| target_compatible_with = select({ |
| "//pw_toolchain/host_clang:asan_enabled": ["@platforms//:incompatible"], |
| "@platforms//os:linux": [], |
| "//conditions:default": ["@platforms//:incompatible"], |
| }), |
| deps = [":linker_script_test"], |
| ) |
| |
| # Use cc_library to depend on the linker script, and then use cc_binary to build |
| # the test, verifying that linker scripts can be included via transitive deps. |
| cc_library( |
| name = "lib_linker_script", |
| deps = [":linker_script_test"], |
| ) |
| |
| cc_binary( |
| name = "test_transitive_linker_script", |
| srcs = ["test.cc"], |
| copts = ["-Wno-unused-variable"], |
| # Only compatible with platforms that support linker scripts. |
| target_compatible_with = select({ |
| "//pw_toolchain/host_clang:asan_enabled": ["@platforms//:incompatible"], |
| "@platforms//os:linux": [], |
| "//conditions:default": ["@platforms//:incompatible"], |
| }), |
| deps = [":lib_linker_script"], |
| ) |
| |
| # Verify that the linker script can also be specified directly. |
| cc_binary( |
| name = "test_direct_linker_script", |
| srcs = ["test.cc"], |
| additional_linker_inputs = [":linker_script_test"], |
| copts = ["-Wno-unused-variable"], |
| linkopts = ["-T $(location :linker_script_test)"], |
| # Only compatible with platforms that support linker scripts. |
| target_compatible_with = select({ |
| "//pw_toolchain/host_clang:asan_enabled": ["@platforms//:incompatible"], |
| "@platforms//os:linux": [], |
| "//conditions:default": ["@platforms//:incompatible"], |
| }), |
| ) |
| |
| pw_elf_to_bin( |
| name = "test_bin", |
| bin_out = "test.bin", |
| elf_input = ":test_linker_script", |
| ) |
| |
| pw_elf_to_dump( |
| name = "test_dump", |
| dump_out = "test.dump", |
| elf_input = ":test_linker_script", |
| ) |