summaryrefslogtreecommitdiff
path: root/src/libelfu
diff options
context:
space:
mode:
authornorly <ny-git@enpas.org>2013-06-20 23:25:09 +0100
committernorly <ny-git@enpas.org>2013-06-20 23:25:09 +0100
commitfb56823e86ceff5e340a691ef2a6d5df81e02fac (patch)
treedf7750e090cafaaba6572f43929d1d5874e58645 /src/libelfu
parentfd5d1e4f3c968fa87b46ef1ca94f8b613df121ff (diff)
Add Elf/Phdr/Scn alloc/destroy
Diffstat (limited to 'src/libelfu')
-rw-r--r--src/libelfu/model/elf.c51
-rw-r--r--src/libelfu/model/phdr.c19
-rw-r--r--src/libelfu/model/section.c13
-rw-r--r--src/libelfu/modelops/fromFile.c12
4 files changed, 85 insertions, 10 deletions
diff --git a/src/libelfu/model/elf.c b/src/libelfu/model/elf.c
new file mode 100644
index 0000000..46dc120
--- /dev/null
+++ b/src/libelfu/model/elf.c
@@ -0,0 +1,51 @@
+#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);
+}
diff --git a/src/libelfu/model/phdr.c b/src/libelfu/model/phdr.c
index ce395ec..6896845 100644
--- a/src/libelfu/model/phdr.c
+++ b/src/libelfu/model/phdr.c
@@ -60,3 +60,22 @@ ElfuPhdr* elfu_mPhdrAlloc()
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);
+}
diff --git a/src/libelfu/model/section.c b/src/libelfu/model/section.c
index c93c5c8..9ef6fd8 100644
--- a/src/libelfu/model/section.c
+++ b/src/libelfu/model/section.c
@@ -219,3 +219,16 @@ ElfuScn* elfu_mScnAlloc()
return ms;
}
+
+void elfu_mScnDestroy(ElfuScn* ms)
+{
+ assert(ms);
+
+ // TODO: Free symtab/reltab
+
+ if (ms->databuf) {
+ free(ms->databuf);
+ }
+
+ free(ms);
+}
diff --git a/src/libelfu/modelops/fromFile.c b/src/libelfu/modelops/fromFile.c
index 9671b5f..e19df7b 100644
--- a/src/libelfu/modelops/fromFile.c
+++ b/src/libelfu/modelops/fromFile.c
@@ -290,19 +290,11 @@ ElfuElf* elfu_mFromElf(Elf *e)
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);
@@ -473,7 +465,7 @@ ElfuElf* elfu_mFromElf(Elf *e)
free(secArray);
}
if (me) {
- // TODO: Free data structures
+ elfu_mElfDestroy(me);
}
ELFU_WARN("elfu_mFromElf: Failed to load file.\n");