7 #include <libelfu/libelfu.h>
11 static void elfu_modelToPhdrs(ElfuElf *me, Elf *e)
18 CIRCLEQ_FOREACH(mp, &me->phdrList, elem) {
22 if (!gelf_newphdr(e, i)) {
23 fprintf(stderr, "gelf_newphdr() failed: %s\n", elf_errmsg(-1));
28 CIRCLEQ_FOREACH(mp, &me->phdrList, elem) {
29 if (!gelf_update_phdr (e, i, &mp->phdr)) {
30 fprintf(stderr, "gelf_update_phdr() failed: %s\n", elf_errmsg(-1));
39 static void elfu_modelToSection(ElfuScn *ms, Elf *e)
43 scnOut = elf_newscn(e);
45 fprintf(stderr, "elf_newscn() failed: %s\n", elf_errmsg(-1));
51 if (!gelf_update_shdr(scnOut, &ms->shdr)) {
52 fprintf(stderr, "gelf_update_shdr() failed: %s\n", elf_errmsg(-1));
58 CIRCLEQ_FOREACH(md, &ms->dataList, elem) {
59 Elf_Data *dataOut = elf_newdata(scnOut);
61 fprintf(stderr, "elf_newdata() failed: %s\n", elf_errmsg(-1));
64 dataOut->d_align = md->data.d_align;
65 dataOut->d_buf = md->data.d_buf;
66 dataOut->d_off = md->data.d_off;
67 dataOut->d_type = md->data.d_type;
68 dataOut->d_size = md->data.d_size;
69 dataOut->d_version = md->data.d_version;
77 void elfu_modelToElf(ElfuElf *me, Elf *e)
81 /* We control the ELF file's layout now. */
82 /* tired's libelf also offers ELF_F_LAYOUT_OVERLAP for overlapping sections. */
83 elf_flagelf(e, ELF_C_SET, ELF_F_LAYOUT);
87 if (!gelf_newehdr(e, me->elfclass)) {
88 fprintf(stderr, "gelf_newehdr() failed: %s\n", elf_errmsg(-1));
91 if (!gelf_update_ehdr(e, &me->ehdr)) {
92 fprintf(stderr, "gelf_update_ehdr() failed: %s\n", elf_errmsg(-1));
97 CIRCLEQ_FOREACH(ms, &me->scnList, elem) {
98 elfu_modelToSection(ms, e);
103 elfu_modelToPhdrs(me, e);
106 elf_flagelf(e, ELF_C_SET, ELF_F_DIRTY);