Redesign data structures, make basic reladd work.
[centaur.git] / src / main.c
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 #include <getopt.h>
5 #include <libelf/libelf.h>
6 #include <libelf/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   ElfuElf *me;
22
23   /* Is libelf alive and well? */
24   if (elf_version(EV_CURRENT) == EV_NONE) {
25     fprintf(stderr, "libelf init error: %s\n", elf_errmsg(-1));
26   }
27
28
29   /* Parse and validate user input */
30   parseOptions(&opts, argc, argv);
31
32
33   /* Open input/output files */
34   openElf(&hIn, opts.fnInput, ELF_C_READ);
35   if (!hIn.e) {
36     exitval = EXIT_FAILURE;
37     goto EXIT;
38   }
39
40
41   /* Now that we have a (hopefully) sane environment, execute commands. */
42   me = elfu_mFromElf(hIn.e);
43   if (me) {
44     closeElf(&hIn);
45     printf("Model successfully loaded.\n");
46
47     elfu_mDumpElf(me);
48
49     elfu_mCheck(me);
50     printf("Input model checked.\n");
51   } else {
52     printf("Failed to load model, aborting.\n");
53     goto EXIT;
54   }
55
56
57   /* Copy the input ELF to the output file if the latter is specified.
58    * Perform requested transformations on the memory model on-the-fly. */
59   if (!opts.fnOutput) {
60     printf("No output file specified - no further operations performed.\n");
61   } else {
62     if (opts.fnReladd) {
63       ELFHandles hRel = { 0 };
64       ElfuElf *mrel = NULL;
65
66       openElf(&hRel, opts.fnReladd, ELF_C_READ);
67       if (!hRel.e) {
68         printf("--reladd: Failed to open file for --reladd, skipping operation.\n");
69       } else {
70         mrel = elfu_mFromElf(hRel.e);
71         closeElf(&hRel);
72         if (!me) {
73           printf("--reladd: Failed to load model for --reladd, skipping operation.\n");
74         } else {
75           printf("--reladd: Model successfully loaded.\n");
76           elfu_mCheck(mrel);
77           printf("--reladd: Input model checked.\n");
78           elfu_mReladd(me, mrel);
79         }
80       }
81     }
82
83     elfu_mCheck(me);
84     printf("Output model checked.\n");
85
86     elfu_mDumpElf(me);
87
88     openElf(&hOut, opts.fnOutput, ELF_C_WRITE);
89     if (!hOut.e) {
90       printf("Failed to open output file. Aborting.\n");
91       exitval = EXIT_FAILURE;
92       goto EXIT;
93     }
94
95     elfu_mToElf(me, hOut.e);
96     printf("Model converted to ELF, ready to be written.\n");
97   }
98
99
100
101 EXIT:
102   if (hOut.e) {
103     if (elf_update(hOut.e, ELF_C_WRITE) < 0) {
104       fprintf(stderr, "elf_update() failed: %s\n", elf_errmsg(-1));
105     }
106     closeElf(&hOut);
107   }
108
109   if (hIn.e) {
110     closeElf(&hIn);
111   }
112
113   return (exitval);
114 }