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


The following commit(s) were added to refs/heads/master by this push:
     new a9372627d8 risc-v/rv-virt: use fully linked apps for kernel build
a9372627d8 is described below

commit a9372627d82fe78b74e520b35ec9a1bab6c072af
Author: Yanfeng Liu <yfliu2...@qq.com>
AuthorDate: Thu Jan 11 11:37:40 2024 +0800

    risc-v/rv-virt: use fully linked apps for kernel build
    
    Fully linked apps take less storage and are efficient to load. This
    is to enable them for rv-vrit configurations in KERNEL build.
    
    Changes:
    
    - arch/risc-v/Kconfig       select BINFMT_ELF_EXECUTABLE for QEMU-RV
    - boards/risc-v/qemu-rv/rv-virt/configs
      - knsh32/defconfig        enable ELF_EXECUTABLE, LIBM, OSTEST
      - knsh64/defconfig        enable ELF_EXECUTABLE, LIBM, OSTEST
      - ksmp64/defconfig        enable ELF_EXECUTABLE, LIBM, OSTEST
      - knetnsh64/defconfig     enable ELF_EXECUTABLE, LIBM, OSTEST
      - knetnsh64_smp/defconfig enable ELF_EXECUTABLE, LIBM, OSTEST
    
    Additions:
    - boards/risc-v/qemu-rv/rv-virt/scripts/
      - gnu-elf.ld              apps linker script
    
    The ARCH_TEXT_VBASE of knsh32 is set to same as that of 64bit to reuse
    the apps linker script.
    
    Signed-off-by: Yanfeng Liu <yfliu2...@qq.com>
---
 arch/risc-v/Kconfig                                |   1 +
 .../qemu-rv/rv-virt/configs/knetnsh64/defconfig    |   4 +
 .../rv-virt/configs/knetnsh64_smp/defconfig        |   4 +
 .../qemu-rv/rv-virt/configs/knsh32/defconfig       |   5 +-
 .../qemu-rv/rv-virt/configs/knsh64/defconfig       |   3 +
 .../qemu-rv/rv-virt/configs/ksmp64/defconfig       |   3 +
 boards/risc-v/qemu-rv/rv-virt/scripts/Make.defs    |   6 +-
 boards/risc-v/qemu-rv/rv-virt/scripts/gnu-elf.ld   | 131 +++++++++++++++++++++
 8 files changed, 154 insertions(+), 3 deletions(-)

diff --git a/arch/risc-v/Kconfig b/arch/risc-v/Kconfig
index 78e621c34f..8938931e00 100644
--- a/arch/risc-v/Kconfig
+++ b/arch/risc-v/Kconfig
@@ -174,6 +174,7 @@ config ARCH_CHIP_QEMU_RV
        select ARCH_HAVE_ADDRENV
        select ARCH_NEED_ADDRENV_MAPPING
        select ARCH_HAVE_S_MODE
+       select ARCH_HAVE_ELF_EXECUTABLE
        select ONESHOT
        select ALARM_ARCH
        ---help---
diff --git a/boards/risc-v/qemu-rv/rv-virt/configs/knetnsh64/defconfig 
b/boards/risc-v/qemu-rv/rv-virt/configs/knetnsh64/defconfig
index 2d30588578..0b082d276e 100644
--- a/boards/risc-v/qemu-rv/rv-virt/configs/knetnsh64/defconfig
+++ b/boards/risc-v/qemu-rv/rv-virt/configs/knetnsh64/defconfig
@@ -36,12 +36,14 @@ CONFIG_ARCH_PGPOOL_PBASE=0x80400000
 CONFIG_ARCH_PGPOOL_SIZE=4194304
 CONFIG_ARCH_PGPOOL_VBASE=0x80400000
 CONFIG_ARCH_RISCV=y
+CONFIG_ARCH_SETJMP_H=y
 CONFIG_ARCH_STACKDUMP=y
 CONFIG_ARCH_TEXT_NPAGES=128
 CONFIG_ARCH_TEXT_VBASE=0xC0000000
 CONFIG_ARCH_USE_MMU=y
 CONFIG_ARCH_USE_MPU=y
 CONFIG_ARCH_USE_S_MODE=y
+CONFIG_BINFMT_ELF_EXECUTABLE=y
 CONFIG_BOARD_LOOPSPERMSEC=6366
 CONFIG_BUILD_KERNEL=y
 CONFIG_CODECS_HASH_MD5=y
@@ -79,6 +81,7 @@ CONFIG_LIBC_ENVPATH=y
 CONFIG_LIBC_EXECFUNCS=y
 CONFIG_LIBC_PERROR_STDOUT=y
 CONFIG_LIBC_STRERROR=y
+CONFIG_LIBM=y
 CONFIG_MEMSET_64BIT=y
 CONFIG_MEMSET_OPTSPEED=y
 CONFIG_MM_PGALLOC=y
