6241a733a7b396240c0a6559b54b9672a052beb7
[centaur.git] / src / printing / sections.c
1 #include <stdio.h>
2
3 #include <libelf.h>
4 #include <gelf.h>
5
6 #include <libelfu/libelfu.h>
7 #include "printing.h"
8
9
10 void printSegmentsWithSection(Elf *e, Elf_Scn *scn)
11 {
12   GElf_Phdr phdr;
13   int i;
14   size_t n;
15
16
17   if (elf_getphdrnum(e, &n)) {
18     fprintf(stderr, "elf_getphdrnum() failed: %s\n", elf_errmsg(-1));
19     return;
20   }
21
22   for (i = 0; i < n; i++) {
23     ELFU_BOOL isInSeg;
24
25     if (gelf_getphdr(e, i, &phdr) != &phdr) {
26       fprintf(stderr, "getphdr() failed for #%d: %s\n", i, elf_errmsg(-1));
27       continue;
28     }
29
30     isInSeg = elfu_segmentContainsSection(&phdr, scn);
31     if (isInSeg == ELFU_TRUE) {
32       printf("     %d %s\n", i, segmentTypeStr(phdr.p_type));
33     }
34   }
35 }
36
37
38 void printSection(Elf *e, Elf_Scn *scn)
39 {
40   printf("  %jd: %s\n",
41           (uintmax_t) elf_ndxscn(scn),
42           elfu_sectionName(e, scn));
43 }
44
45
46 void printSections(Elf *e)
47 {
48   Elf_Scn *scn;
49
50   printf("Sections:\n");
51
52   scn = elf_getscn(e, 0);
53
54   while (scn) {
55     printSection(e, scn);
56     //printSegmentsWithSection(e, scn);
57
58     scn = elf_nextscn(e, scn);
59   }
60 }