5 #include <libelf/libelf.h>
6 #include <libelf/gelf.h>
7 #include <libelfu/libelfu.h>
10 static ElfuPhdr* modelFromPhdr(GElf_Phdr *phdr)
16 mp = malloc(sizeof(ElfuPhdr));
18 ELFU_WARN("modelFromPhdr: malloc() failed for ElfuPhdr.\n");
28 static ElfuScn* modelFromSection(Elf_Scn *scn)
34 ms = malloc(sizeof(ElfuScn));
36 ELFU_WARN("modelFromSection: malloc() failed for ElfuScn.\n");
41 assert(gelf_getshdr(scn, &ms->shdr) == &ms->shdr);
44 /* Copy each data part in source segment */
46 ms->data.d_buf = NULL;
48 ms->data.d_type = ELF_T_BYTE;
49 ms->data.d_size = ms->shdr.sh_size;
50 ms->data.d_version = elf_version(EV_NONE);
51 if (ms->shdr.sh_type != SHT_NOBITS
52 && ms->shdr.sh_size > 0) {
55 ms->data.d_buf = malloc(ms->shdr.sh_size);
56 if (!ms->data.d_buf) {
57 ELFU_WARN("modelFromSection: malloc() failed for data buffer (%jx bytes).\n", ms->shdr.sh_size);
61 /* A non-empty section should contain at least one data block. */
62 data = elf_rawdata(scn, NULL);
65 ms->data.d_align = data->d_align;
66 ms->data.d_type = data->d_type;
67 ms->data.d_version = data->d_version;
70 if (data->d_off + data->d_size > ms->shdr.sh_size) {
71 ELFU_WARN("modelFromSection: libelf delivered a bogus data blob. Skipping\n");
73 memcpy(ms->data.d_buf + data->d_off, data->d_buf, data->d_size);
76 data = elf_rawdata(scn, data);
93 ElfuElf* elfu_mFromElf(Elf *e)
97 size_t i, numPhdr, numShdr;
100 if (elfu_eCheck(e)) {
104 me = malloc(sizeof(ElfuElf));
106 ELFU_WARN("elfu_mFromElf: malloc() failed for ElfuElf.\n");
112 CIRCLEQ_INIT(&me->scnList);
113 CIRCLEQ_INIT(&me->phdrList);
116 me->elfclass = gelf_getclass(e);
117 assert(me->elfclass != ELFCLASSNONE);
118 assert(gelf_getehdr(e, &me->ehdr) == &me->ehdr);
121 /* Get the section string table index */
122 if (elf_getshdrstrndx(e, &shstrndx) != 0) {
128 assert(!elf_getphdrnum(e, &numPhdr));
129 for (i = 0; i < numPhdr; i++) {
133 assert(gelf_getphdr(e, i, &phdr) == &phdr);
135 mp = modelFromPhdr(&phdr);
140 CIRCLEQ_INSERT_TAIL(&me->phdrList, mp, elem);
145 assert(!elf_getshdrnum(e, &numShdr));
146 for (i = 1; i < numShdr; i++) {
150 scn = elf_getscn(e, i);
153 ms = modelFromSection(scn);
158 CIRCLEQ_INSERT_TAIL(&me->scnList, ms, elem);
165 /* Find sh_link dependencies */
168 /* Sort sections by offset */
171 /* Find PHDR -> Section dependencies */
180 // TODO: Free data structures
183 ELFU_WARN("elfu_mFromElf: Failed to load file.\n");