Add Elf/Phdr/Scn alloc/destroy
authornorly <ny-git@enpas.org>
Thu, 20 Jun 2013 22:25:09 +0000 (23:25 +0100)
committernorly <ny-git@enpas.org>
Thu, 20 Jun 2013 22:25:09 +0000 (23:25 +0100)
include/libelfu/modelops.h
src/elfucli.c
src/libelfu/model/elf.c [new file with mode: 0644]
src/libelfu/model/phdr.c
src/libelfu/model/section.c
src/libelfu/modelops/fromFile.c

index 3dc44d854b611a810649fa0885c1e91b4e30b87c..afe6b96947f4e4a6620761859eb20f4af95318cd 100644 (file)
@@ -21,6 +21,7 @@ void elfu_mRelocate(ElfuElf *metarget, ElfuScn *mstarget, ElfuScn *msrt);
    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);
@@ -31,6 +32,11 @@ typedef void* (SectionHandlerFunc)(ElfuElf *me, ElfuScn *ms, void *aux1, void *a
     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,
index cd8f0baa378d618dba1a2076e86706348ec124e1..b3ea29f2440381c68f685c051215cdc3da8cdc27 100644 (file)
@@ -84,6 +84,10 @@ int main(int argc, char **argv)
         }
         break;
       case 'i':
+        if (me) {
+          elfu_mElfDestroy(me);
+        }
+
         printf("Opening input file %s.\n", optarg);
         openElf(&hIn, optarg, ELF_C_READ);
         if (!hIn.e) {
@@ -200,6 +204,10 @@ int main(int argc, char **argv)
 
 
 EXIT:
+  if (me) {
+    elfu_mElfDestroy(me);
+  }
+
   if (hIn.e) {
     closeElf(&hIn);
   }
diff --git a/src/libelfu/model/elf.c b/src/libelfu/model/elf.c
new file mode 100644 (file)
index 0000000..46dc120
--- /dev/null
@@ -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);
+}
index ce395ec2b5e78999ec76040e126a4b9dd42f72db..6896845f482bd8aac3b5c97aea48255e119a0c2f 100644 (file)
@@ -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);
+}
index c93c5c80b37114a9a3470bd803af553a9dfcbb83..9ef6fd8f342d89858f52326cbd399ddab83b82ec 100644 (file)
@@ -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);
+}
index 9671b5fc0f402858ef3f53bb58ffa5ef6637dae0..e19df7b42f18e8a35416732aff8ba100695dcd2b 100644 (file)
@@ -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");