5 #include <libelf/libelf.h>
6 #include <libelf/gelf.h>
7 #include <libelfu/libelfu.h>
10 static ElfuPhdr* modelFromPhdr(GElf_Phdr *phdr)
14 mp = malloc(sizeof(ElfuPhdr));
25 static ElfuScn* modelFromSection(Elf_Scn *scn)
30 ms = malloc(sizeof(ElfuScn));
36 if (gelf_getshdr(scn, &ms->shdr) != &ms->shdr) {
37 ELFU_WARN("gelf_getshdr() failed: %s\n", elf_errmsg(-1));
42 /* Copy each data part in source segment */
44 ms->data.d_buf = NULL;
46 ms->data.d_type = ELF_T_BYTE;
47 ms->data.d_size = ms->shdr.sh_size;
48 ms->data.d_version = elf_version(EV_NONE);
49 if (ms->shdr.sh_type != SHT_NOBITS
50 && ms->shdr.sh_size > 1) {
53 ms->data.d_buf = malloc(ms->shdr.sh_size);
54 if (!ms->data.d_buf) {
55 ELFU_WARN("modelFromSection: Could not allocate data buffer (%jx bytes).\n", ms->shdr.sh_size);
59 /* A non-empty section should contain at least on data block. */
60 data = elf_rawdata(scn, NULL);
64 ms->data.d_align = data->d_align;
65 ms->data.d_type = data->d_type;
66 ms->data.d_version = data->d_version;
69 if (data->d_off + data->d_size > ms->shdr.sh_size) {
70 ELFU_WARN("modelFromSection: libelf delivered a bogus data blob. Skipping\n");
72 memcpy(ms->data.d_buf + data->d_off, data->d_buf, data->d_size);
75 data = elf_rawdata(scn, data);
90 ElfuElf* elfu_mFromElf(Elf *e)
102 /* Get the section string table index */
103 if (elf_getshdrstrndx(e, &shstrndx) != 0) {
107 me = malloc(sizeof(ElfuElf));
112 CIRCLEQ_INIT(&me->scnList);
113 CIRCLEQ_INIT(&me->phdrList);
119 me->elfclass = gelf_getclass(e);
120 if (me->elfclass == ELFCLASSNONE) {
121 ELFU_WARNELF("getclass");
124 if (!gelf_getehdr(e, &me->ehdr)) {
125 ELFU_WARNELF("gelf_getehdr");
133 scn = elf_getscn(e, 1);
136 ElfuScn *ms = modelFromSection(scn);
139 CIRCLEQ_INSERT_TAIL(&me->scnList, ms, elem);
147 scn = elf_nextscn(e, scn);
156 if (elf_getphdrnum(e, &n)) {
157 ELFU_WARNELF("elf_getphdrnum");
160 for (i = 0; i < n; i++) {
164 if (gelf_getphdr(e, i, &phdr) != &phdr) {
165 ELFU_WARN("gelf_getphdr() failed for #%d: %s\n", i, elf_errmsg(-1));
169 mp = modelFromPhdr(&phdr);
172 CIRCLEQ_INSERT_TAIL(&me->phdrList, mp, elem);
182 // TODO: Free data structures
184 ELFU_WARN("elfu_mFromElf: Failed to load file.\n");