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 2024/10/12 04:29:21 UTC

(nuttx) 08/20: modlib:move Exception section logic to modlib

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 91c7e8e44bb614318c871a1e63a47973597f6578
Author: anjiahao <an...@xiaomi.com>
AuthorDate: Tue Jul 9 15:17:11 2024 +0800

    modlib:move Exception section logic to modlib
    
    Signed-off-by: anjiahao <an...@xiaomi.com>
---
 libs/libc/modlib/Kconfig       | 10 ++++++++++
 libs/libc/modlib/modlib_load.c | 14 ++++++++++++++
 2 files changed, 24 insertions(+)

diff --git a/libs/libc/modlib/Kconfig b/libs/libc/modlib/Kconfig
index f225bb3544..f1667180ad 100644
--- a/libs/libc/modlib/Kconfig
+++ b/libs/libc/modlib/Kconfig
@@ -106,4 +106,14 @@ config MODLIB_LOADTO_LMA
 		relocate .data section to the final address(VMA) and zero .bss section
 		by self.
 
+config MODLIB_EXIDX_SECTNAME
+	string "ELF Section Name for Exception Index"
+	default ".ARM.exidx"
+	depends on CXX_EXCEPTION && ARCH_ARM
+	---help---
+		Set the name string for the exception index section on the ELF modules to
+		be loaded by the ELF binary loader.
+
+		This is needed to support exception handling on loadable ELF modules.
+
 endmenu # Module library configuration
diff --git a/libs/libc/modlib/modlib_load.c b/libs/libc/modlib/modlib_load.c
index 865df005a1..152f477100 100644
--- a/libs/libc/modlib/modlib_load.c
+++ b/libs/libc/modlib/modlib_load.c
@@ -537,6 +537,20 @@ int modlib_load(FAR struct mod_loadinfo_s *loadinfo)
       goto errout_with_buffers;
     }
 
+#ifdef CONFIG_MODLIB_EXIDX_SECTNAME
+  ret = modlib_findsection(loadinfo, CONFIG_MODLIB_EXIDX_SECTNAME);
+  if (ret < 0)
+    {
+      binfo("modlib_findsection: Exception Index section not found: %d\n",
+            ret);
+    }
+  else
+    {
+      up_init_exidx(loadinfo->shdr[ret].sh_addr,
+                    loadinfo->shdr[ret].sh_size);
+    }
+#endif
+
   return OK;
 
   /* Error exits */