5 #include <libelfu/libelfu.h>
9 static void modelToPhdrs(ElfuElf *me, Elf *e)
16 CIRCLEQ_FOREACH(mp, &me->phdrList, elem) {
20 if (!gelf_newphdr(e, i)) {
21 fprintf(stderr, "gelf_newphdr() failed: %s\n", elf_errmsg(-1));
26 CIRCLEQ_FOREACH(mp, &me->phdrList, elem) {
27 if (!gelf_update_phdr (e, i, &mp->phdr)) {
28 fprintf(stderr, "gelf_update_phdr() failed: %s\n", elf_errmsg(-1));
37 static void modelToSection(ElfuScn *ms, Elf *e)
41 scnOut = elf_newscn(e);
43 fprintf(stderr, "elf_newscn() failed: %s\n", elf_errmsg(-1));
49 if (!gelf_update_shdr(scnOut, &ms->shdr)) {
50 fprintf(stderr, "gelf_update_shdr() failed: %s\n", elf_errmsg(-1));
56 CIRCLEQ_FOREACH(md, &ms->dataList, elem) {
57 Elf_Data *dataOut = elf_newdata(scnOut);
59 fprintf(stderr, "elf_newdata() failed: %s\n", elf_errmsg(-1));
62 dataOut->d_align = md->data.d_align;
63 dataOut->d_buf = md->data.d_buf;
64 dataOut->d_off = md->data.d_off;
65 dataOut->d_type = md->data.d_type;
66 dataOut->d_size = md->data.d_size;
67 dataOut->d_version = md->data.d_version;
75 void elfu_mToElf(ElfuElf *me, Elf *e)
79 /* We control the ELF file's layout now. */
80 /* tired's libelf also offers ELF_F_LAYOUT_OVERLAP for overlapping sections. */
81 elf_flagelf(e, ELF_C_SET, ELF_F_LAYOUT);
85 if (!gelf_newehdr(e, me->elfclass)) {
86 fprintf(stderr, "gelf_newehdr() failed: %s\n", elf_errmsg(-1));
89 if (!gelf_update_ehdr(e, &me->ehdr)) {
90 fprintf(stderr, "gelf_update_ehdr() failed: %s\n", elf_errmsg(-1));
95 CIRCLEQ_FOREACH(ms, &me->scnList, elem) {
96 modelToSection(ms, e);
104 elf_flagelf(e, ELF_C_SET, ELF_F_DIRTY);