You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2023/06/28 07:16:37 UTC
[nuttx] 02/02: boards/litex/arty_a7: Support building fully linked executables.
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit 5b00c31396467e84c688ac1baac55eb7c3d41043
Author: Stuart Ianna <st...@motec.com.au>
AuthorDate: Tue Jun 27 10:26:48 2023 +1000
boards/litex/arty_a7: Support building fully linked executables.
Changes the executable type built against the `make export` target fully linked by default. This greatly improves performance when loading applications, as relocations no longer need to be processed.
---
arch/risc-v/Kconfig | 1 +
boards/risc-v/litex/arty_a7/configs/knsh/defconfig | 1 +
boards/risc-v/litex/arty_a7/scripts/Make.defs | 5 +-
boards/risc-v/litex/arty_a7/scripts/gnu-elf.ld | 132 +++++++++++++++++++++
4 files changed, 137 insertions(+), 2 deletions(-)
diff --git a/arch/risc-v/Kconfig b/arch/risc-v/Kconfig
index c45d64505c..79ca462e6b 100644
--- a/arch/risc-v/Kconfig
+++ b/arch/risc-v/Kconfig
@@ -375,6 +375,7 @@ config LITEX_CORE_VEXRISCV_SMP
select ARCH_HAVE_ADDRENV
select ARCH_NEED_ADDRENV_MAPPING
select ARCH_HAVE_S_MODE
+ select ARCH_HAVE_ELF_EXECUTABLE
endchoice
diff --git a/boards/risc-v/litex/arty_a7/configs/knsh/defconfig b/boards/risc-v/litex/arty_a7/configs/knsh/defconfig
index cfd80f2b0e..61693e0b30 100644
--- a/boards/risc-v/litex/arty_a7/configs/knsh/defconfig
+++ b/boards/risc-v/litex/arty_a7/configs/knsh/defconfig
@@ -32,6 +32,7 @@ CONFIG_ARCH_TEXT_VBASE=0x10000000
CONFIG_ARCH_USE_MMU=y
CONFIG_ARCH_USE_MPU=y
CONFIG_ARCH_USE_S_MODE=y
+CONFIG_BINFMT_ELF_EXECUTABLE=y
CONFIG_BOARDCTL_ROMDISK=y
CONFIG_BOARD_LATE_INITIALIZE=y
CONFIG_BOARD_LOOPSPERMSEC=10000
diff --git a/boards/risc-v/litex/arty_a7/scripts/Make.defs b/boards/risc-v/litex/arty_a7/scripts/Make.defs
index 2f3535d654..5931e3a0ad 100644
--- a/boards/risc-v/litex/arty_a7/scripts/Make.defs
+++ b/boards/risc-v/litex/arty_a7/scripts/Make.defs
@@ -44,5 +44,6 @@ CXXELFFLAGS = $(CXXFLAGS)
LDELFFLAGS = --oformat elf32-littleriscv
-LDELFFLAGS += -r -e main
-LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)/binfmt/libelf/gnu-elf.ld)
\ No newline at end of file
+ifeq ($(CONFIG_BINFMT_ELF_RELOCATABLE),y)
+LDELFFLAGS += -r
+endif
\ No newline at end of file
diff --git a/boards/risc-v/litex/arty_a7/scripts/gnu-elf.ld b/boards/risc-v/litex/arty_a7/scripts/gnu-elf.ld
new file mode 100644
index 0000000000..760fc32765
--- /dev/null
+++ b/boards/risc-v/litex/arty_a7/scripts/gnu-elf.ld
@@ -0,0 +1,132 @@
+/****************************************************************************
+ * boards/risc-v/litex/arty_a7/scripts/gnu-elf.ld
+ *
+ * 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.
+ *
+ ****************************************************************************/
+
+SECTIONS
+{
+ . = 0x10000000;
+ .text :
+ {
+ _stext = . ;
+ *(.text)
+ *(.text.*)
+ *(.gnu.warning)
+ *(.stub)
+ *(.glue_7)
+ *(.glue_7t)
+ *(.jcr)
+
+ /* C++ support: The .init and .fini sections contain specific logic
+ * to manage static constructors and destructors.
+ */
+
+ *(.gnu.linkonce.t.*)
+ *(.init) /* Old ABI */
+ *(.fini) /* Old ABI */
+ _etext = . ;
+ }
+
+ .rodata :
+ {
+ _srodata = . ;
+ *(.rodata)
+ *(.rodata1)
+ *(.rodata.*)
+ *(.gnu.linkonce.r*)
+ _erodata = . ;
+ }
+
+ . = 0x10401000;
+ .data :
+ {
+ _sdata = . ;
+ *(.data)
+ *(.data1)
+ *(.data.*)
+ *(.gnu.linkonce.d*)
+ . = ALIGN(4);
+ _edata = . ;
+ }
+
+ /* C++ support. For each global and static local C++ object,
+ * GCC creates a small subroutine to construct the object. Pointers
+ * to these routines (not the routines themselves) are stored as
+ * simple, linear arrays in the .ctors section of the object file.
+ * Similarly, pointers to global/static destructor routines are
+ * stored in .dtors.
+ */
+
+ .ctors :
+ {
+ _sctors = . ;
+ KEEP (*(.ctors)) /* Old ABI: Unallocated */
+ KEEP (*(.init_array)) /* New ABI: Allocated */
+ KEEP (*(SORT(.init_array.*)))
+ _ectors = . ;
+ }
+
+ .dtors :
+ {
+ _sdtors = . ;
+ KEEP (*(.dtors)) /* Old ABI: Unallocated */
+ KEEP (*(.fini_array)) /* New ABI: Allocated */
+ KEEP (*(SORT(.fini_array.*)))
+ _edtors = . ;
+ }
+
+ .bss :
+ {
+ _sbss = . ;
+ *(.bss)
+ *(.bss.*)
+ *(.sbss)
+ *(.sbss.*)
+ *(.gnu.linkonce.b*)
+ *(COMMON)
+ _ebss = . ;
+ }
+
+ /* Thread local storage support */
+ .tdata : {
+ _stdata = ABSOLUTE(.);
+ KEEP (*(.tdata .tdata.* .gnu.linkonce.td.*));
+ _etdata = ABSOLUTE(.);
+ }
+
+ .tbss : {
+ _stbss = ABSOLUTE(.);
+ KEEP (*(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon));
+ _etbss = ABSOLUTE(.);
+ }
+
+ /* 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) }
+}