elf_symtab: Allow passing the name of the symtab to be parsed

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Arnaldo Carvalho de Melo 2009-03-25 18:02:48 -03:00
parent 33cec4c457
commit ba47890b18
2 changed files with 16 additions and 6 deletions

View File

@ -17,10 +17,13 @@
#define HASHSYMS__BITS 8
#define HASHSYMS__SIZE (1UL << HASHSYMS__BITS)
struct elf_symtab *elf_symtab__new(Elf *elf, GElf_Ehdr *ehdr)
struct elf_symtab *elf_symtab__new(const char *name, Elf *elf, GElf_Ehdr *ehdr)
{
if (name == NULL)
name = ".symtab";
GElf_Shdr shdr;
Elf_Scn *sec = elf_section_by_name(elf, ehdr, &shdr, ".symtab");
Elf_Scn *sec = elf_section_by_name(elf, ehdr, &shdr, name);
if (sec == NULL)
return NULL;
@ -32,21 +35,27 @@ struct elf_symtab *elf_symtab__new(Elf *elf, GElf_Ehdr *ehdr)
if (self == NULL)
return NULL;
self->name = strdup(name);
if (self->name == NULL)
goto out_delete;
self->syms = elf_getdata(sec, NULL);
if (self->syms == NULL)
goto out_delete;
goto out_free_name;
sec = elf_getscn(elf, shdr.sh_link);
if (sec == NULL)
goto out_delete;
goto out_free_name;
self->symstrs = elf_getdata(sec, NULL);
if (self->symstrs == NULL)
goto out_delete;
goto out_free_name;
self->nr_syms = shdr.sh_size / shdr.sh_entsize;
return self;
out_free_name:
free(self->name);
out_delete:
free(self);
return NULL;

View File

@ -18,9 +18,10 @@ struct elf_symtab {
uint32_t nr_syms;
Elf_Data *syms;
Elf_Data *symstrs;
char *name;
};
struct elf_symtab *elf_symtab__new(Elf *elf, GElf_Ehdr *ehdr);
struct elf_symtab *elf_symtab__new(const char *name, Elf *elf, GElf_Ehdr *ehdr);
void elf_symtab__delete(struct elf_symtab *self);
static inline uint32_t elf_symtab__nr_symbols(const struct elf_symtab *self)