anchao commented on code in PR #13579:
URL: https://github.com/apache/nuttx/pull/13579#discussion_r1776357636


##########
libs/libc/modlib/modlib_getsymbol.c:
##########
@@ -0,0 +1,115 @@
+/****************************************************************************
+ * libs/libc/modlib/modlib_getsymbol.c
+ *
+ * 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.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <assert.h>
+#include <debug.h>
+#include <errno.h>
+
+#include <nuttx/lib/modlib.h>
+#include <nuttx/symtab.h>
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: modlib_getsymbol
+ *
+ * Description:
+ *   modlib_getsymbol() returns the address of a symbol defined within the
+ *   object that was previously made accessible through a modlib_getsymbol()
+ *   call.  handle is the value returned from a call to modlib_insert() (and
+ *   which has not since been released via a call to modlib_remove()),
+ *   name is the symbol's name as a character string.
+ *
+ *   The returned symbol address will remain valid until modlib_remove() is
+ *   called.
+ *
+ * Input Parameters:
+ *   handle - The opaque, non-NULL value returned by a previous successful
+ *            call to modlib_insert().
+ *   name   - A pointer to the symbol name string.
+ *
+ * Returned Value:
+ *   The address associated with the symbol is returned on success.
+ *   If handle does not refer to a valid module opened by modlib_insert(),
+ *   or if the named modlib_symbol cannot be found within any of the objects
+ *   associated with handle, modlib_getsymbol() will return NULL and the
+ *   errno variable will be set appropriately.
+ *
+ *   NOTE: This means that the address zero can never be a valid return
+ *   value.
+ *
+ ****************************************************************************/
+
+FAR const void *modlib_getsymbol(FAR void *handle, FAR const char *name)
+{
+  FAR struct module_s *modp = (FAR struct module_s *)handle;

Review Comment:
   ```suggestion
     FAR struct module_s *modp = handle;
   ```



##########
binfmt/binfmt_unloadmodule.c:
##########
@@ -161,6 +161,32 @@ int unload_module(FAR struct binary_s *binp)
           file_munmap(binp->mapped, binp->mapsize);
         }
 
+#ifdef CONFIG_ARCH_USE_SEPARATED_SECTION
+  for (i = 0; binp->sectalloc[i] != NULL && i < binp->nsect; i++)
+    {
+#  ifdef CONFIG_ARCH_USE_TEXT_HEAP
+      if (up_textheap_heapmember(binp->sectalloc[i]))
+        {
+          up_textheap_free(binp->sectalloc[i]);
+          continue;
+        }
+#  endif
+
+#  ifdef CONFIG_ARCH_USE_DATA_HEAP
+      if (up_dataheap_heapmember(binp->sectalloc[i]))
+        {
+          up_dataheap_free(binp->sectalloc[i]);
+          continue;
+        }
+#  endif
+
+      kumm_free(binp->sectalloc[i]);
+    }
+
+  binp->alloc[0] = NULL;
+  binp->alloc[1] = NULL;
+#endif

Review Comment:
   ```suggestion
   #  ifdef CONFIG_ARCH_USE_TEXT_HEAP
         if (up_textheap_heapmember(binp->sectalloc[i]))
           {
             up_textheap_free(binp->sectalloc[i]);
           }
         else
   #  endif
   
   #  ifdef CONFIG_ARCH_USE_DATA_HEAP
         if (up_dataheap_heapmember(binp->sectalloc[i]))
           {
             up_dataheap_free(binp->sectalloc[i]);
           }
         else
   #  endif
           {
             kumm_free(binp->sectalloc[i]);
           }
       }
   ```



