4 #include <libelfu/libelfu.h>
7 static void flattenSymtab(ElfuElf *me)
14 /* Update section indexes and count symbols */
15 CIRCLEQ_FOREACH(sym, &me->symtab->symtab.syms, elem) {
17 sym->shndx = elfu_mScnIndex(me, sym->scnptr);
23 /* Copy symbols to elfclass-specific format */
24 if (me->elfclass == ELFCLASS32) {
25 size_t newsize = (numsyms + 1) * sizeof(Elf32_Sym);
28 if (me->symtab->data.d_buf) {
29 free(me->symtab->data.d_buf);
31 me->symtab->data.d_buf = malloc(newsize);
32 assert(me->symtab->data.d_buf);
34 me->symtab->data.d_size = newsize;
35 me->symtab->shdr.sh_size = newsize;
36 memset(me->symtab->data.d_buf, 0, newsize);
39 CIRCLEQ_FOREACH(sym, &me->symtab->symtab.syms, elem) {
40 Elf32_Sym *es = ((Elf32_Sym*)me->symtab->data.d_buf) + i;
42 es->st_name = sym->name;
43 es->st_value = sym->value;
44 es->st_size = sym->size;
45 es->st_info = ELF32_ST_INFO(sym->bind, sym->type);
46 es->st_other = sym->other;
47 es->st_shndx = sym->shndx;
51 } else if (me->elfclass == ELFCLASS64) {
63 static void modelToPhdrs(ElfuElf *me, Elf *e)
70 CIRCLEQ_FOREACH(mp, &me->phdrList, elem) {
74 if (!gelf_newphdr(e, i)) {
75 ELFU_WARNELF("gelf_newphdr");
80 CIRCLEQ_FOREACH(mp, &me->phdrList, elem) {
81 if (!gelf_update_phdr (e, i, &mp->phdr)) {
82 ELFU_WARNELF("gelf_update_phdr");
91 static void* modelToSection(ElfuElf *me, ElfuScn *ms, void *aux1, void *aux2)
98 scnOut = elf_newscn(e);
100 ELFU_WARNELF("elf_newscn");
107 ms->shdr.sh_link = elfu_mScnIndex(me, ms->linkptr);
110 ms->shdr.sh_info = elfu_mScnIndex(me, ms->infoptr);
112 if (!gelf_update_shdr(scnOut, &ms->shdr)) {
113 ELFU_WARNELF("gelf_update_shdr");
118 if (ms->data.d_buf) {
119 Elf_Data *dataOut = elf_newdata(scnOut);
121 ELFU_WARNELF("elf_newdata");
124 dataOut->d_align = ms->data.d_align;
125 dataOut->d_buf = ms->data.d_buf;
126 dataOut->d_off = ms->data.d_off;
127 dataOut->d_type = ms->data.d_type;
128 dataOut->d_size = ms->data.d_size;
129 dataOut->d_version = ms->data.d_version;
139 void elfu_mToElf(ElfuElf *me, Elf *e)
146 /* We control the ELF file's layout now. */
147 /* tired's libelf also offers ELF_F_LAYOUT_OVERLAP for overlapping sections,
148 * but we don't want that since we filtered it out in the reading stage
149 * already. It would be too mind-blowing to handle the dependencies between
150 * the PHDRs and sections then... */
151 elf_flagelf(e, ELF_C_SET, ELF_F_LAYOUT);
155 if (!gelf_newehdr(e, me->elfclass)) {
156 ELFU_WARNELF("gelf_newehdr");
160 me->ehdr.e_shstrndx = elfu_mScnIndex(me, me->shstrtab);
163 if (!gelf_update_ehdr(e, &me->ehdr)) {
164 ELFU_WARNELF("gelf_update_ehdr");
169 elfu_mScnForall(me, modelToSection, e, NULL);
176 elf_flagelf(e, ELF_C_SET, ELF_F_DIRTY);