libcamera: ipa_module: Share code to find section header of ELF header

Refactor the code to find section into a common helper function.
This commit introduces no functional changes.

Signed-off-by: Umang Jain <email@uajain.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Umang Jain 2020-06-07 14:30:18 +00:00 committed by Laurent Pinchart
parent 79f9625607
commit 6f6da7f854

View file

@ -88,6 +88,15 @@ int elfVerifyIdent(Span<uint8_t> elf)
return 0; return 0;
} }
ElfW(Shdr) *elfSection(Span<uint8_t> elf, ElfW(Ehdr) *eHdr, ElfW(Half) idx)
{
if (idx >= eHdr->e_shnum)
return nullptr;
off_t offset = eHdr->e_shoff + idx * eHdr->e_shentsize;
return elfPointer<ElfW(Shdr)>(elf, offset);
}
/** /**
* \brief Retrieve address and size of a symbol from an mmap'ed ELF file * \brief Retrieve address and size of a symbol from an mmap'ed ELF file
* \param[in] elf Address and size of mmap'ed ELF file * \param[in] elf Address and size of mmap'ed ELF file
@ -102,8 +111,7 @@ Span<uint8_t> elfLoadSymbol(Span<uint8_t> elf, const char *symbol)
if (!eHdr) if (!eHdr)
return {}; return {};
off_t offset = eHdr->e_shoff + eHdr->e_shentsize * eHdr->e_shstrndx; ElfW(Shdr) *sHdr = elfSection(elf, eHdr, eHdr->e_shstrndx);
ElfW(Shdr) *sHdr = elfPointer<ElfW(Shdr)>(elf, offset);
if (!sHdr) if (!sHdr)
return {}; return {};
off_t shnameoff = sHdr->sh_offset; off_t shnameoff = sHdr->sh_offset;
@ -111,12 +119,11 @@ Span<uint8_t> elfLoadSymbol(Span<uint8_t> elf, const char *symbol)
/* Locate .dynsym section header. */ /* Locate .dynsym section header. */
ElfW(Shdr) *dynsym = nullptr; ElfW(Shdr) *dynsym = nullptr;
for (unsigned int i = 0; i < eHdr->e_shnum; i++) { for (unsigned int i = 0; i < eHdr->e_shnum; i++) {
offset = eHdr->e_shoff + eHdr->e_shentsize * i; sHdr = elfSection(elf, eHdr, i);
sHdr = elfPointer<ElfW(Shdr)>(elf, offset);
if (!sHdr) if (!sHdr)
return {}; return {};
offset = shnameoff + sHdr->sh_name; off_t offset = shnameoff + sHdr->sh_name;
char *name = elfPointer<char[8]>(elf, offset); char *name = elfPointer<char[8]>(elf, offset);
if (!name) if (!name)
return {}; return {};
@ -132,8 +139,7 @@ Span<uint8_t> elfLoadSymbol(Span<uint8_t> elf, const char *symbol)
return {}; return {};
} }
offset = eHdr->e_shoff + eHdr->e_shentsize * dynsym->sh_link; sHdr = elfSection(elf, eHdr, dynsym->sh_link);
sHdr = elfPointer<ElfW(Shdr)>(elf, offset);
if (!sHdr) if (!sHdr)
return {}; return {};
off_t dynsym_nameoff = sHdr->sh_offset; off_t dynsym_nameoff = sHdr->sh_offset;
@ -142,7 +148,7 @@ Span<uint8_t> elfLoadSymbol(Span<uint8_t> elf, const char *symbol)
ElfW(Sym) *targetSymbol = nullptr; ElfW(Sym) *targetSymbol = nullptr;
unsigned int dynsym_num = dynsym->sh_size / dynsym->sh_entsize; unsigned int dynsym_num = dynsym->sh_size / dynsym->sh_entsize;
for (unsigned int i = 0; i < dynsym_num; i++) { for (unsigned int i = 0; i < dynsym_num; i++) {
offset = dynsym->sh_offset + dynsym->sh_entsize * i; off_t offset = dynsym->sh_offset + dynsym->sh_entsize * i;
ElfW(Sym) *sym = elfPointer<ElfW(Sym)>(elf, offset); ElfW(Sym) *sym = elfPointer<ElfW(Sym)>(elf, offset);
if (!sym) if (!sym)
return {}; return {};
@ -165,13 +171,10 @@ Span<uint8_t> elfLoadSymbol(Span<uint8_t> elf, const char *symbol)
} }
/* Locate and return data of symbol. */ /* Locate and return data of symbol. */
if (targetSymbol->st_shndx >= eHdr->e_shnum) sHdr = elfSection(elf, eHdr, targetSymbol->st_shndx);
return {};
offset = eHdr->e_shoff + targetSymbol->st_shndx * eHdr->e_shentsize;
sHdr = elfPointer<ElfW(Shdr)>(elf, offset);
if (!sHdr) if (!sHdr)
return {}; return {};
offset = sHdr->sh_offset + (targetSymbol->st_value - sHdr->sh_addr); off_t offset = sHdr->sh_offset + (targetSymbol->st_value - sHdr->sh_addr);
uint8_t *data = elfPointer<uint8_t>(elf, offset, targetSymbol->st_size); uint8_t *data = elfPointer<uint8_t>(elf, offset, targetSymbol->st_size);
if (!data) if (!data)
return {}; return {};