Use explicit libelf/* path in includes
[centaur.git] / src / model / toFile.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <libelf/libelf.h>
4 #include <libelf/gelf.h>
5 #include <libelfu/libelfu.h>
6
7
8
9 static void modelToPhdrs(ElfuElf *me, Elf *e)
10 {
11   ElfuPhdr *mp;
12   size_t i;
13
14   /* Count PHDRs */
15   i = 0;
16   CIRCLEQ_FOREACH(mp, &me->phdrList, elem) {
17     i++;
18   }
19
20   if (!gelf_newphdr(e, i)) {
21     fprintf(stderr, "gelf_newphdr() failed: %s\n", elf_errmsg(-1));
22   }
23
24   /* Copy PHDRs */
25   i = 0;
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));
29     }
30
31     i++;
32   }
33 }
34
35
36
37 static void modelToSection(ElfuScn *ms, Elf *e)
38 {
39   Elf_Scn *scnOut;
40
41   scnOut = elf_newscn(e);
42   if (!scnOut) {
43     fprintf(stderr, "elf_newscn() failed: %s\n", elf_errmsg(-1));
44     return;
45   }
46
47
48   /* SHDR */
49   if (!gelf_update_shdr(scnOut, &ms->shdr)) {
50     fprintf(stderr, "gelf_update_shdr() failed: %s\n", elf_errmsg(-1));
51   }
52
53
54   /* Data */
55   if (ms->data.d_buf) {
56     Elf_Data *dataOut = elf_newdata(scnOut);
57     if (!dataOut) {
58       fprintf(stderr, "elf_newdata() failed: %s\n", elf_errmsg(-1));
59     }
60
61     dataOut->d_align = ms->data.d_align;
62     dataOut->d_buf  = ms->data.d_buf;
63     dataOut->d_off  = ms->data.d_off;
64     dataOut->d_type = ms->data.d_type;
65     dataOut->d_size = ms->data.d_size;
66     dataOut->d_version = ms->data.d_version;
67   }
68 }
69
70
71
72
73
74 void elfu_mToElf(ElfuElf *me, Elf *e)
75 {
76   ElfuScn *ms;
77
78   /* We control the ELF file's layout now. */
79   /* tired's libelf also offers ELF_F_LAYOUT_OVERLAP for overlapping sections. */
80   elf_flagelf(e, ELF_C_SET, ELF_F_LAYOUT);
81
82
83   /* EHDR */
84   if (!gelf_newehdr(e, me->elfclass)) {
85     fprintf(stderr, "gelf_newehdr() failed: %s\n", elf_errmsg(-1));
86   }
87
88   if (!gelf_update_ehdr(e, &me->ehdr)) {
89     fprintf(stderr, "gelf_update_ehdr() failed: %s\n", elf_errmsg(-1));
90   }
91
92
93   /* Sections */
94   CIRCLEQ_FOREACH(ms, &me->scnList, elem) {
95     modelToSection(ms, e);
96   }
97
98
99   /* PHDRs */
100   modelToPhdrs(me, e);
101
102
103   elf_flagelf(e, ELF_C_SET, ELF_F_DIRTY);
104 }