7 #include <libelfu/libelfu.h>
11 static void elfu_modelToPhdrs(ElfuElf *me, Elf *e)
18 for (mp = me->phdrList.cqh_first;
19 mp != (void *)&me->phdrList;
20 mp = mp->elem.cqe_next) {
24 if (!gelf_newphdr(e, i)) {
25 fprintf(stderr, "gelf_newphdr() failed: %s\n", elf_errmsg(-1));
30 for (mp = me->phdrList.cqh_first;
31 mp != (void *)&me->phdrList;
32 mp = mp->elem.cqe_next) {
33 if (!gelf_update_phdr (e, i, &mp->phdr)) {
34 fprintf(stderr, "gelf_update_phdr() failed: %s\n", elf_errmsg(-1));
43 static void elfu_modelToSection(ElfuScn *ms, Elf *e)
47 scnOut = elf_newscn(e);
49 fprintf(stderr, "elf_newscn() failed: %s\n", elf_errmsg(-1));
55 if (!gelf_update_shdr(scnOut, &ms->shdr)) {
56 fprintf(stderr, "gelf_update_shdr() failed: %s\n", elf_errmsg(-1));
62 for (md = ms->dataList.cqh_first;
63 md != (void *)&ms->dataList;
64 md = md->elem.cqe_next) {
65 Elf_Data *dataOut = elf_newdata(scnOut);
67 fprintf(stderr, "elf_newdata() failed: %s\n", elf_errmsg(-1));
70 dataOut->d_align = md->data.d_align;
71 dataOut->d_buf = md->data.d_buf;
72 dataOut->d_off = md->data.d_off;
73 dataOut->d_type = md->data.d_type;
74 dataOut->d_size = md->data.d_size;
75 dataOut->d_version = md->data.d_version;
83 void elfu_modelToElf(ElfuElf *me, Elf *e)
87 /* We control the ELF file's layout now. */
88 /* tired's libelf also offers ELF_F_LAYOUT_OVERLAP for overlapping sections. */
89 elf_flagelf(e, ELF_C_SET, ELF_F_LAYOUT);
93 if (!gelf_newehdr(e, me->elfclass)) {
94 fprintf(stderr, "gelf_newehdr() failed: %s\n", elf_errmsg(-1));
97 if (!gelf_update_ehdr(e, &me->ehdr)) {
98 fprintf(stderr, "gelf_update_ehdr() failed: %s\n", elf_errmsg(-1));
103 for (ms = me->scnList.cqh_first;
104 ms != (void *)&me->scnList;
105 ms = ms->elem.cqe_next) {
106 elfu_modelToSection(ms, e);
111 elfu_modelToPhdrs(me, e);
114 elf_flagelf(e, ELF_C_SET, ELF_F_DIRTY);