Cleaner ElfuPhdr alloc
[centaur.git] / src / libelfu / model / phdr.c
1 #include <assert.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <libelfu/libelfu.h>
5
6
7 size_t elfu_mPhdrCount(ElfuElf *me)
8 {
9   ElfuPhdr *mp;
10   size_t i = 0;
11
12   assert(me);
13
14   CIRCLEQ_FOREACH(mp, &me->phdrList, elem) {
15     i++;
16   }
17
18   return i;
19 }
20
21
22
23 void elfu_mPhdrUpdateChildOffsets(ElfuPhdr *mp)
24 {
25   ElfuScn *ms;
26   ElfuPhdr *mpc;
27
28   assert(mp);
29   assert(mp->phdr.p_type == PT_LOAD);
30
31   CIRCLEQ_FOREACH(mpc, &mp->childPhdrList, elemChildPhdr) {
32     mpc->phdr.p_offset = mp->phdr.p_offset + (mpc->phdr.p_vaddr - mp->phdr.p_vaddr);
33   }
34
35   CIRCLEQ_FOREACH(ms, &mp->childScnList, elemChildScn) {
36     ms->shdr.sh_offset = mp->phdr.p_offset + (ms->shdr.sh_addr - mp->phdr.p_vaddr);
37   }
38 }
39
40
41
42 /*
43  * Allocation, destruction
44  */
45
46 ElfuPhdr* elfu_mPhdrAlloc()
47 {
48   ElfuPhdr *mp;
49
50   mp = malloc(sizeof(ElfuPhdr));
51   if (!mp) {
52     ELFU_WARN("mPhdrAlloc: malloc() failed for ElfuPhdr.\n");
53     return NULL;
54   }
55
56   memset(mp, 0, sizeof(*mp));
57
58   CIRCLEQ_INIT(&mp->childScnList);
59   CIRCLEQ_INIT(&mp->childPhdrList);
60
61   return mp;
62 }