7 #include <libelfu/libelfu.h>
10 ElfuPhdr* elfu_modelFromPhdr(GElf_Phdr *phdr)
14 mp = malloc(sizeof(ElfuPhdr));
25 ElfuScn* elfu_modelFromSection(Elf_Scn *scn)
30 ms = malloc(sizeof(ElfuScn));
35 CIRCLEQ_INIT(&ms->dataList);
38 if (gelf_getshdr(scn, &ms->shdr) != &ms->shdr) {
39 fprintf(stderr, "gelf_getshdr() failed: %s\n", elf_errmsg(-1));
45 /* Copy each data part in source segment */
46 data = elf_rawdata(scn, NULL);
50 md = malloc(sizeof(ElfuData));
57 CIRCLEQ_INSERT_TAIL(&ms->dataList, md, elem);
59 data = elf_rawdata(scn, data);
72 ElfuElf* elfu_modelFromElf(Elf *e)
76 me = malloc(sizeof(ElfuElf));
81 CIRCLEQ_INIT(&me->scnList);
82 CIRCLEQ_INIT(&me->phdrList);
87 me->elfclass = gelf_getclass(e);
88 if (me->elfclass == ELFCLASSNONE) {
89 fprintf(stderr, "getclass() failed: %s\n", elf_errmsg(-1));
92 if (!gelf_getehdr(e, &me->ehdr)) {
93 fprintf(stderr, "gelf_getehdr() failed: %s\n", elf_errmsg(-1));
103 scn = elf_getscn(e, 1);
105 ElfuScn *ms = elfu_modelFromSection(scn);
108 CIRCLEQ_INSERT_TAIL(&me->scnList, ms, elem);
113 scn = elf_nextscn(e, scn);
123 if (elf_getphdrnum(e, &n)) {
124 fprintf(stderr, "elf_getphdrnum() failed: %s\n", elf_errmsg(-1));
127 for (i = 0; i < n; i++) {
131 if (gelf_getphdr(e, i, &phdr) != &phdr) {
132 fprintf(stderr, "gelf_getphdr() failed for #%d: %s\n", i, elf_errmsg(-1));
136 mp = elfu_modelFromPhdr(&phdr);
139 CIRCLEQ_INSERT_TAIL(&me->phdrList, mp, elem);