diff options
Diffstat (limited to 'src/libelfu/model')
-rw-r--r-- | src/libelfu/model/elf.c | 51 | ||||
-rw-r--r-- | src/libelfu/model/phdr.c | 19 | ||||
-rw-r--r-- | src/libelfu/model/section.c | 13 |
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); +} |