nealef commented on code in PR #7202:
URL: https://github.com/apache/incubator-nuttx/pull/7202#discussion_r981863910


##########
libs/libc/modlib/modlib_bind.c:
##########
@@ -518,6 +518,228 @@ static int modlib_relocateadd(FAR struct module_s *modp,
   return ret;
 }
 
+/****************************************************************************
+ * Name: modlib_relocatedyn
+ *
+ * Description:
+ *   Perform all relocations associated with a dynamic section.
+ *
+ * Returned Value:
+ *   0 (OK) is returned on success and a negated errno is returned on
+ *   failure.
+ *
+ ****************************************************************************/
+
+static int modlib_relocatedyn(FAR struct module_s *modp,
+                              FAR struct mod_loadinfo_s *loadinfo, int relidx)
+
+{
+  FAR Elf32_Shdr *shdr = &loadinfo->shdr[relidx];
+  FAR Elf32_Shdr *symhdr;
+  FAR Elf32_Dyn  *dyn = NULL;
+  FAR Elf32_Rel  *rels = NULL;
+  FAR Elf32_Rel  *rel;
+  FAR Elf32_Sym  *sym = NULL;
+  uintptr_t       addr;
+  int             ret;
+  int             i, iRel, iSym;
+  struct {
+       int     strOff;         /* Offset to string table */
+       int     symOff;         /* Offset to symbol table */
+       int     lSymTab;        /* Size of symbol table */
+       int     relEntSz;       /* Size of relocation entry */
+       int     relOff[2];      /* Offset to the relocation section */
+       int     relSz[2];       /* Size of relocation table */
+#define I_REL  0
+#define I_PLT  1
+#define N_RELS 2
+  } relData;
+
+  dyn = lib_malloc(shdr->sh_size);
+  ret = modlib_read(loadinfo, (FAR uint8_t *) dyn, shdr->sh_size, 
shdr->sh_offset);
+  if (ret < 0) 
+    {
+      berr("Failed to read dynamic section header");
+      return ret;
+    }
+
+  rels = lib_malloc(CONFIG_MODLIB_RELOCATION_BUFFERCOUNT * sizeof(Elf32_Rel));
+  if (!rels)
+    {
+      berr("Failed to allocate memory for elf relocation rels\n");
+      lib_free(dyn);
+      return -ENOMEM;
+    }
+
+  memset((void *) &relData, 0, sizeof(relData));
+
+  for (i = 0; dyn[i].d_tag != DT_NULL; i++) 
+    {
+      switch(dyn[i].d_tag) 
+       {
+          case DT_REL :
+              relData.relOff[I_REL] = dyn[i].d_un.d_val;
+              break;
+          case DT_RELSZ :
+              relData.relSz[I_REL] = dyn[i].d_un.d_val;
+              break;
+          case DT_RELENT :
+              relData.relEntSz = dyn[i].d_un.d_val;
+              break;
+         case DT_SYMTAB :
+             relData.symOff = dyn[i].d_un.d_val;
+             break;
+         case DT_STRTAB :
+             relData.strOff = dyn[i].d_un.d_val;
+             break;
+         case DT_JMPREL :
+             relData.relOff[I_PLT] = dyn[i].d_un.d_val;
+             break;
+         case DT_PLTRELSZ :
+             relData.relSz[I_PLT] = dyn[i].d_un.d_val;
+             break;
+        }
+    }
+
+  symhdr = &loadinfo->shdr[loadinfo->dsymtabidx];
+  sym = lib_malloc(symhdr->sh_size);
+  if (!sym)
+    {
+      berr("Error obtaining storage for dynamic symbol table");
+      lib_free(rels);
+      lib_free(dyn);
+      return -ENOMEM;
+    }
+
+  ret = modlib_read(loadinfo, (uint8_t *) sym, symhdr->sh_size, 
symhdr->sh_offset);
+  if (ret < 0) 
+    {
+      berr("Error reading dynamic symbol table - %d", ret);
+      lib_free(sym);
+      lib_free(rels);
+      lib_free(dyn);
+      return ret;
+    }
+
+  relData.lSymTab = relData.strOff - relData.symOff;
+
+  for (iRel = 0; iRel < N_RELS; iRel++)
+    {
+      if (relData.relOff[iRel] == 0)
+          continue;
+
+      /* Examine each relocation in the .rel.* section.
+       */

Review Comment:
   Fixed



##########
libs/libc/modlib/modlib_bind.c:
##########
@@ -518,6 +518,228 @@ static int modlib_relocateadd(FAR struct module_s *modp,
   return ret;
 }
 
+/****************************************************************************
+ * Name: modlib_relocatedyn
+ *
+ * Description:
+ *   Perform all relocations associated with a dynamic section.
+ *
+ * Returned Value:
+ *   0 (OK) is returned on success and a negated errno is returned on
+ *   failure.
+ *
+ ****************************************************************************/
+
+static int modlib_relocatedyn(FAR struct module_s *modp,
+                              FAR struct mod_loadinfo_s *loadinfo, int relidx)
+
+{
+  FAR Elf32_Shdr *shdr = &loadinfo->shdr[relidx];
+  FAR Elf32_Shdr *symhdr;
+  FAR Elf32_Dyn  *dyn = NULL;
+  FAR Elf32_Rel  *rels = NULL;
+  FAR Elf32_Rel  *rel;
+  FAR Elf32_Sym  *sym = NULL;
+  uintptr_t       addr;
+  int             ret;
+  int             i, iRel, iSym;
+  struct {
+       int     strOff;         /* Offset to string table */
+       int     symOff;         /* Offset to symbol table */
+       int     lSymTab;        /* Size of symbol table */
+       int     relEntSz;       /* Size of relocation entry */
+       int     relOff[2];      /* Offset to the relocation section */
+       int     relSz[2];       /* Size of relocation table */
+#define I_REL  0
+#define I_PLT  1
+#define N_RELS 2
+  } relData;
+
+  dyn = lib_malloc(shdr->sh_size);
+  ret = modlib_read(loadinfo, (FAR uint8_t *) dyn, shdr->sh_size, 
shdr->sh_offset);
+  if (ret < 0) 
+    {
+      berr("Failed to read dynamic section header");
+      return ret;
+    }
+
+  rels = lib_malloc(CONFIG_MODLIB_RELOCATION_BUFFERCOUNT * sizeof(Elf32_Rel));
+  if (!rels)
+    {
+      berr("Failed to allocate memory for elf relocation rels\n");
+      lib_free(dyn);
+      return -ENOMEM;
+    }
+
+  memset((void *) &relData, 0, sizeof(relData));
+
+  for (i = 0; dyn[i].d_tag != DT_NULL; i++) 
+    {
+      switch(dyn[i].d_tag) 
+       {
+          case DT_REL :
+              relData.relOff[I_REL] = dyn[i].d_un.d_val;
+              break;
+          case DT_RELSZ :
+              relData.relSz[I_REL] = dyn[i].d_un.d_val;
+              break;
+          case DT_RELENT :
+              relData.relEntSz = dyn[i].d_un.d_val;
+              break;
+         case DT_SYMTAB :
+             relData.symOff = dyn[i].d_un.d_val;
+             break;
+         case DT_STRTAB :
+             relData.strOff = dyn[i].d_un.d_val;
+             break;
+         case DT_JMPREL :
+             relData.relOff[I_PLT] = dyn[i].d_un.d_val;
+             break;
+         case DT_PLTRELSZ :
+             relData.relSz[I_PLT] = dyn[i].d_un.d_val;
+             break;
+        }
+    }
+
+  symhdr = &loadinfo->shdr[loadinfo->dsymtabidx];
+  sym = lib_malloc(symhdr->sh_size);
+  if (!sym)
+    {
+      berr("Error obtaining storage for dynamic symbol table");
+      lib_free(rels);
+      lib_free(dyn);
+      return -ENOMEM;
+    }
+
+  ret = modlib_read(loadinfo, (uint8_t *) sym, symhdr->sh_size, 
symhdr->sh_offset);
+  if (ret < 0) 
+    {
+      berr("Error reading dynamic symbol table - %d", ret);
+      lib_free(sym);
+      lib_free(rels);
+      lib_free(dyn);
+      return ret;
+    }
+
+  relData.lSymTab = relData.strOff - relData.symOff;
+
+  for (iRel = 0; iRel < N_RELS; iRel++)
+    {
+      if (relData.relOff[iRel] == 0)
+          continue;

Review Comment:
   Fixed



-- 
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: commits-unsubscr...@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to