25eb09c3bb
replace *(.init_array .init_array.*) with KEEP(*(.init_array .init_array.*)). The KEEP statement within a linker script will instruct the linker to keep the specified section, even if no symbols inside it are referenced. This statement is used within the SECTIONS section of the linker script. This becomes relevant when garbage collection is performed at link time, enabled by passing the --gc-sections switch to the linker. The KEEP statement instructs the linker to use the specified section as a root node when creating a dependency graph, looking for unused sections. Essentially forcing the section to be marked as used. Signed-off-by: cuiziwei <cuiziwei@xiaomi.com>
145 lines
5.1 KiB
Plaintext
145 lines
5.1 KiB
Plaintext
/****************************************************************************
|
|
* boards/arm/lpc31xx/ea3131/scripts/pg-ld.script
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership. The
|
|
* ASF licenses this file to you 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.
|
|
*
|
|
****************************************************************************/
|
|
|
|
/* The LPC3131 has 192Kb of ISRAM beginning at virtual address 0x1102:8000.
|
|
* LPC31xx boot ROM expects the boot image be compiled with entry point at
|
|
* 0x1102:9000. A 128b header will appear at this address (applied by
|
|
* lpc313xImgCreator) and the executable code must begin at 0x1102:9080.
|
|
*
|
|
* The .text virtual address space begins at the same location as the physical
|
|
* address space: 0x1102 8000. The virtual space is broken up into three
|
|
* regions:
|
|
*
|
|
* PHYSICAL VIRTUAL
|
|
* NAME DESCRIPTION SIZE START SIZE START
|
|
* -------- -------------------------- ----- ----------- ------- -----------
|
|
* locked Pages locked in memory. 48Kb 0x1102 8000 48Kb 0x1102 8000
|
|
* paged Pages in nonvolatile store. 96Kb 0x1103 4000 384Kb 0x1103 4000
|
|
* data .data/.bss/heap. 32Kb 0x1104 c000 32Kb 0x1109 4000
|
|
* Reserved for page table 16Kb 0x1105 4000 16Kb 0x1109 c000
|
|
* -------- -------------------------- ----- ----------- ------- -----------
|
|
* 192Kb 0x1105 8000 480Kb 0x110a 0000
|
|
*
|
|
* These region sizes must match the size in pages specified for each region
|
|
* in the NuttX configuration file: CONFIG_PAGING_NLOCKED, CONFIG_PAGING_NVPAGED,
|
|
* and CONFIG_PAGING_NDATA.
|
|
*
|
|
* NOTE 1: The locked region is really big here so that you can enable lots of
|
|
* debug output without overflowing the locked region. 32Kb would probably be
|
|
* plenty if this were a real, optimized application.
|
|
*
|
|
* NOTE 2: Different compilers will compile the code to different sizes. If you
|
|
* get a link time error saying that the locked region is full, you may have to
|
|
* re-organize this memory layout (here and in defconfig) to make the locked
|
|
* region even bigger.
|
|
*/
|
|
|
|
MEMORY
|
|
{
|
|
locked (rx) : ORIGIN = 0x11029080, LENGTH = 52K - 4224
|
|
paged (rx) : ORIGIN = 0x11035000, LENGTH = 380K
|
|
data (rw) : ORIGIN = 0x11094000, LENGTH = 44K
|
|
}
|
|
|
|
OUTPUT_ARCH(arm)
|
|
ENTRY(_stext)
|
|
SECTIONS
|
|
{
|
|
.locked : {
|
|
_slocked = ABSOLUTE(.);
|
|
*(.vectors)
|
|
arm_head.o locked.r (.text .text.*)
|
|
arm_head.o locked.r (.fixup)
|
|
arm_head.o locked.r (.gnu.warning)
|
|
arm_head.o locked.r (.rodata .rodata.*)
|
|
arm_head.o locked.r (.gnu.linkonce.t.*)
|
|
arm_head.o locked.r (.glue_7)
|
|
arm_head.o locked.r (.glue_7t)
|
|
arm_head.o locked.r (.got)
|
|
arm_head.o locked.r (.gcc_except_table)
|
|
arm_head.o locked.r (.gnu.linkonce.r.*)
|
|
_elocked = ABSOLUTE(.);
|
|
} >locked
|
|
|
|
.init_section : {
|
|
_sinit = ABSOLUTE(.);
|
|
KEEP(*(.init_array .init_array.*))
|
|
_einit = ABSOLUTE(.);
|
|
} > locked
|
|
|
|
.ARM.extab : {
|
|
*(.ARM.extab*)
|
|
} > locked
|
|
|
|
__exidx_start = ABSOLUTE(.);
|
|
.ARM.exidx : {
|
|
*(.ARM.exidx*)
|
|
} > locked
|
|
__exidx_end = ABSOLUTE(.);
|
|
|
|
_eronly = ABSOLUTE(.);
|
|
|
|
.paged : {
|
|
_spaged = ABSOLUTE(.);
|
|
*(.text .text.*)
|
|
*(.fixup)
|
|
*(.gnu.warning)
|
|
*(.rodata .rodata.*)
|
|
*(.gnu.linkonce.t.*)
|
|
*(.glue_7)
|
|
*(.glue_7t)
|
|
*(.got)
|
|
*(.gcc_except_table)
|
|
*(.gnu.linkonce.r.*)
|
|
_epaged = ABSOLUTE(.);
|
|
} > paged
|
|
|
|
.data : {
|
|
_sdata = ABSOLUTE(.);
|
|
*(.data .data.*)
|
|
*(.gnu.linkonce.d.*)
|
|
CONSTRUCTORS
|
|
. = ALIGN(4);
|
|
_edata = ABSOLUTE(.);
|
|
} > data AT > locked
|
|
|
|
.bss : {
|
|
_sbss = ABSOLUTE(.);
|
|
*(.bss .bss.*)
|
|
*(.gnu.linkonce.b.*)
|
|
*(COMMON)
|
|
. = ALIGN(4);
|
|
_ebss = ABSOLUTE(.);
|
|
} > data
|
|
/* Stabs debugging sections. */
|
|
.stab 0 : { *(.stab) }
|
|
.stabstr 0 : { *(.stabstr) }
|
|
.stab.excl 0 : { *(.stab.excl) }
|
|
.stab.exclstr 0 : { *(.stab.exclstr) }
|
|
.stab.index 0 : { *(.stab.index) }
|
|
.stab.indexstr 0 : { *(.stab.indexstr) }
|
|
.comment 0 : { *(.comment) }
|
|
.debug_abbrev 0 : { *(.debug_abbrev) }
|
|
.debug_info 0 : { *(.debug_info) }
|
|
.debug_line 0 : { *(.debug_line) }
|
|
.debug_pubnames 0 : { *(.debug_pubnames) }
|
|
.debug_aranges 0 : { *(.debug_aranges) }
|
|
}
|