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