X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=src%2Flibelfu%2Fmodelops%2FtoFile.c;h=b42bc08076cfa6bf1dea720eb58d83ad8236bb3e;hb=e68a6c6cc16279c72e270daae0548ea7c0f11c6e;hp=ff01390b27c1c293a7d19a2f53cc644a03a93eb3;hpb=fb56823e86ceff5e340a691ef2a6d5df81e02fac;p=centaur.git diff --git a/src/libelfu/modelops/toFile.c b/src/libelfu/modelops/toFile.c index ff01390..b42bc08 100644 --- a/src/libelfu/modelops/toFile.c +++ b/src/libelfu/modelops/toFile.c @@ -4,34 +4,22 @@ #include -static void modelToPhdrs(ElfuElf *me, Elf *e) +static void* modelToPhdr(ElfuElf *me, ElfuPhdr *mp, void *aux1, void *aux2) { - ElfuPhdr *mp; - size_t i; + size_t *i = (size_t*)aux1; + Elf *e = (Elf*)aux2; - /* Count PHDRs */ - i = 0; - CIRCLEQ_FOREACH(mp, &me->phdrList, elem) { - i++; + if (!gelf_update_phdr (e, *i, &mp->phdr)) { + ELFU_WARNELF("gelf_update_phdr"); } - if (!gelf_newphdr(e, i)) { - ELFU_WARNELF("gelf_newphdr"); - } - - /* Copy PHDRs */ - i = 0; - CIRCLEQ_FOREACH(mp, &me->phdrList, elem) { - if (!gelf_update_phdr (e, i, &mp->phdr)) { - ELFU_WARNELF("gelf_update_phdr"); - } + *i += 1; - i++; - } + /* Continue */ + return NULL; } - static void* modelToSection(ElfuElf *me, ElfuScn *ms, void *aux1, void *aux2) { Elf_Scn *scnOut; @@ -82,6 +70,8 @@ static void* modelToSection(ElfuElf *me, ElfuScn *ms, void *aux1, void *aux2) void elfu_mToElf(ElfuElf *me, Elf *e) { + size_t i = 0; + if (me->symtab) { elfu_mSymtabFlatten(me); } @@ -114,8 +104,13 @@ void elfu_mToElf(ElfuElf *me, Elf *e) /* PHDRs */ - modelToPhdrs(me, e); + if (!gelf_newphdr(e, elfu_mPhdrCount(me))) { + ELFU_WARNELF("gelf_newphdr"); + } + + elfu_mPhdrForall(me, modelToPhdr, &i, e); + /* Done */ elf_flagelf(e, ELF_C_SET, ELF_F_DIRTY); }