X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=src%2Fmodelops%2FtoFile.c;h=1fec8b0c51dafb022bf3678862397874dd44b6d3;hb=31a268f63f649cbe1cbcd5047e3a5d7d30f7c397;hp=90dc2478395da38c93ec1187f6630bd9ab0f51b9;hpb=7ba294a5aa715fc03f5ae898b7dcfaef45079f55;p=centaur.git diff --git a/src/modelops/toFile.c b/src/modelops/toFile.c index 90dc247..1fec8b0 100644 --- a/src/modelops/toFile.c +++ b/src/modelops/toFile.c @@ -4,86 +4,6 @@ #include -static void flattenSymtab(ElfuElf *me) -{ - ElfuSym *sym; - size_t numsyms = 0; - - elfu_mLayoutAuto(me); - - /* Update section indexes and count symbols */ - CIRCLEQ_FOREACH(sym, &me->symtab->symtab.syms, elem) { - if (sym->scnptr) { - sym->shndx = elfu_mScnIndex(me, sym->scnptr); - } - - numsyms++; - } - - /* Copy symbols to elfclass-specific format */ - if (me->elfclass == ELFCLASS32) { - size_t newsize = (numsyms + 1) * sizeof(Elf32_Sym); - size_t i; - - if (me->symtab->data.d_buf) { - free(me->symtab->data.d_buf); - } - me->symtab->data.d_buf = malloc(newsize); - assert(me->symtab->data.d_buf); - - me->symtab->data.d_size = newsize; - me->symtab->shdr.sh_size = newsize; - memset(me->symtab->data.d_buf, 0, newsize); - - i = 1; - CIRCLEQ_FOREACH(sym, &me->symtab->symtab.syms, elem) { - Elf32_Sym *es = ((Elf32_Sym*)me->symtab->data.d_buf) + i; - - es->st_name = sym->name; - es->st_value = sym->value; - es->st_size = sym->size; - es->st_info = ELF32_ST_INFO(sym->bind, sym->type); - es->st_other = sym->other; - es->st_shndx = sym->shndx; - - i++; - } - } else if (me->elfclass == ELFCLASS64) { - size_t newsize = (numsyms + 1) * sizeof(Elf64_Sym); - size_t i; - - if (me->symtab->data.d_buf) { - free(me->symtab->data.d_buf); - } - me->symtab->data.d_buf = malloc(newsize); - assert(me->symtab->data.d_buf); - - me->symtab->data.d_size = newsize; - me->symtab->shdr.sh_size = newsize; - memset(me->symtab->data.d_buf, 0, newsize); - - i = 1; - CIRCLEQ_FOREACH(sym, &me->symtab->symtab.syms, elem) { - Elf64_Sym *es = ((Elf64_Sym*)me->symtab->data.d_buf) + i; - - es->st_name = sym->name; - es->st_value = sym->value; - es->st_size = sym->size; - es->st_info = ELF64_ST_INFO(sym->bind, sym->type); - es->st_other = sym->other; - es->st_shndx = sym->shndx; - - i++; - } - } else { - // Unknown elfclass - assert(0); - } - - elfu_mLayoutAuto(me); -} - - static void modelToPhdrs(ElfuElf *me, Elf *e) { ElfuPhdr *mp; @@ -163,7 +83,7 @@ static void* modelToSection(ElfuElf *me, ElfuScn *ms, void *aux1, void *aux2) void elfu_mToElf(ElfuElf *me, Elf *e) { if (me->symtab) { - flattenSymtab(me); + elfu_mSymtabFlatten(me); }