123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 |
- /* SPDX-License-Identifier: GPL-2.0+ */
- /*
- * (C) Copyright 2007 Tensilica, Inc.
- * (C) Copyright 2014 - 2016 Cadence Design Systems Inc.
- */
- #ifndef _XTENSA_LDSCRIPT_H
- #define _XTENSA_LDSCRIPT_H
- /*
- * This linker script is pre-processed with CPP to avoid hard-coding
- * addresses that depend on the Xtensa core configuration, because
- * this FPGA board can be used with a huge variety of Xtensa cores.
- */
- #include <asm/arch/core.h>
- #include <asm/addrspace.h>
- #define ALIGN_LMA 4
- #define LMA_EQ_VMA
- #define FORCE_OUTPUT . = .
- #define FOLLOWING(sec) \
- AT(((LOADADDR(sec) + SIZEOF(sec) + ALIGN_LMA-1)) & ~(ALIGN_LMA-1))
- /*
- * Specify an output section that will be added to the ROM store table
- * (PACKED_SECTION) or one that will be resident in ROM (RESIDENT_SECTION).
- * 'symname' is a base name for section boundary symbols *_start & *_end.
- * 'lma' is the load address at which a section will be packed in ROM.
- * 'region' is the basename identifying a memory region and program header.
- * 'keep' prevents removal of empty sections (must be 'KEEP' or 'NOKEEP').
- */
- #define RELOCATE1(_sec_) \
- LONG(_##_sec_##_start); \
- LONG(_##_sec_##_end); \
- LONG(LOADADDR(.##_sec_));
- #define RELOCATE2(_sym_, _sec_) \
- LONG(_##_sym_##_##_sec_##_start); \
- LONG(_##_sym_##_##_sec_##_end); \
- LONG(LOADADDR(.##_sym_##.##_sec_));
- #define SECTION_VECTOR(_sym_, _sec_, _vma_, _lma_) \
- .##_sym_##.##_sec_ _vma_ : _lma_ \
- { \
- . = ALIGN(4); \
- _##_sym_##_##_sec_##_start = ABSOLUTE(.); \
- KEEP(*(.##_sym_##.##_sec_)) \
- _##_sym_##_##_sec_##_end = ABSOLUTE(.); \
- }
- /* In MMU configs there are two aliases of SYSROM, cached and uncached.
- * For various reasons it is simpler to use the uncached mapping for load
- * addresses, so ROM sections end up contiguous with the reset vector and
- * we get a compact binary image. However we can gain performance by doing
- * the unpacking from the cached ROM mapping. So we adjust all the load
- * addresses in the ROM store table with an offset to the cached mapping,
- * including the symbols referring to the ROM store table itself.
- */
- #define SECTION_ResetVector(_vma_, _lma_) \
- .ResetVector.text _vma_ : _lma_ \
- { \
- FORCE_OUTPUT; \
- KEEP(*(.ResetVector.text)); \
- KEEP(*(.reset.literal .reset.text)) \
- }
- #define SECTION_text(_vma_, _lma_) \
- .text _vma_ : _lma_ \
- { \
- _text_start = ABSOLUTE(.); \
- *(.literal .text) \
- *(.literal.* .text.* .stub) \
- *(.gnu.warning .gnu.linkonce.literal.*) \
- *(.gnu.linkonce.t.*.literal .gnu.linkonce.t.*) \
- *(.fini.literal) \
- *(.fini) \
- *(.gnu.version) \
- _text_end = ABSOLUTE(.); \
- }
- #define SECTION_rodata(_vma_, _lma_) \
- .rodata _vma_ : _lma_ \
- { \
- _rodata_start = ABSOLUTE(.); \
- *(.rodata) \
- *(.rodata.*) \
- *(.dtb.init.rodata) \
- *(.gnu.linkonce.r.*) \
- *(.rodata1) \
- __XT_EXCEPTION_TABLE__ = ABSOLUTE(.); \
- *(.xt_except_table) \
- *(.gcc_except_table) \
- *(.gnu.linkonce.e.*) \
- *(.gnu.version_r) \
- . = ALIGN(16); \
- _rodata_end = ABSOLUTE(.); \
- }
- #define SECTION_u_boot_list(_vma_, _lma_) \
- .u_boot_list _vma_ : _lma_ \
- { \
- _u_boot_list_start = ABSOLUTE(.); \
- KEEP(*(SORT(.u_boot_list*))); \
- _u_boot_list_end = ABSOLUTE(.); \
- }
- #define SECTION_data(_vma_, _lma_) \
- .data _vma_ : _lma_ \
- { \
- _data_start = ABSOLUTE(.); \
- *(.data) \
- *(.data.*) \
- *(.gnu.linkonce.d.*) \
- *(.data1) \
- *(.sdata) \
- *(.sdata.*) \
- *(.gnu.linkonce.s.*) \
- *(.sdata2) \
- *(.sdata2.*) \
- *(.gnu.linkonce.s2.*) \
- *(.jcr) \
- *(.eh_frame) \
- *(.dynamic) \
- *(.gnu.version_d) \
- _data_end = ABSOLUTE(.); \
- }
- #define SECTION_lit4(_vma_, _lma_) \
- .lit4 _vma_ : _lma_ \
- { \
- _lit4_start = ABSOLUTE(.); \
- *(*.lit4) \
- *(.gnu.linkonce.lit4.*) \
- _lit4_end = ABSOLUTE(.); \
- }
- #define SECTION_bss(_vma_, _lma_) \
- .bss _vma_ : _lma_ \
- { \
- . = ALIGN(8); \
- _bss_start = ABSOLUTE(.); \
- __bss_start = ABSOLUTE(.); \
- *(.dynsbss) \
- *(.sbss) \
- *(.sbss.*) \
- *(.gnu.linkonce.sb.*) \
- *(.scommon) \
- *(.sbss2) \
- *(.sbss2.*) \
- *(.gnu.linkonce.sb2.*) \
- *(.dynbss) \
- *(.bss) \
- *(.bss.*) \
- *(.gnu.linkonce.b.*) \
- *(COMMON) \
- *(.sram.bss) \
- . = ALIGN(8); \
- _bss_end = ABSOLUTE(.); \
- __bss_end = ABSOLUTE(.); \
- _end = ALIGN(0x8); \
- PROVIDE(end = ALIGN(0x8)); \
- _stack_sentry = ALIGN(0x8); \
- }
- #define SECTION_debug \
- .debug 0 : { *(.debug) } \
- .line 0 : { *(.line) } \
- .debug_srcinfo 0 : { *(.debug_srcinfo) } \
- .debug_sfnames 0 : { *(.debug_sfnames) } \
- .debug_aranges 0 : { *(.debug_aranges) } \
- .debug_pubnames 0 : { *(.debug_pubnames) } \
- .debug_info 0 : { *(.debug_info) } \
- .debug_abbrev 0 : { *(.debug_abbrev) } \
- .debug_line 0 : { *(.debug_line) } \
- .debug_frame 0 : { *(.debug_frame) } \
- .debug_str 0 : { *(.debug_str) } \
- .debug_loc 0 : { *(.debug_loc) } \
- .debug_macinfo 0 : { *(.debug_macinfo) } \
- .debug_weaknames 0 : { *(.debug_weaknames) } \
- .debug_funcnames 0 : { *(.debug_funcnames) } \
- .debug_typenames 0 : { *(.debug_typenames) } \
- .debug_varnames 0 : { *(.debug_varnames) }
- #define SECTION_xtensa \
- .xt.insn 0 : \
- { \
- KEEP (*(.xt.insn)) \
- KEEP (*(.gnu.linkonce.x.*)) \
- } \
- .xt.prop 0 : \
- { \
- KEEP (*(.xt.prop)) \
- KEEP (*(.xt.prop.*)) \
- KEEP (*(.gnu.linkonce.prop.*)) \
- } \
- .xt.lit 0 : \
- { \
- KEEP (*(.xt.lit)) \
- KEEP (*(.xt.lit.*)) \
- KEEP (*(.gnu.linkonce.p.*)) \
- } \
- .xt.profile_range 0 : \
- { \
- KEEP (*(.xt.profile_range)) \
- KEEP (*(.gnu.linkonce.profile_range.*)) \
- } \
- .xt.profile_ranges 0 : \
- { \
- KEEP (*(.xt.profile_ranges)) \
- KEEP (*(.gnu.linkonce.xt.profile_ranges.*)) \
- } \
- .xt.profile_files 0 : \
- { \
- KEEP (*(.xt.profile_files)) \
- KEEP (*(.gnu.linkonce.xt.profile_files.*)) \
- }
- #endif /* _XTENSA_LDSCRIPT_H */
|