2 #include <libelf/libelf.h>
3 #include <libelf/gelf.h>
4 #include <libelfu/libelfu.h>
8 static void modelToPhdrs(ElfuElf *me, Elf *e)
15 CIRCLEQ_FOREACH(mp, &me->phdrList, elem) {
19 if (!gelf_newphdr(e, i)) {
20 ELFU_WARNELF("gelf_newphdr");
25 CIRCLEQ_FOREACH(mp, &me->phdrList, elem) {
26 if (!gelf_update_phdr (e, i, &mp->phdr)) {
27 ELFU_WARNELF("gelf_update_phdr");
36 static void modelToSection(ElfuScn *ms, Elf *e)
40 scnOut = elf_newscn(e);
42 ELFU_WARNELF("elf_newscn");
48 if (!gelf_update_shdr(scnOut, &ms->shdr)) {
49 ELFU_WARNELF("gelf_update_shdr");
55 Elf_Data *dataOut = elf_newdata(scnOut);
57 ELFU_WARNELF("elf_newdata");
60 dataOut->d_align = ms->data.d_align;
61 dataOut->d_buf = ms->data.d_buf;
62 dataOut->d_off = ms->data.d_off;
63 dataOut->d_type = ms->data.d_type;
64 dataOut->d_size = ms->data.d_size;
65 dataOut->d_version = ms->data.d_version;
73 void elfu_mToElf(ElfuElf *me, Elf *e)
77 /* We control the ELF file's layout now. */
78 /* tired's libelf also offers ELF_F_LAYOUT_OVERLAP for overlapping sections. */
79 elf_flagelf(e, ELF_C_SET, ELF_F_LAYOUT);
83 if (!gelf_newehdr(e, me->elfclass)) {
84 ELFU_WARNELF("gelf_newehdr");
87 if (!gelf_update_ehdr(e, &me->ehdr)) {
88 ELFU_WARNELF("gelf_update_ehdr");
93 CIRCLEQ_FOREACH(ms, &me->scnList, elem) {
94 modelToSection(ms, e);
102 elf_flagelf(e, ELF_C_SET, ELF_F_DIRTY);