blob: 81a7ac789f0d598c7f3a13d1c94dc32d873fc98b [file] [log] [blame]
/* 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)
}