6 #include <libelfu/libelfu.h>
9 static ElfuPhdr* modelFromPhdr(GElf_Phdr *phdr)
13 mp = malloc(sizeof(ElfuPhdr));
24 static ElfuScn* modelFromSection(Elf_Scn *scn)
29 ms = malloc(sizeof(ElfuScn));
34 CIRCLEQ_INIT(&ms->dataList);
37 if (gelf_getshdr(scn, &ms->shdr) != &ms->shdr) {
38 fprintf(stderr, "gelf_getshdr() failed: %s\n", elf_errmsg(-1));
44 /* Copy each data part in source segment */
45 data = elf_rawdata(scn, NULL);
49 md = malloc(sizeof(ElfuData));
56 CIRCLEQ_INSERT_TAIL(&ms->dataList, md, elem);
58 data = elf_rawdata(scn, data);
71 ElfuElf* elfu_mFromElf(Elf *e)
78 if (elf_getshdrstrndx(e, &shstrndx) != 0) {
82 me = malloc(sizeof(ElfuElf));
87 CIRCLEQ_INIT(&me->scnList);
88 CIRCLEQ_INIT(&me->phdrList);
94 me->elfclass = gelf_getclass(e);
95 if (me->elfclass == ELFCLASSNONE) {
96 fprintf(stderr, "getclass() failed: %s\n", elf_errmsg(-1));
99 if (!gelf_getehdr(e, &me->ehdr)) {
100 fprintf(stderr, "gelf_getehdr() failed: %s\n", elf_errmsg(-1));
108 scn = elf_getscn(e, 1);
111 ElfuScn *ms = modelFromSection(scn);
114 CIRCLEQ_INSERT_TAIL(&me->scnList, ms, elem);
122 scn = elf_nextscn(e, scn);
131 if (elf_getphdrnum(e, &n)) {
132 fprintf(stderr, "elf_getphdrnum() failed: %s\n", elf_errmsg(-1));
135 for (i = 0; i < n; i++) {
139 if (gelf_getphdr(e, i, &phdr) != &phdr) {
140 fprintf(stderr, "gelf_getphdr() failed for #%d: %s\n", i, elf_errmsg(-1));
144 mp = modelFromPhdr(&phdr);
147 CIRCLEQ_INSERT_TAIL(&me->phdrList, mp, elem);