4 #include <libelfu/libelfu.h>
7 static void flattenSymtab(ElfuElf *me)
14 CIRCLEQ_FOREACH(sym, &me->symtab->symtab.syms, elem) {
16 sym->shndx = elfu_mScnIndex(me, sym->scnptr);
22 if (me->elfclass == ELFCLASS32) {
23 size_t newsize = (numsyms + 1) * sizeof(Elf32_Sym);
26 if (me->symtab->data.d_buf) {
27 free(me->symtab->data.d_buf);
29 me->symtab->data.d_buf = malloc(newsize);
30 assert(me->symtab->data.d_buf);
32 me->symtab->data.d_size = newsize;
33 me->symtab->shdr.sh_size = newsize;
34 memset(me->symtab->data.d_buf, 0, newsize);
37 CIRCLEQ_FOREACH(sym, &me->symtab->symtab.syms, elem) {
38 Elf32_Sym *es = ((Elf32_Sym*)me->symtab->data.d_buf) + i;
40 es->st_name = sym->name;
41 es->st_value = sym->value;
42 es->st_size = sym->size;
43 es->st_info = ELF32_ST_INFO(sym->bind, sym->type);
44 es->st_other = sym->other;
45 es->st_shndx = sym->shndx;
49 } else if (me->elfclass == ELFCLASS64) {
61 static void modelToPhdrs(ElfuElf *me, Elf *e)
68 CIRCLEQ_FOREACH(mp, &me->phdrList, elem) {
72 if (!gelf_newphdr(e, i)) {
73 ELFU_WARNELF("gelf_newphdr");
78 CIRCLEQ_FOREACH(mp, &me->phdrList, elem) {
79 if (!gelf_update_phdr (e, i, &mp->phdr)) {
80 ELFU_WARNELF("gelf_update_phdr");
89 static void* modelToSection(ElfuElf *me, ElfuScn *ms, void *aux1, void *aux2)
96 scnOut = elf_newscn(e);
98 ELFU_WARNELF("elf_newscn");
105 ms->shdr.sh_link = elfu_mScnIndex(me, ms->linkptr);
108 ms->shdr.sh_info = elfu_mScnIndex(me, ms->infoptr);
110 if (!gelf_update_shdr(scnOut, &ms->shdr)) {
111 ELFU_WARNELF("gelf_update_shdr");
116 if (ms->data.d_buf) {
117 Elf_Data *dataOut = elf_newdata(scnOut);
119 ELFU_WARNELF("elf_newdata");
122 dataOut->d_align = ms->data.d_align;
123 dataOut->d_buf = ms->data.d_buf;
124 dataOut->d_off = ms->data.d_off;
125 dataOut->d_type = ms->data.d_type;
126 dataOut->d_size = ms->data.d_size;
127 dataOut->d_version = ms->data.d_version;
137 void elfu_mToElf(ElfuElf *me, Elf *e)
144 /* We control the ELF file's layout now. */
145 /* tired's libelf also offers ELF_F_LAYOUT_OVERLAP for overlapping sections,
146 * but we don't want that since we filtered it out in the reading stage
147 * already. It would be too mind-blowing to handle the dependencies between
148 * the PHDRs and sections then... */
149 elf_flagelf(e, ELF_C_SET, ELF_F_LAYOUT);
153 if (!gelf_newehdr(e, me->elfclass)) {
154 ELFU_WARNELF("gelf_newehdr");
158 me->ehdr.e_shstrndx = elfu_mScnIndex(me, me->shstrtab);
161 if (!gelf_update_ehdr(e, &me->ehdr)) {
162 ELFU_WARNELF("gelf_update_ehdr");
167 elfu_mScnForall(me, modelToSection, e, NULL);
174 elf_flagelf(e, ELF_C_SET, ELF_F_DIRTY);