+#include <err.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
{
int fd;
struct stat sb;
- Elf_Obj *e;
+ Elf_Obj *e = NULL;
+
+ if ((fd = open(filename, O_RDONLY)) == -1)
+ errx(1, "open");
- fd = open(filename, O_RDONLY);
e = (Elf_Obj *)malloc(sizeof(Elf_Obj));
+ if (e == NULL)
+ errx(1, "malloc");
+
e->fd = fd;
- fstat(fd, &sb);
+
+ if (fstat(fd, &sb) == -1)
+ errx(1, "fstat");
+
e->sb = sb;
e->mm = mmap(NULL, sb.st_size, PROT_READ, MAP_SHARED, fd, 0);
+ if (e->mm == MAP_FAILED)
+ errx(1, "mmap");
+
e->ehdr = (Elf_Ehdr *) e->mm;
e->ehdr_size = e->ehdr->e_ehsize;
+ if (e->sb.st_size < sizeof(Elf_Ehdr))
+ errx(1, "not a ELF object");
+
+ if (memcmp(e->ehdr->e_ident, ELFMAG, sizeof(ELFMAG) -1) != 0)
+ errx(1, "not a ELF object");
+
e->shdr = (Elf_Shdr *) (e->mm + e->ehdr->e_shoff);
e->shdr_size = e->ehdr->e_shnum;
e->strtab = NULL;
e->strtab_size = 0;
- return e;
+ return (e);
}
Elf_Shdr *
ptr = &e->shdr[e->ehdr->e_shstrndx];
e->strtab = malloc(ptr->sh_size);
+ if (e->strtab == NULL)
+ errx(1, "malloc %s:%d", __func__, __LINE__);
+
e->strtab_size = ptr->sh_size;
memcpy(e->strtab, (e->mm + ptr->sh_offset), ptr->sh_size);
- return ptr;
+ return (ptr);
}
int
elf_destroy(Elf_Obj *e)
{
if (e == NULL)
- return 1;
+ return (1);
+
+ if (e->mm != NULL)
+ if (munmap(e->mm, e->sb.st_size) == -1)
+ return (1);
- munmap(e->mm, e->sb.st_size);
close(e->fd);
+
if (e->strtab != NULL)
free(e->strtab);
+
free(e);
- return 0;
+ return (0);
+}
+
+char *
+elf_str_get(Elf_Obj *e, int index) {
+ if (e == NULL || index > e->strtab_size)
+ return (NULL);
+
+ return (&e->strtab[e->shdr[index].sh_name]);
}
int
char *section_name = NULL;
for (i=0; i < e->shdr_size; i++) {
- section_name = &e->strtab[e->shdr[i].sh_name];
+ section_name = elf_str_get(e, i);
if (strnstr(section_name, debug_prefix, strlen(debug_prefix))) {
- //printf("%s\n", section_name);
has_debug++;
}
-
}
- return has_debug;
+ return (has_debug);
+}
}
#include <sys/stat.h>
typedef struct Elf_Obj {
- int fd;
- struct stat sb;
- char *mm;
- char *strtab;
- size_t strtab_size;
- Elf_Ehdr *ehdr;
- size_t ehdr_size;
- Elf_Shdr *shdr;
- size_t shdr_size;
+ int fd; /* file descriptor */
+ struct stat sb; /* file stat */
+ char *mm; /* memory mapping */
+ char *strtab; /* string table */
+ size_t strtab_size; /* string table size */
+ Elf_Ehdr *ehdr; /* header pointer */
+ size_t ehdr_size; /* header size */
+ Elf_Shdr *shdr; /* section header pointer */
+ size_t shdr_size; /* section header size */
} Elf_Obj;
-Elf_Obj *elf_init(const char *filename);
+Elf_Obj *elf_init(const char *);
int elf_destroy(Elf_Obj *);
Elf_Shdr *elf_strtab(Elf_Obj *);
+char *elf_str_get(Elf_Obj *, int);
int elf_debug(Elf_Obj *);