| # Copyright lowRISC contributors. |
| # Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| # SPDX-License-Identifier: Apache-2.0 |
| |
| # RISC-V linker parameters. |
| riscv_linker_script = '@0@/@1@'.format(meson.source_root(), files(['flash_link.ld'])[0]) |
| riscv_linker_args = [ |
| # The linker script includes an autogenerated definition of the available |
| # memory regions. The include path is given relative to the source root, so we |
| # need to add the source root to the linker lookup path (which is the same for |
| # libraries and linker scripts. |
| '-Wl,-L,@0@'.format(meson.source_root()), |
| '-Wl,-T,@0@'.format(riscv_linker_script), |
| # Depending on the compiler and its configuration (*), |--build-id| is passed |
| # to the linker, causing the insertion of a ".note.gnu.build-id" section into |
| # the ELF file. We do not use the build ID. Achieve consistent behavior and |
| # potentially a small improvement in linking time by not computing the build |
| # ID in the first place. |
| # |
| # * GCC built with |--enable-linker-build-id|, clang before 3.9 or built with |
| # |-DENABLE_LINKER_BUILD_ID|. |
| '-Wl,--build-id=none', |
| ] |
| |
| # RISC-V startup library. Every RISC-V executable should depend on this target. |
| # |
| # The crt defines the interrupt vector, so requires definitions for all the |
| # declarations in `sw/device/lib/handler.h`. |
| riscv_crt = declare_dependency( |
| link_args: riscv_linker_args, |
| # The following assembly files need to be included as a source, not a |
| # static library, so that their custom sections can be picked up when |
| # linking. |
| sources: [ |
| # This contains the contents of the `.crt` section which does the initial |
| # setup before jumping to `main`. |
| 'flash_crt.S', |
| # This contains the interrupt vector definition, as used by the crt to |
| # initialize mtvec. |
| 'ibex_interrupt_vectors.S', |
| ], |
| dependencies: [ |
| freestanding_headers, |
| sw_lib_crt, |
| sw_lib_mem, |
| sw_lib_irq, |
| top_earlgrey, |
| ], |
| # This argument exists solely so that Meson realizes that riscv_linker_script |
| # is part of the dependency graph. This seems to be the only way to convince |
| # Meson to behave in this way, for the following reasons: |
| # - The dependencies arg can only include artifacts from declare_dependency(). |
| # - We can't put linker scripts into the sources list, since Meson has no |
| # clue how to deal with them. |
| # - custom_target() doesn't help, because we can't convince Meson to depend on |
| # a custom_target() unless it produces source files. |
| # - If we go with static_library, sources needs to be non-empty in order for |
| # Meson to correctly treat it as a cross-compile target (otherwise, we get |
| # linker errors). This is because Meson guesses the type of a target based |
| # off of the file extensions of the source files. |
| link_with: static_library( |
| 'riscv_linker_script_dep_shim', |
| sources: ['empty.c'], |
| link_depends: [riscv_linker_script], |
| ) |
| ) |