Mention function offsets when meaningful
This commit is contained in:
parent
3207b9e855
commit
96ff511844
@ -365,8 +365,8 @@ static int _decode32_addr(FormatPlugin * format, Elf32_Ehdr * ehdr,
|
|||||||
static int _decode32_strtab(FormatPlugin * format, Elf32_Shdr * shdr,
|
static int _decode32_strtab(FormatPlugin * format, Elf32_Shdr * shdr,
|
||||||
size_t shdr_cnt, uint16_t ndx, char ** strtab,
|
size_t shdr_cnt, uint16_t ndx, char ** strtab,
|
||||||
size_t * strtab_cnt);
|
size_t * strtab_cnt);
|
||||||
static int _decode32_symtab(FormatPlugin * format, Elf32_Shdr * shdr,
|
static int _decode32_symtab(FormatPlugin * format, Elf32_Ehdr * ehdr,
|
||||||
size_t shdr_cnt, uint16_t ndx);
|
Elf32_Shdr * shdr, size_t shdr_cnt, uint16_t ndx);
|
||||||
|
|
||||||
static int _elf_decode32(FormatPlugin * format, int raw)
|
static int _elf_decode32(FormatPlugin * format, int raw)
|
||||||
{
|
{
|
||||||
@ -402,7 +402,7 @@ static int _elf_decode32(FormatPlugin * format, int raw)
|
|||||||
if(shdr[i].sh_type == SHT_SYMTAB)
|
if(shdr[i].sh_type == SHT_SYMTAB)
|
||||||
{
|
{
|
||||||
/* XXX ignore errors? */
|
/* XXX ignore errors? */
|
||||||
_decode32_symtab(format, shdr, ehdr.e_shnum, i);
|
_decode32_symtab(format, &ehdr, shdr, ehdr.e_shnum, i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
for(i = 0; i < ehdr.e_shnum; i++)
|
for(i = 0; i < ehdr.e_shnum; i++)
|
||||||
@ -505,14 +505,15 @@ static int _decode32_strtab(FormatPlugin * format, Elf32_Shdr * shdr,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _decode32_symtab(FormatPlugin * format, Elf32_Shdr * shdr,
|
static int _decode32_symtab(FormatPlugin * format, Elf32_Ehdr * ehdr,
|
||||||
size_t shdr_cnt, uint16_t ndx)
|
Elf32_Shdr * shdr, size_t shdr_cnt, uint16_t ndx)
|
||||||
{
|
{
|
||||||
FormatPluginHelper * helper = format->helper;
|
FormatPluginHelper * helper = format->helper;
|
||||||
char * strtab = NULL;
|
char * strtab = NULL;
|
||||||
size_t strtab_cnt = 0;
|
size_t strtab_cnt = 0;
|
||||||
Elf32_Sym sym;
|
Elf32_Sym sym;
|
||||||
size_t i;
|
size_t i;
|
||||||
|
off_t offset;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf(stderr, "DEBUG: %s()\n", __func__);
|
fprintf(stderr, "DEBUG: %s()\n", __func__);
|
||||||
@ -523,8 +524,9 @@ static int _decode32_symtab(FormatPlugin * format, Elf32_Shdr * shdr,
|
|||||||
&strtab_cnt) != 0)
|
&strtab_cnt) != 0)
|
||||||
return -1;
|
return -1;
|
||||||
/* read and process symbols */
|
/* read and process symbols */
|
||||||
if(helper->seek(helper->format, shdr[ndx].sh_offset, SEEK_SET)
|
if((offset = helper->seek(helper->format, shdr[ndx].sh_offset,
|
||||||
!= shdr[ndx].sh_offset)
|
SEEK_SET)) < 0
|
||||||
|
|| (unsigned long)offset != shdr[ndx].sh_offset)
|
||||||
{
|
{
|
||||||
free(strtab);
|
free(strtab);
|
||||||
return -1;
|
return -1;
|
||||||
@ -536,9 +538,15 @@ static int _decode32_symtab(FormatPlugin * format, Elf32_Shdr * shdr,
|
|||||||
else if(sym.st_name >= strtab_cnt)
|
else if(sym.st_name >= strtab_cnt)
|
||||||
break;
|
break;
|
||||||
else if(ELF32_ST_TYPE(sym.st_info) == STT_FUNC)
|
else if(ELF32_ST_TYPE(sym.st_info) == STT_FUNC)
|
||||||
|
{
|
||||||
|
offset = -1;
|
||||||
|
if(ehdr->e_type &= ET_REL)
|
||||||
|
offset = sym.st_value;
|
||||||
/* record the function */
|
/* record the function */
|
||||||
helper->set_function(helper->format, sym.st_value,
|
helper->set_function(helper->format, i,
|
||||||
&strtab[sym.st_name], -1, sym.st_size);
|
&strtab[sym.st_name], sym.st_value,
|
||||||
|
sym.st_size);
|
||||||
|
}
|
||||||
if(i * sizeof(sym) != shdr[ndx].sh_size)
|
if(i * sizeof(sym) != shdr[ndx].sh_size)
|
||||||
{
|
{
|
||||||
free(strtab);
|
free(strtab);
|
||||||
@ -556,8 +564,8 @@ static int _decode64_addr(FormatPlugin * format, Elf64_Ehdr * ehdr,
|
|||||||
static int _decode64_strtab(FormatPlugin * format, Elf64_Shdr * shdr,
|
static int _decode64_strtab(FormatPlugin * format, Elf64_Shdr * shdr,
|
||||||
size_t shdr_cnt, uint16_t ndx, char ** strtab,
|
size_t shdr_cnt, uint16_t ndx, char ** strtab,
|
||||||
size_t * strtab_cnt);
|
size_t * strtab_cnt);
|
||||||
static int _decode64_symtab(FormatPlugin * format, Elf64_Shdr * shdr,
|
static int _decode64_symtab(FormatPlugin * format, Elf64_Ehdr * ehdr,
|
||||||
size_t shdr_cnt, uint16_t ndx);
|
Elf64_Shdr * shdr, size_t shdr_cnt, uint16_t ndx);
|
||||||
|
|
||||||
static int _elf_decode64(FormatPlugin * format, int raw)
|
static int _elf_decode64(FormatPlugin * format, int raw)
|
||||||
{
|
{
|
||||||
@ -592,7 +600,7 @@ static int _elf_decode64(FormatPlugin * format, int raw)
|
|||||||
if(shdr[i].sh_type == SHT_SYMTAB)
|
if(shdr[i].sh_type == SHT_SYMTAB)
|
||||||
{
|
{
|
||||||
/* XXX ignore errors? */
|
/* XXX ignore errors? */
|
||||||
_decode64_symtab(format, shdr, ehdr.e_shnum, i);
|
_decode64_symtab(format, &ehdr, shdr, ehdr.e_shnum, i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
for(i = 0; i < ehdr.e_shnum; i++)
|
for(i = 0; i < ehdr.e_shnum; i++)
|
||||||
@ -696,14 +704,15 @@ static int _decode64_strtab(FormatPlugin * format, Elf64_Shdr * shdr,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _decode64_symtab(FormatPlugin * format, Elf64_Shdr * shdr,
|
static int _decode64_symtab(FormatPlugin * format, Elf64_Ehdr * ehdr,
|
||||||
size_t shdr_cnt, uint16_t ndx)
|
Elf64_Shdr * shdr, size_t shdr_cnt, uint16_t ndx)
|
||||||
{
|
{
|
||||||
FormatPluginHelper * helper = format->helper;
|
FormatPluginHelper * helper = format->helper;
|
||||||
char * strtab = NULL;
|
char * strtab = NULL;
|
||||||
size_t strtab_cnt = 0;
|
size_t strtab_cnt = 0;
|
||||||
Elf64_Sym sym;
|
Elf64_Sym sym;
|
||||||
size_t i;
|
size_t i;
|
||||||
|
off_t offset;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf(stderr, "DEBUG: %s()\n", __func__);
|
fprintf(stderr, "DEBUG: %s()\n", __func__);
|
||||||
@ -714,8 +723,9 @@ static int _decode64_symtab(FormatPlugin * format, Elf64_Shdr * shdr,
|
|||||||
&strtab_cnt) != 0)
|
&strtab_cnt) != 0)
|
||||||
return -1;
|
return -1;
|
||||||
/* read and process symbols */
|
/* read and process symbols */
|
||||||
if(helper->seek(helper->format, shdr[ndx].sh_offset, SEEK_SET)
|
if((offset = helper->seek(helper->format, shdr[ndx].sh_offset,
|
||||||
!= shdr[ndx].sh_offset)
|
SEEK_SET)) < 0
|
||||||
|
|| (unsigned long)offset != shdr[ndx].sh_offset)
|
||||||
{
|
{
|
||||||
free(strtab);
|
free(strtab);
|
||||||
return -1;
|
return -1;
|
||||||
@ -727,9 +737,15 @@ static int _decode64_symtab(FormatPlugin * format, Elf64_Shdr * shdr,
|
|||||||
else if(sym.st_name >= strtab_cnt)
|
else if(sym.st_name >= strtab_cnt)
|
||||||
break;
|
break;
|
||||||
else if(ELF64_ST_TYPE(sym.st_info) == STT_FUNC)
|
else if(ELF64_ST_TYPE(sym.st_info) == STT_FUNC)
|
||||||
|
{
|
||||||
|
offset = -1;
|
||||||
|
if(ehdr->e_type &= ET_REL)
|
||||||
|
offset = sym.st_value;
|
||||||
/* record the function */
|
/* record the function */
|
||||||
helper->set_function(helper->format, sym.st_value,
|
helper->set_function(helper->format, i,
|
||||||
&strtab[sym.st_name], -1, sym.st_size);
|
&strtab[sym.st_name], offset,
|
||||||
|
sym.st_size);
|
||||||
|
}
|
||||||
if(i * sizeof(sym) != shdr[ndx].sh_size)
|
if(i * sizeof(sym) != shdr[ndx].sh_size)
|
||||||
{
|
{
|
||||||
free(strtab);
|
free(strtab);
|
||||||
|
Loading…
Reference in New Issue
Block a user