4 #include <libelfu/libelfu.h>
9 void* elfu_mPhdrForall(ElfuElf *me, PhdrHandlerFunc f, void *aux1, void *aux2)
13 CIRCLEQ_FOREACH(mp, &me->phdrList, elem) {
15 void *rv = f(me, mp, aux1, aux2);
20 CIRCLEQ_FOREACH(mp2, &mp->childPhdrList, elemChildPhdr) {
21 void *rv = f(me, mp2, aux1, aux2);
36 static void* subCounter(ElfuElf *me, ElfuPhdr *mp, void *aux1, void *aux2)
38 size_t *i = (size_t*)aux1;
48 size_t elfu_mPhdrCount(ElfuElf *me)
54 elfu_mPhdrForall(me, subCounter, &i, NULL);
63 void elfu_mPhdrUpdateChildOffsets(ElfuPhdr *mp)
69 assert(mp->phdr.p_type == PT_LOAD);
71 CIRCLEQ_FOREACH(mpc, &mp->childPhdrList, elemChildPhdr) {
72 mpc->phdr.p_offset = mp->phdr.p_offset + (mpc->phdr.p_vaddr - mp->phdr.p_vaddr);
75 CIRCLEQ_FOREACH(ms, &mp->childScnList, elemChildScn) {
76 ms->shdr.sh_offset = mp->phdr.p_offset + (ms->shdr.sh_addr - mp->phdr.p_vaddr);
83 * Allocation, destruction
86 ElfuPhdr* elfu_mPhdrAlloc()
90 mp = malloc(sizeof(ElfuPhdr));
92 ELFU_WARN("mPhdrAlloc: malloc() failed for ElfuPhdr.\n");
96 memset(mp, 0, sizeof(*mp));
98 CIRCLEQ_INIT(&mp->childScnList);
99 CIRCLEQ_INIT(&mp->childPhdrList);
104 void elfu_mPhdrDestroy(ElfuPhdr* mp)
111 CIRCLEQ_FOREACH(mp2, &mp->childPhdrList, elem) {
112 CIRCLEQ_REMOVE(&mp->childPhdrList, mp2, elem);
113 elfu_mPhdrDestroy(mp2);
116 CIRCLEQ_FOREACH(ms, &mp->childScnList, elem) {
117 CIRCLEQ_REMOVE(&mp->childScnList, ms, elem);
118 elfu_mScnDestroy(ms);