LCOV - code coverage report
Current view: top level - zephyr/linker - linker-tool-gcc.h Coverage Total Hit
Test: new.info Lines: 70.0 % 10 7
Test Date: 2025-09-05 16:43:28

            Line data    Source code
       1            1 : /*
       2              :  * Copyright (c) 2013-2014, Wind River Systems, Inc.
       3              :  *
       4              :  * SPDX-License-Identifier: Apache-2.0
       5              :  */
       6              : 
       7              : /**
       8              :  * @file
       9              :  * @brief GCC toolchain linker defs
      10              :  *
      11              :  * This header file defines the necessary macros used by the linker script for
      12              :  * use with the GCC linker.
      13              :  */
      14              : 
      15              : #ifndef ZEPHYR_INCLUDE_LINKER_LINKER_TOOL_GCC_H_
      16              : #define ZEPHYR_INCLUDE_LINKER_LINKER_TOOL_GCC_H_
      17              : 
      18              : #include <zephyr/kernel/mm.h>
      19              : 
      20              : #if defined(CONFIG_ARM)
      21              :         #if defined(CONFIG_BIG_ENDIAN)
      22              :                 #define OUTPUT_FORMAT_ "elf32-bigarm"
      23              :         #else
      24              :                 #define OUTPUT_FORMAT_ "elf32-littlearm"
      25              :         #endif
      26              :         OUTPUT_FORMAT(OUTPUT_FORMAT_)
      27              : #elif defined(CONFIG_ARM64)
      28              :         OUTPUT_FORMAT("elf64-littleaarch64")
      29              : #elif defined(CONFIG_ARC)
      30              :         #if defined(CONFIG_ISA_ARCV3) && defined(CONFIG_64BIT)
      31              :                 OUTPUT_FORMAT("elf64-littlearc64")
      32              :         #elif defined(CONFIG_ISA_ARCV3) && !defined(CONFIG_64BIT)
      33              :                 OUTPUT_FORMAT("elf32-littlearc64")
      34              :         #else
      35              :                 OUTPUT_FORMAT("elf32-littlearc", "elf32-bigarc", "elf32-littlearc")
      36              :         #endif
      37              : #elif defined(CONFIG_X86)
      38              :         #if defined(CONFIG_X86_64)
      39              :                 OUTPUT_FORMAT("elf64-x86-64")
      40              :                 OUTPUT_ARCH("i386:x86-64")
      41              :         #else
      42              :                 OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
      43              :                 OUTPUT_ARCH("i386")
      44              :         #endif
      45              : #elif defined(CONFIG_RISCV)
      46              :         OUTPUT_ARCH("riscv")
      47              : #ifdef CONFIG_64BIT
      48              :         OUTPUT_FORMAT("elf64-littleriscv")
      49              : #else
      50              :         OUTPUT_FORMAT("elf32-littleriscv")
      51              : #endif
      52              : #elif defined(CONFIG_XTENSA)
      53              :         /* Not needed */
      54              : #elif defined(CONFIG_MIPS)
      55              :         OUTPUT_ARCH("mips")
      56              : #elif defined(CONFIG_ARCH_POSIX)
      57              :         /* Not needed */
      58              : #elif defined(CONFIG_SPARC)
      59              :         OUTPUT_FORMAT("elf32-sparc")
      60              : #elif defined(CONFIG_RX)
      61              :         OUTPUT_FORMAT("elf32-rx-le")
      62              : #else
      63              :         #error Arch not supported.
      64              : #endif
      65              : 
      66              : /*
      67              :  * The GROUP_START() and GROUP_END() macros are used to define a group
      68              :  * of sections located in one memory area, such as RAM, ROM, etc.
      69              :  * The <where> parameter is the name of the memory area.
      70              :  */
      71            0 : #define GROUP_START(where)
      72            0 : #define GROUP_END(where)
      73              : 
      74              : /**
      75              :  * @def GROUP_LINK_IN
      76              :  *
      77              :  * Route memory to a specified memory area
      78              :  *
      79              :  * The GROUP_LINK_IN() macro is located at the end of the section
      80              :  * description and tells the linker that this section is located in
      81              :  * the memory area specified by 'where' argument.
      82              :  *
      83              :  * This macro is intentionally undefined for CONFIG_MMU systems when
      84              :  * CONFIG_KERNEL_VM_BASE is not the same as CONFIG_SRAM_BASE_ADDRESS,
      85              :  * as both the LMA and VMA destinations must be known for all sections
      86              :  * as this corresponds to physical vs. virtual location.
      87              :  *
      88              :  * @param where Destination memory area
      89              :  */
      90              : #if defined(CONFIG_ARCH_POSIX)
      91              : #define GROUP_LINK_IN(where)
      92              : #elif !defined(K_MEM_IS_VM_KERNEL)
      93            1 : #define GROUP_LINK_IN(where) > where
      94              : #endif
      95              : 
      96              : /**
      97              :  * @def GROUP_ROM_LINK_IN
      98              :  *
      99              :  * Route memory for a read-only section
     100              :  *
     101              :  * The GROUP_ROM_LINK_IN() macro is located at the end of the section
     102              :  * description and tells the linker that this a read-only section
     103              :  * that is physically placed at the 'lregion` argument.
     104              :  *
     105              :  * If CONFIG_XIP is active, the 'lregion' area is flash memory.
     106              :  *
     107              :  * If CONFIG_MMU is active, the vregion argument will be used to
     108              :  * determine where this is located in the virtual memory map, otherwise
     109              :  * it is ignored.
     110              :  *
     111              :  * @param vregion Output VMA (only used if CONFIG_MMU where LMA != VMA)
     112              :  * @param lregion Output LMA
     113              :  */
     114              : #if defined(CONFIG_ARCH_POSIX)
     115              : #define GROUP_ROM_LINK_IN(vregion, lregion)
     116              : #elif defined(K_MEM_IS_VM_KERNEL)
     117              : #define GROUP_ROM_LINK_IN(vregion, lregion) > vregion AT > lregion
     118              : #else
     119            1 : #define GROUP_ROM_LINK_IN(vregion, lregion) > lregion
     120              : #endif
     121              : 
     122              : /**
     123              :  * @def GROUP_DATA_LINK_IN
     124              :  *
     125              :  * Route memory for read-write sections that are loaded.
     126              :  *
     127              :  * Used for initialized data sections that on XIP platforms must be copied at
     128              :  * startup.
     129              :  *
     130              :  * @param vregion Output VMA
     131              :  * @param lregion Output LMA (only used if CONFIG_MMU if VMA != LMA,
     132              :  *                or CONFIG_XIP)
     133              :  */
     134              : #if defined(CONFIG_ARCH_POSIX)
     135              : #define GROUP_DATA_LINK_IN(vregion, lregion)
     136              : #elif defined(CONFIG_XIP) || defined(K_MEM_IS_VM_KERNEL)
     137              : #define GROUP_DATA_LINK_IN(vregion, lregion) > vregion AT > lregion
     138              : #else
     139            1 : #define GROUP_DATA_LINK_IN(vregion, lregion) > vregion
     140              : #endif
     141              : 
     142              : /**
     143              :  * @def GROUP_NOLOAD_LINK_IN
     144              :  *
     145              :  * Route memory for read-write sections that are NOT loaded; typically this
     146              :  * is only used for 'BSS' and 'noinit'.
     147              :  *
     148              :  * @param vregion Output VMA
     149              :  * @param lregion Output LMA (only used if CONFIG_MMU if VMA != LMA,
     150              :  *                corresponds to physical location)
     151              :  */
     152              : #if defined(CONFIG_ARCH_POSIX)
     153              : #define GROUP_NOLOAD_LINK_IN(vregion, lregion)
     154              : #elif defined(K_MEM_IS_VM_KERNEL)
     155              : #define GROUP_NOLOAD_LINK_IN(vregion, lregion) > vregion AT > lregion
     156              : #elif defined(CONFIG_XIP)
     157              : #define GROUP_NOLOAD_LINK_IN(vregion, lregion) > vregion AT > vregion
     158              : #else
     159            1 : #define GROUP_NOLOAD_LINK_IN(vregion, lregion) > vregion
     160              : #endif
     161              : 
     162              : /**
     163              :  * @def SECTION_PROLOGUE
     164              :  *
     165              :  * The SECTION_PROLOGUE() macro is used to define the beginning of a section.
     166              :  *
     167              :  * On MMU systems where VMA != LMA there is an implicit ALIGN_WITH_INPUT
     168              :  * specified.
     169              :  *
     170              :  * @param name Name of the output section
     171              :  * @param options Section options, such as (NOLOAD), or left blank
     172              :  * @param align Alignment directives, such as SUBALIGN(). ALIGN() itself is
     173              :  *              not allowed. May be blank.
     174              :  */
     175              : #ifdef K_MEM_IS_VM_KERNEL
     176              : /* If we have a virtual memory map we need ALIGN_WITH_INPUT in all sections */
     177              : #define SECTION_PROLOGUE(name, options, align) \
     178              :         name options : ALIGN_WITH_INPUT align
     179              : #else
     180            1 : #define SECTION_PROLOGUE(name, options, align) \
     181              :         name options : align
     182              : #endif
     183              : 
     184              : /**
     185              :  * @def SECTION_DATA_PROLOGUE
     186              :  *
     187              :  * Same as for SECTION_PROLOGUE(), except that this one must be used
     188              :  * for data sections which on XIP platforms will have differing
     189              :  * virtual and load addresses (i.e. they'll be copied into RAM at
     190              :  * program startup).  Such a section must also use
     191              :  * GROUP_DATA_LINK_IN to specify the correct output load address.
     192              :  *
     193              :  * This is equivalent to SECTION_PROLOGUE() on non-XIP systems.
     194              :  * On XIP systems there is an implicit ALIGN_WITH_INPUT specified.
     195              :  *
     196              :  * @param name Name of the output section
     197              :  * @param options Section options, or left blank
     198              :  * @param align Alignment directives, such as SUBALIGN(). ALIGN() itself is
     199              :  *              not allowed. May be blank.
     200              :  */
     201              : #if defined(CONFIG_XIP)
     202              : #define SECTION_DATA_PROLOGUE(name, options, align) \
     203              :         name options : ALIGN_WITH_INPUT
     204              : #else
     205            1 : #define SECTION_DATA_PROLOGUE(name, options, align) \
     206              :         SECTION_PROLOGUE(name, options, align)
     207              : #endif
     208              : 
     209            0 : #define COMMON_SYMBOLS *(COMMON)
     210              : 
     211              : #endif /* ZEPHYR_INCLUDE_LINKER_LINKER_TOOL_GCC_H_ */
        

Generated by: LCOV version 2.0-1