| /* Copyright lowRISC contributors. */ |
| /* Licensed under the Apache License, Version 2.0, see LICENSE for details. */ |
| /* SPDX-License-Identifier: Apache-2.0 */ |
| |
| /** |
| * Partial Linker Script for OpenTitan Device Executables |
| * |
| * This Linker Script controls all the sections that we need in the ELF file for |
| * a device executable, but which are not mapped into memory or otherwise |
| * allocated on the device itself. |
| * |
| * These contain amongst other things: |
| * - debugging information needed by DV logging, |
| * - DWARF Sections |
| * - RISC-V Attributes sections |
| * |
| * This is also where we specify the sections to discard, because it is a common |
| * file between all our other linker scripts. |
| * |
| * This partial linker script requires the main linker script to define the |
| * following symbols: |
| * - _dv_log_offset |
| */ |
| |
| /* |
| * Start DV Sections. |
| * |
| * The following sections are used by DV to implement logging in an |
| * alternate way, which enables simulation speed up by completely avoiding |
| * any string format processing or even the actual transmission of log data |
| * to a real peripheral. |
| * |
| * These sections are marked as dummy so that they can still be extracted |
| * using readelf or similar utilities. As such, the content in these sections |
| * is not relevant for the actual SW code and can be safely discarded. |
| */ |
| |
| /** |
| * The following section contains log fields constructed from the logs using |
| * the log_fields_t struct defined in sw/device/lib/runtime/log.h. The size of |
| * each log field is fixed - 20 bytes. |
| */ |
| .logs.fields _dv_log_offset (INFO): { |
| /* Force this section to always be emitted. The logs extraction script expects |
| * this section to be present in the ELF file, but the linker will not emit it |
| * if there are no outputs (i.e, the *(.logs.fields) statement) with contents. |
| * |
| * However, almost any assignment will implicitly create even an empty section, |
| * including the very silly . = . (set the program counter to itself). |
| * |
| * See https://sourceware.org/binutils/docs-2.29/ld/Output-Section-Discarding.html. */ |
| . = .; |
| *(.logs.fields) |
| } |
| |
| /* |
| * End DV Sections |
| */ |
| |
| /* ELF-internal Sections. */ |
| .symtab 0x0 : { *(.symtab) } |
| .strtab 0x0 : { *(.strtab) } |
| .shstrtab 0x0 : { *(.shstrtab) } |
| |
| /* Preserve RISC-V Attributes */ |
| .riscv.attributes 0x0 : { *(.riscv.attributes) } |
| |
| /* Preserve Debug Info in ELF Files */ |
| .debug_info 0x0 : { *(.debug_info) } |
| .debug_abbrev 0x0 : { *(.debug_abbrev) } |
| .debug_aranges 0x0 : { *(.debug_aranges) } |
| .debug_line 0x0 : { *(.debug_line) } |
| .debug_loc 0x0 : { *(.debug_loc) } |
| .debug_ranges 0x0 : { *(.debug_ranges) } |
| .debug_str 0x0 : { *(.debug_str) } |
| .debug_frame 0x0 : { *(.debug_frame) } |
| .debug_line_str 0x0 : { *(.debug_line_str) } |
| .debug_loclists 0x0 : { *(.debug_loclists) } |
| .debug_rnglists 0x0 : { *(.debug_rnglists) } |
| .debug_addr 0x0 : { *(.debug_addr) } |
| .debug_str_offsets 0x0 : { *(.debug_str_offsets) } |
| |
| /* Discarded Sections (Not needed in device images). */ |
| /DISCARD/ : { |
| /* We don't keep unwind information */ |
| *(.eh_frame) |
| *(.eh_frame_hdr) |
| |
| /* Compiler Information */ |
| *(.comment) |
| *(.comment.*) |
| |
| /* Other Notes */ |
| *(.note) |
| *(.note.*) |
| |
| /* Relocations */ |
| *(.rela.*) |
| *(.rela.dyn) |
| |
| /* STAB Debugging Info - We Use DWARF */ |
| *(.stab) |
| *(.stab.*) |
| *(.stabstr) |
| |
| /* COMMON Sections */ |
| *(COMMON) |
| } |