8 #include <libelfu/libelfu.h>
11 ElfuPhdr* elfu_modelFromPhdr(GElf_Phdr *phdr)
15 mp = malloc(sizeof(ElfuPhdr));
26 ElfuScn* elfu_modelFromSection(Elf_Scn *scn)
31 ms = malloc(sizeof(ElfuScn));
36 CIRCLEQ_INIT(&ms->dataList);
39 if (gelf_getshdr(scn, &ms->shdr) != &ms->shdr) {
40 fprintf(stderr, "gelf_getshdr() failed: %s\n", elf_errmsg(-1));
46 /* Copy each data part in source segment */
47 data = elf_rawdata(scn, NULL);
51 md = malloc(sizeof(ElfuData));
58 CIRCLEQ_INSERT_TAIL(&ms->dataList, md, elem);
60 data = elf_rawdata(scn, data);
73 ElfuElf* elfu_modelFromElf(Elf *e)
80 if (elf_getshdrstrndx(e, &shstrndx) != 0) {
84 me = malloc(sizeof(ElfuElf));
89 CIRCLEQ_INIT(&me->scnList);
90 CIRCLEQ_INIT(&me->phdrList);
96 me->elfclass = gelf_getclass(e);
97 if (me->elfclass == ELFCLASSNONE) {
98 fprintf(stderr, "getclass() failed: %s\n", elf_errmsg(-1));
101 if (!gelf_getehdr(e, &me->ehdr)) {
102 fprintf(stderr, "gelf_getehdr() failed: %s\n", elf_errmsg(-1));
110 scn = elf_getscn(e, 1);
113 ElfuScn *ms = elfu_modelFromSection(scn);
116 CIRCLEQ_INSERT_TAIL(&me->scnList, ms, elem);
124 scn = elf_nextscn(e, scn);
133 if (elf_getphdrnum(e, &n)) {
134 fprintf(stderr, "elf_getphdrnum() failed: %s\n", elf_errmsg(-1));
137 for (i = 0; i < n; i++) {
141 if (gelf_getphdr(e, i, &phdr) != &phdr) {
142 fprintf(stderr, "gelf_getphdr() failed for #%d: %s\n", i, elf_errmsg(-1));
146 mp = elfu_modelFromPhdr(&phdr);
149 CIRCLEQ_INSERT_TAIL(&me->phdrList, mp, elem);