@@ -133,3 +136,4 @@ CONFIG_SYSTEM_NSH=y
 CONFIG_SYSTEM_NSH_PROGNAME="init"
 CONFIG_SYSTEM_PING=y
 CONFIG_TESTING_GETPRIME=y
+CONFIG_TESTING_OSTEST=y
diff --git a/boards/risc-v/qemu-rv/rv-virt/configs/knetnsh64_smp/defconfig 
b/boards/risc-v/qemu-rv/rv-virt/configs/knetnsh64_smp/defconfig
index e44b602d06..3cad0d6da9 100644
--- a/boards/risc-v/qemu-rv/rv-virt/configs/knetnsh64_smp/defconfig
+++ b/boards/risc-v/qemu-rv/rv-virt/configs/knetnsh64_smp/defconfig
@@ -36,12 +36,14 @@ CONFIG_ARCH_PGPOOL_PBASE=0x80400000
 CONFIG_ARCH_PGPOOL_SIZE=4194304
 CONFIG_ARCH_PGPOOL_VBASE=0x80400000
 CONFIG_ARCH_RISCV=y
+CONFIG_ARCH_SETJMP_H=y
 CONFIG_ARCH_STACKDUMP=y
 CONFIG_ARCH_TEXT_NPAGES=128
 CONFIG_ARCH_TEXT_VBASE=0xC0000000
 CONFIG_ARCH_USE_MMU=y
 CONFIG_ARCH_USE_MPU=y
 CONFIG_ARCH_USE_S_MODE=y
+CONFIG_BINFMT_ELF_EXECUTABLE=y
 CONFIG_BOARD_LOOPSPERMSEC=6366
 CONFIG_BUILD_KERNEL=y
 CONFIG_CODECS_HASH_MD5=y
@@ -80,6 +82,7 @@ CONFIG_LIBC_ENVPATH=y
 CONFIG_LIBC_EXECFUNCS=y
 CONFIG_LIBC_PERROR_STDOUT=y
 CONFIG_LIBC_STRERROR=y
+CONFIG_LIBM=y
 CONFIG_MEMCPY_64BIT=y
 CONFIG_MEMCPY_VIK=y
 CONFIG_MEMSET_64BIT=y
@@ -137,4 +140,5 @@ CONFIG_SYSTEM_NSH=y
 CONFIG_SYSTEM_NSH_PROGNAME="init"
 CONFIG_SYSTEM_PING=y
 CONFIG_TESTING_GETPRIME=y
+CONFIG_TESTING_OSTEST=y
 CONFIG_TESTING_SMP=y
diff --git a/boards/risc-v/qemu-rv/rv-virt/configs/knsh32/defconfig 
b/boards/risc-v/qemu-rv/rv-virt/configs/knsh32/defconfig
index 86d381bd07..75d6d9ab5c 100644
--- a/boards/risc-v/qemu-rv/rv-virt/configs/knsh32/defconfig
+++ b/boards/risc-v/qemu-rv/rv-virt/configs/knsh32/defconfig
@@ -25,7 +25,7 @@ CONFIG_ARCH_CHIP_QEMU_RV_ISA_A=y
 CONFIG_ARCH_CHIP_QEMU_RV_ISA_C=y
 CONFIG_ARCH_CHIP_QEMU_RV_ISA_M=y
 CONFIG_ARCH_DATA_NPAGES=128
-CONFIG_ARCH_DATA_VBASE=0xC0400000
+CONFIG_ARCH_DATA_VBASE=0xC0100000
 CONFIG_ARCH_HEAP_NPAGES=128
 CONFIG_ARCH_HEAP_VBASE=0xC0800000
 CONFIG_ARCH_INTERRUPTSTACK=2048
@@ -41,6 +41,7 @@ CONFIG_ARCH_TEXT_VBASE=0xC0000000
 CONFIG_ARCH_USE_MMU=y
 CONFIG_ARCH_USE_MPU=y
 CONFIG_ARCH_USE_S_MODE=y
+CONFIG_BINFMT_ELF_EXECUTABLE=y
 CONFIG_BOARD_LOOPSPERMSEC=6366
 CONFIG_BUILD_KERNEL=y
 CONFIG_DEV_ZERO=y
@@ -62,6 +63,7 @@ CONFIG_LIBC_ENVPATH=y
 CONFIG_LIBC_EXECFUNCS=y
 CONFIG_LIBC_PERROR_STDOUT=y
 CONFIG_LIBC_STRERROR=y
+CONFIG_LIBM=y
 CONFIG_MM_PGALLOC=y
 CONFIG_NFILE_DESCRIPTORS_PER_BLOCK=6
 CONFIG_NSH_ARCHINIT=y
@@ -84,4 +86,5 @@ CONFIG_SYSLOG_TIMESTAMP=y
 CONFIG_SYSTEM_NSH=y
 CONFIG_SYSTEM_NSH_PROGNAME="init"
 CONFIG_TESTING_GETPRIME=y
+CONFIG_TESTING_OSTEST=y
 CONFIG_USEC_PER_TICK=1000
