diff --git a/arch/x86/soc/atom/linker.ld b/arch/x86/soc/atom/linker.ld index 654bfbe3562..e51f1e5b287 100644 --- a/arch/x86/soc/atom/linker.ld +++ b/arch/x86/soc/atom/linker.ld @@ -51,9 +51,5 @@ MEMORY IDT_LIST : ORIGIN = 2K, LENGTH = 2K } -#include +#include -/* start adding platform specific linker sections here */ - -/* no sections should appear after linker-epilog.h */ -#include diff --git a/arch/x86/soc/ia32/linker.ld b/arch/x86/soc/ia32/linker.ld index 654bfbe3562..e51f1e5b287 100644 --- a/arch/x86/soc/ia32/linker.ld +++ b/arch/x86/soc/ia32/linker.ld @@ -51,9 +51,5 @@ MEMORY IDT_LIST : ORIGIN = 2K, LENGTH = 2K } -#include +#include -/* start adding platform specific linker sections here */ - -/* no sections should appear after linker-epilog.h */ -#include diff --git a/arch/x86/soc/intel_quark/quark_d2000/linker.ld b/arch/x86/soc/intel_quark/quark_d2000/linker.ld index bb2a2052053..2da291ad496 100644 --- a/arch/x86/soc/intel_quark/quark_d2000/linker.ld +++ b/arch/x86/soc/intel_quark/quark_d2000/linker.ld @@ -51,9 +51,5 @@ MEMORY IDT_LIST : ORIGIN = 512, LENGTH = 512 } -#include +#include -/* start adding bsp specific linker sections here */ - -/* no sections should appear after linker-epilog.h */ -#include diff --git a/arch/x86/soc/intel_quark/quark_se/linker.ld b/arch/x86/soc/intel_quark/quark_se/linker.ld index 321d448df8d..8970363bed1 100644 --- a/arch/x86/soc/intel_quark/quark_se/linker.ld +++ b/arch/x86/soc/intel_quark/quark_se/linker.ld @@ -52,9 +52,5 @@ MEMORY IDT_LIST : ORIGIN = 2K, LENGTH = 2K } -#include +#include -/* start adding bsp specific linker sections here */ - -/* no sections should appear after linker-epilog.h */ -#include diff --git a/arch/x86/soc/intel_quark/quark_x1000/linker.ld b/arch/x86/soc/intel_quark/quark_x1000/linker.ld index 654bfbe3562..e51f1e5b287 100644 --- a/arch/x86/soc/intel_quark/quark_x1000/linker.ld +++ b/arch/x86/soc/intel_quark/quark_x1000/linker.ld @@ -51,9 +51,5 @@ MEMORY IDT_LIST : ORIGIN = 2K, LENGTH = 2K } -#include +#include -/* start adding platform specific linker sections here */ - -/* no sections should appear after linker-epilog.h */ -#include diff --git a/include/arch/arc/v2/linker.ld b/include/arch/arc/v2/linker.ld index 34d8d603c02..5b46cab6318 100644 --- a/include/arch/arc/v2/linker.ld +++ b/include/arch/arc/v2/linker.ld @@ -111,39 +111,7 @@ SECTIONS { _image_text_end = .; } GROUP_LINK_IN(ROMABLE_REGION) - SECTION_PROLOGUE (devconfig, (OPTIONAL),) - { - __devconfig_start = .; - *(".devconfig.*") - KEEP(*(SORT_BY_NAME(".devconfig*"))) - __devconfig_end = .; - } GROUP_LINK_IN(ROMABLE_REGION) - -#ifdef CONFIG_CPLUSPLUS - SECTION_PROLOGUE(_CTOR_SECTION_NAME,,) { - /* - * The compiler fills the constructor pointers table below, hence - * symbol __CTOR_LIST__ must be aligned on 4 byte boundary. - * To align with the C++ standard, the first element of the array - * contains the number of actual constructors. The last element is - * NULL. - */ - . = ALIGN(4); - __CTOR_LIST__ = .; - LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2) - KEEP(*(SORT_BY_NAME(".ctors*"))) - LONG(0) - __CTOR_END__ = .; - } GROUP_LINK_IN(ROMABLE_REGION) - - SECTION_PROLOGUE(init_array, (OPTIONAL),) - { - . = ALIGN(4); - __init_array_start = .; - KEEP(*(SORT_BY_NAME(".init_array*"))) - __init_array_end = .; - } GROUP_LINK_IN(ROMABLE_REGION) -#endif +#include SECTION_PROLOGUE(_RODATA_SECTION_NAME,,) { *(.rodata) @@ -169,68 +137,7 @@ SECTIONS { } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) - SECTION_DATA_PROLOGUE(initlevel, (OPTIONAL),) - { - DEVICE_INIT_SECTIONS() - } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) - -SECTION_DATA_PROLOGUE (_k_task_list, (OPTIONAL),) - { - _k_task_list_start = .; - *(._k_task_list.public.*) - *(._k_task_list.private.*) - _k_task_list_idle_start = .; - *(._k_task_list.idle.*) - KEEP(*(SORT_BY_NAME("._k_task_list*"))) - _k_task_list_end = .; - } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) - - SECTION_DATA_PROLOGUE (_k_task_ptr, (OPTIONAL),) - { - _k_task_ptr_start = .; - *(._k_task_ptr.public.*) - *(._k_task_ptr.private.*) - *(._k_task_ptr.idle.*) - KEEP(*(SORT_BY_NAME("._k_task_ptr*"))) - _k_task_ptr_end = .; - } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) - - SECTION_DATA_PROLOGUE (_k_pipe_ptr, (OPTIONAL),) - { - _k_pipe_ptr_start = .; - *(._k_pipe_ptr.public.*) - *(._k_pipe_ptr.private.*) - KEEP(*(SORT_BY_NAME("._k_pipe_ptr*"))) - _k_pipe_ptr_end = .; - } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) - - SECTION_DATA_PROLOGUE (_k_mem_map_ptr, (OPTIONAL),) - { - _k_mem_map_ptr_start = .; - *(._k_mem_map_ptr.public.*) - *(._k_mem_map_ptr.private.*) - KEEP(*(SORT_BY_NAME("._k_mem_map_ptr*"))) - _k_mem_map_ptr_end = .; - } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) - - SECTION_DATA_PROLOGUE(_k_event_list, (OPTIONAL),) - { - _k_event_list_start = .; - *(._k_event_list.event.*) - KEEP(*(SORT_BY_NAME("._k_event_list*"))) - _k_event_list_end = .; - } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) - - SECTION_PROLOGUE(_k_memory_pool, (OPTIONAL),) - { - *(._k_memory_pool.struct*) - KEEP(*(SORT_BY_NAME("._k_memory_pool.struct*"))) - - _k_mem_pool_start = .; - *(._k_memory_pool.*) - KEEP(*(SORT_BY_NAME("._k_memory_pool*"))) - _k_mem_pool_end = .; - } GROUP_LINK_IN(RAMABLE_REGION) +#include __data_ram_end = .; diff --git a/include/arch/arm/cortex_m/scripts/linker.ld b/include/arch/arm/cortex_m/scripts/linker.ld index d2b42579531..8bd6fad2528 100644 --- a/include/arch/arm/cortex_m/scripts/linker.ld +++ b/include/arch/arm/cortex_m/scripts/linker.ld @@ -117,14 +117,6 @@ SECTIONS _image_text_end = .; - SECTION_PROLOGUE (devconfig, (OPTIONAL),) - { - __devconfig_start = .; - *(".devconfig.*") - KEEP(*(SORT_BY_NAME(".devconfig*"))) - __devconfig_end = .; - } GROUP_LINK_IN(ROMABLE_REGION) - SECTION_PROLOGUE(.ARM.exidx,,) { /* @@ -140,32 +132,7 @@ SECTIONS __exidx_end = .; } GROUP_LINK_IN(ROMABLE_REGION) -#ifdef CONFIG_CPLUSPLUS - SECTION_PROLOGUE(_CTOR_SECTION_NAME,,) - { - /* - * The compiler fills the constructor pointers table below, hence symbol - * __CTOR_LIST__ must be aligned on 4 byte boundary. - * To align with the C++ standard, the first elment of the array - * contains the number of actual constructors. The last element is - * NULL. - */ - . = ALIGN(4); - __CTOR_LIST__ = .; - LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2) - KEEP(*(SORT_BY_NAME(".ctors*"))) - LONG(0) - __CTOR_END__ = .; - } GROUP_LINK_IN(ROMABLE_REGION) - - SECTION_PROLOGUE(init_array, (OPTIONAL),) - { - . = ALIGN(4); - __init_array_start = .; - KEEP(*(SORT_BY_NAME(".init_array*"))) - __init_array_end = .; - } GROUP_LINK_IN(ROMABLE_REGION) -#endif +#include SECTION_PROLOGUE(_RODATA_SECTION_NAME,,) { @@ -202,69 +169,7 @@ SECTIONS *(".data.*") } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) - SECTION_DATA_PROLOGUE (initlevel, (OPTIONAL),) - { - DEVICE_INIT_SECTIONS() - } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) - - SECTION_DATA_PROLOGUE (_k_task_list, (OPTIONAL),) - { - _k_task_list_start = .; - *(._k_task_list.public.*) - *(._k_task_list.private.*) - _k_task_list_idle_start = .; - *(._k_task_list.idle.*) - KEEP(*(SORT_BY_NAME("._k_task_list*"))) - _k_task_list_end = .; - } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) - - SECTION_DATA_PROLOGUE (_k_task_ptr, (OPTIONAL),) - { - _k_task_ptr_start = .; - *(._k_task_ptr.public.*) - *(._k_task_ptr.private.*) - *(._k_task_ptr.idle.*) - KEEP(*(SORT_BY_NAME("._k_task_ptr*"))) - _k_task_ptr_end = .; - } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) - - SECTION_DATA_PROLOGUE (_k_pipe_ptr, (OPTIONAL),) - { - _k_pipe_ptr_start = .; - *(._k_pipe_ptr.public.*) - *(._k_pipe_ptr.private.*) - KEEP(*(SORT_BY_NAME("._k_pipe_ptr*"))) - _k_pipe_ptr_end = .; - } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) - - SECTION_DATA_PROLOGUE (_k_mem_map_ptr, (OPTIONAL),) - { - _k_mem_map_ptr_start = .; - *(._k_mem_map_ptr.public.*) - *(._k_mem_map_ptr.private.*) - KEEP(*(SORT_BY_NAME("._k_mem_map_ptr*"))) - _k_mem_map_ptr_end = .; - } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) - - SECTION_DATA_PROLOGUE(_k_event_list, (OPTIONAL),) - { - _k_event_list_start = .; - *(._k_event_list.event.*) - KEEP(*(SORT_BY_NAME("._k_event_list*"))) - _k_event_list_end = .; - } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) - - SECTION_DATA_PROLOGUE(_k_memory_pool, (OPTIONAL),) - { - *(._k_memory_pool.struct*) - KEEP(*(SORT_BY_NAME("._k_memory_pool.struct*"))) - - _k_mem_pool_start = .; - *(._k_memory_pool.*) - KEEP(*(SORT_BY_NAME("._k_memory_pool*"))) - _k_mem_pool_end = .; - } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) - +#include __data_ram_end = .; @@ -331,11 +236,4 @@ SECTIONS } GROUP_LINK_IN(SYSTEM_CONTROL_SPACE) GROUP_END(SYSTEM_CONTROL_SPACE) - /* verify we don't have rogue .init_ initlevel sections */ - SECTION_PROLOGUE(initlevel_error, (OPTIONAL),) - { - DEVICE_INIT_UNDEFINED_SECTION() - } - ASSERT(SIZEOF(initlevel_error) == 0, "Undefined initialization levels used.") - } diff --git a/include/arch/nios2/linker.ld b/include/arch/nios2/linker.ld index 5d0291ed289..6bd32530c12 100644 --- a/include/arch/nios2/linker.ld +++ b/include/arch/nios2/linker.ld @@ -120,40 +120,7 @@ SECTIONS PROVIDE(gp = _gp); #endif -#ifdef CONFIG_CPLUSPLUS - SECTION_PROLOGUE(_CTOR_SECTION_NAME, ,) - { - /* - * The compiler fills the constructor pointers table below, hence symbol - * __CTOR_LIST__ must be aligned on 4 byte boundary. - * To align with the C++ standard, the first elment of the array - * contains the number of actual constructors. The last element is - * NULL. - */ - . = ALIGN(4); - __CTOR_LIST__ = .; - LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2) - KEEP(*(SORT_BY_NAME(".ctors*"))) - LONG(0) - __CTOR_END__ = .; - } GROUP_LINK_IN(ROMABLE_REGION) - - SECTION_PROLOGUE(init_array, (OPTIONAL),) - { - . = ALIGN(4); - __init_array_start = .; - KEEP(*(SORT_BY_NAME(".init_array*"))) - __init_array_end = .; - } GROUP_LINK_IN(ROMABLE_REGION) -#endif - - SECTION_PROLOGUE(devconfig, (OPTIONAL),) - { - __devconfig_start = .; - *(".devconfig.*") - KEEP(*(SORT_BY_NAME(".devconfig*"))) - __devconfig_end = .; - } GROUP_LINK_IN(ROMABLE_REGION) +#include SECTION_PROLOGUE(_RODATA_SECTION_NAME,,) { @@ -187,71 +154,11 @@ SECTIONS } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) #endif - SECTION_DATA_PROLOGUE(initlevel, (OPTIONAL),) - { #ifndef CONFIG_XIP _image_ram_start = .; #endif - DEVICE_INIT_SECTIONS() - } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) - SECTION_DATA_PROLOGUE(_k_task_list, (OPTIONAL),) - { - _k_task_list_start = .; - *(._k_task_list.public.*) - *(._k_task_list.private.*) - _k_task_list_idle_start = .; - *(._k_task_list.idle.*) - KEEP(*(SORT_BY_NAME("._k_task_list*"))) - _k_task_list_end = .; - } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) - - SECTION_DATA_PROLOGUE(_k_task_ptr, (OPTIONAL),) - { - _k_task_ptr_start = .; - *(._k_task_ptr.public.*) - *(._k_task_ptr.private.*) - *(._k_task_ptr.idle.*) - KEEP(*(SORT_BY_NAME("._k_task_ptr*"))) - _k_task_ptr_end = .; - } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) - - SECTION_DATA_PROLOGUE(_k_pipe_ptr, (OPTIONAL),) - { - _k_pipe_ptr_start = .; - *(._k_pipe_ptr.public.*) - *(._k_pipe_ptr.private.*) - KEEP(*(SORT_BY_NAME("._k_pipe_ptr*"))) - _k_pipe_ptr_end = .; - } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) - - SECTION_DATA_PROLOGUE(_k_mem_map_ptr, (OPTIONAL),) - { - _k_mem_map_ptr_start = .; - *(._k_mem_map_ptr.public.*) - *(._k_mem_map_ptr.private.*) - KEEP(*(SORT_BY_NAME("._k_mem_map_ptr*"))) - _k_mem_map_ptr_end = .; - } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) - - SECTION_DATA_PROLOGUE(_k_event_list, (OPTIONAL),) - { - _k_event_list_start = .; - *(._k_event_list.event.*) - KEEP(*(SORT_BY_NAME("._k_event_list*"))) - _k_event_list_end = .; - } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) - - SECTION_DATA_PROLOGUE(_k_memory_pool, (OPTIONAL),) - { - *(._k_memory_pool.struct*) - KEEP(*(SORT_BY_NAME("._k_memory_pool.struct*"))) - - _k_mem_pool_start = .; - *(._k_memory_pool.*) - KEEP(*(SORT_BY_NAME("._k_memory_pool*"))) - _k_mem_pool_end = .; - } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) +#include SECTION_DATA_PROLOGUE(_DATA_SECTION_NAME,,) { diff --git a/include/arch/x86/linker-epilog.h b/include/arch/x86/linker-epilog.h deleted file mode 100644 index 14a7380acb1..00000000000 --- a/include/arch/x86/linker-epilog.h +++ /dev/null @@ -1,75 +0,0 @@ -/* linker-epilog.h - defines structures that conclude linker script */ - -/* - * Copyright (c) 2014 Wind River Systems, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#ifndef _LINKER_EPILOG_H -#define _LINKER_EPILOG_H -#include - -#ifdef _LINKER - -/* - * The following guard prevents usage of orphaned sections -- - * the sections that are not explicitly mentioned in the linker script - */ - -SECTIONS - { - /* list all debugging sections that needed in resulting ELF */ - .shstrtab 0 (OPTIONAL): { *(.shstrtab) } - .symtab 0 (OPTIONAL): { *(.symtab) } - .strtab 0 (OPTIONAL): { *(.strtab) } - .iplt 0 (OPTIONAL): { *(.iplt) } - .igot.plt 0 (OPTIONAL): { *(.igot.plt) } - .rel.plt 0 (OPTIONAL): { *(.rel.plt) } - .rela.plt 0 (OPTIONAL): { *(.rela.plt) } - .rel.dyn 0 (OPTIONAL): { *(".rel.*") } - .rela.dyn 0 (OPTIONAL): { *(".rela.*") } - .comment 0 (OPTIONAL): { *(.comment) } - /* DWARF debugging sections */ - /* DWARF 1 */ - .debug 0 (OPTIONAL): { *(.debug) } - .line 0 (OPTIONAL): { *(.line) } - /* GNU DWARF 1 extensions */ - .debug_srcinfo 0 : { *(.debug_srcinfo) } - .debug_sfnames 0 : { *(.debug_sfnames) } - /* DWARF 1.1 and DWARF 2 */ - .debug_aranges 0 (OPTIONAL): { *(.debug_aranges) } - .debug_pubnames 0 (OPTIONAL): { *(.debug_pubnames) } - .debug_pubtypes 0 (OPTIONAL): { *(.debug_pubtypes) } - /* DWARF 2 */ - .debug_line 0 (OPTIONAL): { *(.debug_line) } - .debug_info 0 (OPTIONAL): { *(.debug_info) } - .debug_macinfo 0 (OPTIONAL): { *(.debug_macinfo) } - .debug_abbrev 0 (OPTIONAL): { *(.debug_abbrev) } - .debug_loc 0 (OPTIONAL): { *(.debug_loc) } - .debug_ranges 0 (OPTIONAL): { *(.debug_ranges) } - .debug_str 0 (OPTIONAL): { *(.debug_str) } - .debug_frame 0 (OPTIONAL): { *(.debug_frame) } - .debug_macro 0 (OPTIONAL): { *(.debug_macro) } - /* generate a linker error if orphan section is used */ - .trashcan : - { - *(.*) - } - } -ASSERT(SIZEOF(.trashcan) == 0, "Section(s) undefined in the linker script used.") - -#endif /* _LINKER */ - -#endif /* _LINKER_EPILOG_H */ diff --git a/include/arch/x86/linker-common-sections.h b/include/arch/x86/linker.ld similarity index 61% rename from include/arch/x86/linker-common-sections.h rename to include/arch/x86/linker.ld index edd48469dbd..e7567482d9f 100644 --- a/include/arch/x86/linker-common-sections.h +++ b/include/arch/x86/linker.ld @@ -25,19 +25,19 @@ * features are enabled by the kernel's configuration options. * * For a build that does not use the execute in place (XIP) feature, the script - * generates an image suitable for loading into and executing from RAM by + * generates an image suitable for loading into and executing from RAMABLE_REGION by * placing all the sections adjacent to each other. There is also no separate * load address for the DATA section which means it doesn't have to be copied - * into RAM. + * into RAMABLE_REGION. * * For builds using XIP, there is a different load memory address (LMA) and * virtual memory address (VMA) for the DATA section. In this case the DATA - * section is copied into RAM at runtime. + * section is copied into RAMABLE_REGION at runtime. * - * When building an XIP image the data section is placed into ROM. In this + * When building an XIP image the data section is placed into ROMABLE_REGION. In this * case, the LMA is set to __data_rom_start so the data section is concatenated * at the end of the RODATA section. At runtime, the DATA section is copied - * into the RAM region so it can be accessed with read and write permission. + * into the RAMABLE_REGION region so it can be accessed with read and write permission. * * Most symbols defined in the sections below are subject to be referenced in * the Zephyr Kernel image. If a symbol is used but not defined the linker will @@ -57,6 +57,14 @@ #include +#ifdef CONFIG_XIP + #define ROMABLE_REGION ROM + #define RAMABLE_REGION RAM +#else + #define ROMABLE_REGION RAM + #define RAMABLE_REGION RAM +#endif + /* SECTIONS definitions */ SECTIONS { @@ -83,40 +91,7 @@ SECTIONS _image_text_end = .; -#ifdef CONFIG_CPLUSPLUS - SECTION_PROLOGUE(_CTOR_SECTION_NAME, ,) - { - /* - * The compiler fills the constructor pointers table below, hence symbol - * __CTOR_LIST__ must be aligned on 4 byte boundary. - * To align with the C++ standard, the first elment of the array - * contains the number of actual constructors. The last element is - * NULL. - */ - . = ALIGN(4); - __CTOR_LIST__ = .; - LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2) - KEEP(*(SORT_BY_NAME(".ctors*"))) - LONG(0) - __CTOR_END__ = .; - } GROUP_LINK_IN(ROMABLE_REGION) - - SECTION_PROLOGUE(init_array, (OPTIONAL),) - { - . = ALIGN(4); - __init_array_start = .; - KEEP(*(SORT_BY_NAME(".init_array*"))) - __init_array_end = .; - } GROUP_LINK_IN(ROMABLE_REGION) -#endif - - SECTION_PROLOGUE(devconfig, (OPTIONAL),) - { - __devconfig_start = .; - *(".devconfig.*") - KEEP(*(SORT_BY_NAME(".devconfig*"))) - __devconfig_end = .; - } GROUP_LINK_IN(ROMABLE_REGION) +#include SECTION_PROLOGUE(_RODATA_SECTION_NAME, (OPTIONAL),) { @@ -138,12 +113,12 @@ SECTIONS } GROUP_LINK_IN(ROMABLE_REGION) _image_rom_end = .; - __data_rom_start = ALIGN(4); /* XIP imaged DATA ROM start addr */ + __data_rom_start = ALIGN(4); /* XIP imaged DATA ROMABLE_REGION start addr */ GROUP_END(ROMABLE_REGION) - /* RAM */ - GROUP_START(RAM) + /* RAMABLE_REGION */ + GROUP_START(RAMABLE_REGION) SECTION_DATA_PROLOGUE(_DATA_SECTION_NAME, (OPTIONAL),) { @@ -155,71 +130,9 @@ SECTIONS *(.data) *(".data.*") . = ALIGN(4); - } GROUP_DATA_LINK_IN(RAM, ROM) + } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) - SECTION_DATA_PROLOGUE(initlevel, (OPTIONAL),) - { - DEVICE_INIT_SECTIONS() - KEXEC_PGALIGN_PAD(MMU_PAGE_SIZE) - } GROUP_DATA_LINK_IN(RAM, ROM) - - SECTION_DATA_PROLOGUE(_k_task_list, (OPTIONAL),) - { - _k_task_list_start = .; - *(._k_task_list.public.*) - *(._k_task_list.private.*) - _k_task_list_idle_start = .; - *(._k_task_list.idle.*) - KEEP(*(SORT_BY_NAME("._k_task_list*"))) - _k_task_list_end = .; - } GROUP_DATA_LINK_IN(RAM, ROM) - - SECTION_DATA_PROLOGUE(_k_task_ptr, (OPTIONAL),) - { - _k_task_ptr_start = .; - *(._k_task_ptr.public.*) - *(._k_task_ptr.private.*) - *(._k_task_ptr.idle.*) - KEEP(*(SORT_BY_NAME("._k_task_ptr*"))) - _k_task_ptr_end = .; - } GROUP_DATA_LINK_IN(RAM, ROM) - - SECTION_DATA_PROLOGUE(_k_pipe_ptr, (OPTIONAL),) - { - _k_pipe_ptr_start = .; - *(._k_pipe_ptr.public.*) - *(._k_pipe_ptr.private.*) - KEEP(*(SORT_BY_NAME("._k_pipe_ptr*"))) - _k_pipe_ptr_end = .; - } GROUP_DATA_LINK_IN(RAM, ROM) - - SECTION_DATA_PROLOGUE(_k_mem_map_ptr, (OPTIONAL),) - { - _k_mem_map_ptr_start = .; - *(._k_mem_map_ptr.public.*) - *(._k_mem_map_ptr.private.*) - KEEP(*(SORT_BY_NAME("._k_mem_map_ptr*"))) - _k_mem_map_ptr_end = .; - } GROUP_DATA_LINK_IN(RAM, ROM) - - SECTION_DATA_PROLOGUE(_k_event_list, (OPTIONAL),) - { - _k_event_list_start = .; - *(._k_event_list.event.*) - KEEP(*(SORT_BY_NAME("._k_event_list*"))) - _k_event_list_end = .; - } GROUP_DATA_LINK_IN(RAM, ROM) - - SECTION_DATA_PROLOGUE(_k_memory_pool, (OPTIONAL),) - { - *(._k_memory_pool.struct*) - KEEP(*(SORT_BY_NAME("._k_memory_pool.struct*"))) - - _k_mem_pool_start = .; - *(._k_memory_pool.*) - KEEP(*(SORT_BY_NAME("._k_memory_pool*"))) - _k_mem_pool_end = .; - } GROUP_DATA_LINK_IN(RAM, ROM) +#include __data_ram_end = .; @@ -244,14 +157,14 @@ SECTIONS . = ALIGN(4); __bss_end = .; KEXEC_PGALIGN_PAD(MMU_PAGE_SIZE) - } GROUP_LINK_IN(RAM) + } GROUP_LINK_IN(RAMABLE_REGION) #ifdef CONFIG_XIP /* * Ensure linker keeps sections in correct order, despite the fact * the previous section specified a load address and this no-load * section doesn't. */ - GROUP_FOLLOWS_AT(RAM) + GROUP_FOLLOWS_AT(RAMABLE_REGION) #endif SECTION_PROLOGUE(_NOINIT_SECTION_NAME, (NOLOAD OPTIONAL),) @@ -265,7 +178,7 @@ SECTIONS *(.bottom_of_image_ram) *(.bottom_of_image_ram.*) - } GROUP_LINK_IN(RAM) + } GROUP_LINK_IN(RAMABLE_REGION) /* Define linker symbols */ _image_ram_end = .; @@ -275,7 +188,7 @@ SECTIONS __bss_num_words = (__bss_end - __bss_start) >> 2; - GROUP_END(RAM) + GROUP_END(RAMABLE_REGION) /* static interrupts */ SECTION_PROLOGUE(intList, (OPTIONAL),) @@ -288,14 +201,6 @@ SECTIONS KEEP(*(.gnu.linkonce.intList.*)) __INT_LIST_END__ = .; } > IDT_LIST - - /* verify we don't have rogue .init_ initlevel sections */ - SECTION_PROLOGUE(initlevel_error, (OPTIONAL), ) - { - DEVICE_INIT_UNDEFINED_SECTION() - } - ASSERT(SIZEOF(initlevel_error) == 0, "Undefined initialization levels used.") - } #ifdef CONFIG_XIP diff --git a/include/linker/common-ram.ld b/include/linker/common-ram.ld new file mode 100644 index 00000000000..70ea6147158 --- /dev/null +++ b/include/linker/common-ram.ld @@ -0,0 +1,70 @@ + SECTION_DATA_PROLOGUE(initlevel, (OPTIONAL),) + { + DEVICE_INIT_SECTIONS() + } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) + + /* verify we don't have rogue .init_ initlevel sections */ + SECTION_DATA_PROLOGUE(initlevel_error, (OPTIONAL), ) + { + DEVICE_INIT_UNDEFINED_SECTION() + } + ASSERT(SIZEOF(initlevel_error) == 0, "Undefined initialization levels used.") + + SECTION_DATA_PROLOGUE(_k_task_list, (OPTIONAL),) + { + _k_task_list_start = .; + *(._k_task_list.public.*) + *(._k_task_list.private.*) + _k_task_list_idle_start = .; + *(._k_task_list.idle.*) + KEEP(*(SORT_BY_NAME("._k_task_list*"))) + _k_task_list_end = .; + } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) + + SECTION_DATA_PROLOGUE(_k_task_ptr, (OPTIONAL),) + { + _k_task_ptr_start = .; + *(._k_task_ptr.public.*) + *(._k_task_ptr.private.*) + *(._k_task_ptr.idle.*) + KEEP(*(SORT_BY_NAME("._k_task_ptr*"))) + _k_task_ptr_end = .; + } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) + + SECTION_DATA_PROLOGUE(_k_pipe_ptr, (OPTIONAL),) + { + _k_pipe_ptr_start = .; + *(._k_pipe_ptr.public.*) + *(._k_pipe_ptr.private.*) + KEEP(*(SORT_BY_NAME("._k_pipe_ptr*"))) + _k_pipe_ptr_end = .; + } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) + + SECTION_DATA_PROLOGUE(_k_mem_map_ptr, (OPTIONAL),) + { + _k_mem_map_ptr_start = .; + *(._k_mem_map_ptr.public.*) + *(._k_mem_map_ptr.private.*) + KEEP(*(SORT_BY_NAME("._k_mem_map_ptr*"))) + _k_mem_map_ptr_end = .; + } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) + + SECTION_DATA_PROLOGUE(_k_event_list, (OPTIONAL),) + { + _k_event_list_start = .; + *(._k_event_list.event.*) + KEEP(*(SORT_BY_NAME("._k_event_list*"))) + _k_event_list_end = .; + } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) + + SECTION_DATA_PROLOGUE(_k_memory_pool, (OPTIONAL),) + { + *(._k_memory_pool.struct*) + KEEP(*(SORT_BY_NAME("._k_memory_pool.struct*"))) + + _k_mem_pool_start = .; + *(._k_memory_pool.*) + KEEP(*(SORT_BY_NAME("._k_memory_pool*"))) + _k_mem_pool_end = .; + } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) + diff --git a/include/linker/common-rom.ld b/include/linker/common-rom.ld new file mode 100644 index 00000000000..873433695c1 --- /dev/null +++ b/include/linker/common-rom.ld @@ -0,0 +1,35 @@ +#ifdef CONFIG_CPLUSPLUS + SECTION_PROLOGUE(_CTOR_SECTION_NAME,,) + { + /* + * The compiler fills the constructor pointers table below, + * hence symbol __CTOR_LIST__ must be aligned on 4 byte + * boundary. To align with the C++ standard, the first elment + * of the array contains the number of actual constructors. The + * last element is NULL. + */ + . = ALIGN(4); + __CTOR_LIST__ = .; + LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2) + KEEP(*(SORT_BY_NAME(".ctors*"))) + LONG(0) + __CTOR_END__ = .; + } GROUP_LINK_IN(ROMABLE_REGION) + + SECTION_PROLOGUE(init_array, (OPTIONAL),) + { + . = ALIGN(4); + __init_array_start = .; + KEEP(*(SORT_BY_NAME(".init_array*"))) + __init_array_end = .; + } GROUP_LINK_IN(ROMABLE_REGION) +#endif + + SECTION_PROLOGUE (devconfig, (OPTIONAL),) + { + __devconfig_start = .; + *(".devconfig.*") + KEEP(*(SORT_BY_NAME(".devconfig*"))) + __devconfig_end = .; + } GROUP_LINK_IN(ROMABLE_REGION) +