summaryrefslogtreecommitdiff
path: root/src/libelfu/model
diff options
context:
space:
mode:
Diffstat (limited to 'src/libelfu/model')
-rw-r--r--src/libelfu/model/elf.c51
-rw-r--r--src/libelfu/model/phdr.c19
-rw-r--r--src/libelfu/model/section.c13
3 files changed, 83 insertions, 0 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);
+}