| /* 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) | 
 | } |