diff --git a/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig 
b/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig
index b665b39c6e..092331e47e 100644
--- a/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig
+++ b/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig
@@ -41,6 +41,7 @@ CONFIG_ARCH_TEXT_VBASE=0xC0000000
 CONFIG_ARCH_USE_MMU=y
 CONFIG_ARCH_USE_MPU=y
 CONFIG_ARCH_USE_S_MODE=y
+CONFIG_BINFMT_ELF_EXECUTABLE=y
 CONFIG_BOARD_LOOPSPERMSEC=6366
 CONFIG_BUILD_KERNEL=y
 CONFIG_DEBUG_ASSERTIONS=y
@@ -66,6 +67,7 @@ CONFIG_LIBC_ENVPATH=y
 CONFIG_LIBC_EXECFUNCS=y
 CONFIG_LIBC_PERROR_STDOUT=y
 CONFIG_LIBC_STRERROR=y
+CONFIG_LIBM=y
 CONFIG_MEMSET_64BIT=y
 CONFIG_MEMSET_OPTSPEED=y
 CONFIG_MM_PGALLOC=y
@@ -92,4 +94,5 @@ CONFIG_SYSLOG_TIMESTAMP=y
 CONFIG_SYSTEM_NSH=y
 CONFIG_SYSTEM_NSH_PROGNAME="init"
 CONFIG_TESTING_GETPRIME=y
+CONFIG_TESTING_OSTEST=y
 CONFIG_USEC_PER_TICK=1000
diff --git a/boards/risc-v/qemu-rv/rv-virt/configs/ksmp64/defconfig 
b/boards/risc-v/qemu-rv/rv-virt/configs/ksmp64/defconfig
index d9e9dcd111..c0f789c04e 100644
--- a/boards/risc-v/qemu-rv/rv-virt/configs/ksmp64/defconfig
+++ b/boards/risc-v/qemu-rv/rv-virt/configs/ksmp64/defconfig
@@ -41,6 +41,7 @@ CONFIG_ARCH_TEXT_VBASE=0xC0000000
 CONFIG_ARCH_USE_MMU=y
 CONFIG_ARCH_USE_MPU=y
 CONFIG_ARCH_USE_S_MODE=y
+CONFIG_BINFMT_ELF_EXECUTABLE=y
 CONFIG_BOARD_LOOPSPERMSEC=6366
 CONFIG_BUILD_KERNEL=y
 CONFIG_DEBUG_FULLOPT=y
@@ -65,6 +66,7 @@ CONFIG_LIBC_ENVPATH=y
 CONFIG_LIBC_EXECFUNCS=y
 CONFIG_LIBC_PERROR_STDOUT=y
 CONFIG_LIBC_STRERROR=y
+CONFIG_LIBM=y
 CONFIG_MEMSET_64BIT=y
 CONFIG_MEMSET_OPTSPEED=y
 CONFIG_MM_PGALLOC=y
@@ -93,4 +95,5 @@ CONFIG_SYSLOG_TIMESTAMP=y
 CONFIG_SYSTEM_NSH=y
 CONFIG_SYSTEM_NSH_PROGNAME="init"
 CONFIG_TESTING_GETPRIME=y
+CONFIG_TESTING_OSTEST=y
 CONFIG_TESTING_SMP=y
diff --git a/boards/risc-v/qemu-rv/rv-virt/scripts/Make.defs 
b/boards/risc-v/qemu-rv/rv-virt/scripts/Make.defs
index 453bad37bc..59157549e3 100644
--- a/boards/risc-v/qemu-rv/rv-virt/scripts/Make.defs
+++ b/boards/risc-v/qemu-rv/rv-virt/scripts/Make.defs
@@ -55,5 +55,7 @@ else
   LDELFFLAGS = --oformat elf64-littleriscv
 endif
 
-LDELFFLAGS += -r -e main
-LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)/binfmt/libelf/gnu-elf.ld)
+ifeq ($(CONFIG_BINFMT_ELF_RELOCATABLE),y)
+LDELFFLAGS += -r
+endif
+
diff --git a/boards/risc-v/qemu-rv/rv-virt/scripts/gnu-elf.ld 
b/boards/risc-v/qemu-rv/rv-virt/scripts/gnu-elf.ld
new file mode 100644
index 0000000000..d5e77d8e2c
--- /dev/null
+++ b/boards/risc-v/qemu-rv/rv-virt/scripts/gnu-elf.ld
@@ -0,0 +1,131 @@
+/****************************************************************************
+ * boards/risc-v/qemu-rv/rv-virt/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
+{
+  . = 0xC0000000;
+  .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 = . ;
+    }
+
+  . = 0xC0101000;
+  .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(*(SORT_BY_INIT_PRIORITY(.init_array.*) 
SORT_BY_INIT_PRIORITY(.ctors.*)))
+      KEEP(*(.init_array .ctors))
+      _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) }
+}

Reply via email to