size_t elfu_mPhdrCount(ElfuElf *me);
void elfu_mPhdrUpdateChildOffsets(ElfuPhdr *mp);
ElfuPhdr* elfu_mPhdrAlloc();
+ void elfu_mPhdrDestroy(ElfuPhdr* mp);
typedef void* (SectionHandlerFunc)(ElfuElf *me, ElfuScn *ms, void *aux1, void *aux2);
char* elfu_mScnName(ElfuElf *me, ElfuScn *ms);
ElfuScn** elfu_mScnSortedByOffset(ElfuElf *me, size_t *count);
ElfuScn* elfu_mScnAlloc();
+ void elfu_mScnDestroy(ElfuScn* ms);
+
+
+ElfuElf* elfu_mElfAlloc();
+ void elfu_mElfDestroy(ElfuElf* me);
GElf_Addr elfu_mLayoutGetSpaceInPhdr(ElfuElf *me, GElf_Word size,
}
break;
case 'i':
+ if (me) {
+ elfu_mElfDestroy(me);
+ }
+
printf("Opening input file %s.\n", optarg);
openElf(&hIn, optarg, ELF_C_READ);
if (!hIn.e) {
EXIT:
+ if (me) {
+ elfu_mElfDestroy(me);
+ }
+
if (hIn.e) {
closeElf(&hIn);
}
--- /dev/null
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+#include <libelfu/libelfu.h>
+
+
+/*
+ * Allocation, destruction
+ */
+
+ElfuElf* elfu_mElfAlloc()
+{
+ ElfuElf *me;
+
+ me = malloc(sizeof(ElfuElf));
+ if (!me) {
+ ELFU_WARN("mElfAlloc: malloc() failed for ElfuElf.\n");
+ return NULL;
+ }
+
+ memset(me, 0, sizeof(*me));
+
+ CIRCLEQ_INIT(&me->phdrList);
+ CIRCLEQ_INIT(&me->orphanScnList);
+
+ return me;
+}
+
+
+void elfu_mElfDestroy(ElfuElf* me)
+{
+ ElfuPhdr *mp;
+ ElfuScn *ms;
+
+ assert(me);
+
+ CIRCLEQ_INIT(&me->phdrList);
+ CIRCLEQ_INIT(&me->orphanScnList);
+
+ CIRCLEQ_FOREACH(mp, &me->phdrList, elem) {
+ CIRCLEQ_REMOVE(&me->phdrList, mp, elem);
+ elfu_mPhdrDestroy(mp);
+ }
+
+ CIRCLEQ_FOREACH(ms, &me->orphanScnList, elem) {
+ CIRCLEQ_REMOVE(&me->orphanScnList, ms, elem);
+ elfu_mScnDestroy(ms);
+ }
+
+ free(me);
+}
return mp;
}
+
+void elfu_mPhdrDestroy(ElfuPhdr* mp)
+{
+ ElfuPhdr *mp2;
+ ElfuScn *ms;
+
+ assert(mp);
+
+ CIRCLEQ_FOREACH(mp2, &mp->childPhdrList, elem) {
+ // TODO ?
+ }
+
+ CIRCLEQ_FOREACH(ms, &mp->childScnList, elem) {
+ CIRCLEQ_REMOVE(&mp->childScnList, ms, elem);
+ elfu_mScnDestroy(ms);
+ }
+
+ free(mp);
+}
return ms;
}
+
+void elfu_mScnDestroy(ElfuScn* ms)
+{
+ assert(ms);
+
+ // TODO: Free symtab/reltab
+
+ if (ms->databuf) {
+ free(ms->databuf);
+ }
+
+ free(ms);
+}
goto ERROR;
}
- me = malloc(sizeof(ElfuElf));
+ me = elfu_mElfAlloc();
if (!me) {
- ELFU_WARN("elfu_mFromElf: malloc() failed for ElfuElf.\n");
goto ERROR;
}
-
- /* General stuff */
- CIRCLEQ_INIT(&me->phdrList);
- CIRCLEQ_INIT(&me->orphanScnList);
- me->shstrtab = NULL;
- me->symtab = NULL;
-
me->elfclass = gelf_getclass(e);
assert(me->elfclass != ELFCLASSNONE);
assert(gelf_getehdr(e, &me->ehdr) == &me->ehdr);
free(secArray);
}
if (me) {
- // TODO: Free data structures
+ elfu_mElfDestroy(me);
}
ELFU_WARN("elfu_mFromElf: Failed to load file.\n");