From 5b00c31396467e84c688ac1baac55eb7c3d41043 Mon Sep 17 00:00:00 2001 From: Stuart Ianna Date: Tue, 27 Jun 2023 10:26:48 +1000 Subject: [PATCH] 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 + .../litex/arty_a7/configs/knsh/defconfig | 1 + boards/risc-v/litex/arty_a7/scripts/Make.defs | 5 +- .../risc-v/litex/arty_a7/scripts/gnu-elf.ld | 132 ++++++++++++++++++ 4 files changed, 137 insertions(+), 2 deletions(-) create mode 100644 boards/risc-v/litex/arty_a7/scripts/gnu-elf.ld 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) } +}