NOBITS expansion, for .bss etc
[centaur.git] / src / main.c
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 #include <getopt.h>
5 #include <libelf.h>
6 #include <gelf.h>
7
8 #include <libelfu/libelfu.h>
9
10 #include "elfhandle.h"
11 #include "options.h"
12 #include "printing.h"
13
14
15 int main(int argc, char **argv)
16 {
17   CLIOpts opts = { 0 };
18   ELFHandles hIn = { 0 };
19   ELFHandles hOut = { 0 };
20   int exitval = EXIT_SUCCESS;
21
22   /* Is libelf alive and well? */
23   if (elf_version(EV_CURRENT) == EV_NONE) {
24     fprintf(stderr, "libelf init error: %s\n", elf_errmsg(-1));
25   }
26
27
28   /* Parse and validate user input */
29   parseOptions(&opts, argc, argv);
30
31
32   /* Open input/output files */
33   openElf(&hIn, opts.fnInput, ELF_C_READ);
34   if (!hIn.e) {
35     exitval = EXIT_FAILURE;
36     goto EXIT;
37   }
38
39   if (opts.fnOutput) {
40     openElf(&hOut, opts.fnOutput, ELF_C_WRITE);
41     if (!hOut.e) {
42       exitval = EXIT_FAILURE;
43       goto EXIT;
44     }
45   }
46
47
48   /* Now that we have a (hopefully) sane environment, execute commands */
49   if (opts.printHeader) {
50     printHeader(hIn.e);
51   }
52
53   if (opts.printSegments) {
54     printSegments(hIn.e);
55   }
56
57   if (opts.printSections) {
58     printSections(hIn.e);
59   }
60
61
62   /* Copy the input ELF to the output file if the latter is specified */
63   if (opts.fnOutput) {
64     ElfuElf *me;
65
66     me = elfu_mFromElf(hIn.e);
67
68     if (me) {
69       printf("Model successfully loaded.\n");
70       elfu_mCheck(me);
71       printf("Input model checked.\n");
72
73       if (opts.expandNobitsOffs) {
74         elfu_mExpandNobits(me, opts.expandNobitsOffs);
75       }
76
77       if (opts.insertBeforeSz) {
78         elfu_mInsertBefore(me, opts.insertBeforeOffs, opts.insertBeforeSz);
79       }
80
81       if (opts.insertAfterSz) {
82         elfu_mInsertAfter(me, opts.insertAfterOffs, opts.insertAfterSz);
83       }
84
85       elfu_mCheck(me);
86       printf("Output model checked.\n");
87       elfu_mToElf(me, hOut.e);
88       printf("Model converted to ELF, ready to be written.\n");
89     } else {
90       printf("Failed to load model.\n");
91     }
92   }
93
94
95
96 EXIT:
97   if (hOut.e) {
98     if (elf_update(hOut.e, ELF_C_WRITE) < 0) {
99       fprintf(stderr, "elf_update() failed: %s\n", elf_errmsg(-1));
100     }
101     closeElf(&hOut);
102   }
103
104   if (hIn.e) {
105     closeElf(&hIn);
106   }
107
108   return (exitval);
109 }