##########
libs/libc/modlib/modlib_unload.c:
##########
@@ -62,23 +62,51 @@ int modlib_unload(FAR struct mod_loadinfo_s *loadinfo)
 
   if (loadinfo->ehdr.e_type != ET_DYN)
     {
+#ifdef CONFIG_ARCH_USE_SEPARATED_SECTION
+      int i;
+
+      for (i = 0; loadinfo->sectalloc[i] != 0 &&
+                  i < loadinfo->ehdr.e_shnum; i++)
+        {
+#  ifdef CONFIG_ARCH_USE_TEXT_HEAP
+          if (up_textheap_heapmember((FAR void *)loadinfo->sectalloc[i]))
+            {
+              up_textheap_free((FAR void *)loadinfo->sectalloc[i]);
+              continue;
+            }

Review Comment:
   ```suggestion
                 up_textheap_free((FAR void *)loadinfo->sectalloc[i]);
               }
             else
   ```



##########
include/nuttx/lib/modlib.h:
##########
@@ -191,6 +195,10 @@ struct mod_loadinfo_s
    * after the module has been loaded.
    */
 
+#ifdef CONFIG_ARCH_USE_SEPARATED_SECTION
+  uintptr_t    *sectalloc;   /* All sections memory allocated when ELF file 
was loaded */

Review Comment:
   ```suggestion
     FAR uintptr_t    *sectalloc;   /* All sections memory allocated when ELF 
file was loaded */
   ```



##########
libs/libc/modlib/modlib_getsymbol.c:
##########
@@ -0,0 +1,115 @@
+/****************************************************************************
+ * libs/libc/modlib/modlib_getsymbol.c
+ *
+ * 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.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <assert.h>
+#include <debug.h>
+#include <errno.h>
+
+#include <nuttx/lib/modlib.h>
+#include <nuttx/symtab.h>
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: modlib_getsymbol
+ *
+ * Description:
+ *   modlib_getsymbol() returns the address of a symbol defined within the
+ *   object that was previously made accessible through a modlib_getsymbol()
+ *   call.  handle is the value returned from a call to modlib_insert() (and
+ *   which has not since been released via a call to modlib_remove()),
+ *   name is the symbol's name as a character string.
+ *
+ *   The returned symbol address will remain valid until modlib_remove() is
+ *   called.
+ *
+ * Input Parameters:
+ *   handle - The opaque, non-NULL value returned by a previous successful
+ *            call to modlib_insert().
+ *   name   - A pointer to the symbol name string.
+ *
+ * Returned Value:
+ *   The address associated with the symbol is returned on success.
+ *   If handle does not refer to a valid module opened by modlib_insert(),
+ *   or if the named modlib_symbol cannot be found within any of the objects
+ *   associated with handle, modlib_getsymbol() will return NULL and the
+ *   errno variable will be set appropriately.
+ *
+ *   NOTE: This means that the address zero can never be a valid return
+ *   value.
+ *
+ ****************************************************************************/
+
+FAR const void *modlib_getsymbol(FAR void *handle, FAR const char *name)
+{
+  FAR struct module_s *modp = (FAR struct module_s *)handle;
+  FAR const struct symtab_s *symbol;
+  int err;
+  int ret;
+
+  /* Verify that the module is in the registry */
+
+  modlib_registry_lock();
+  ret = modlib_registry_verify(modp);
+  if (ret < 0)
+    {
+      berr("ERROR: Failed to verify module: %d\n", ret);
+      err = -ret;
+      goto errout_with_lock;
+    }
+
+  /* Does the module have a symbol table? */
+
+  if (modp->modinfo.exports == NULL || modp->modinfo.nexports == 0)
+    {
+      berr("ERROR: Module has no symbol table\n");
+      err = ENOENT;
+      goto errout_with_lock;
+    }
+
+  /* Search the symbol table for the matching symbol */
+
+  symbol = symtab_findbyname(modp->modinfo.exports, name,
+                             modp->modinfo.nexports);
+  if (symbol == NULL)
+    {
+      berr("ERROR: Failed to find symbol in symbol \"%s\" in table\n", name);
+      err = ENOENT;
+      goto errout_with_lock;
+    }

Review Comment:
   ```suggestion
     modlib_registry_unlock();
     if (symbol == NULL)
       {
         berr("ERROR: Failed to find symbol in symbol \"%s\" in table\n", name);
         set_errno(ENOENT);
         return NULL;
       }
   ```



##########
libs/libc/modlib/modlib_load.c:
##########
@@ -56,6 +56,69 @@
  * Private Functions
  ****************************************************************************/
 
+#ifdef CONFIG_ARCH_USE_SEPARATED_SECTION
+static int modlib_section_alloc(FAR struct mod_loadinfo_s *loadinfo,
+                                FAR Elf_Shdr *shdr, uint8_t idx)
+{
+  if (loadinfo->ehdr.e_type != ET_REL)
+    {
+      return -EINVAL;
+    }
+
+  if (loadinfo->sectalloc == NULL)
+    {
+      /* Allocate memory info for all sections */
+
+      loadinfo->sectalloc = lib_zalloc(sizeof(uintptr_t) *
+                                      loadinfo->ehdr.e_shnum);

Review Comment:
   ```suggestion
                                          loadinfo->ehdr.e_shnum);
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to