diff options
author | H. Peter Anvin <hpa@linux.intel.com> | 2013-04-16 19:02:58 -0400 |
---|---|---|
committer | H. Peter Anvin <hpa@linux.intel.com> | 2013-04-16 19:02:58 -0400 |
commit | c889ba801dc3b3a0155fa77d567f2c3a6097de1c (patch) | |
tree | 257878e1eb565fc9765dd8fed20815f7781d116a /arch/x86/tools/relocs_common.c | |
parent | 17c961f7702ff6037b66bb2e5f3ddd58de4ce7e5 (diff) |
x86, relocs: Refactor the relocs tool to merge 32- and 64-bit ELF
Refactor the relocs tool so that the same tool can handle 32- and
64-bit ELF.
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
Cc: Kees Cook <keescook@chromium.org>
Link: http://lkml.kernel.org/r/1365797627-20874-5-git-send-email-keescook@chromium.org
Diffstat (limited to 'arch/x86/tools/relocs_common.c')
-rw-r--r-- | arch/x86/tools/relocs_common.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/arch/x86/tools/relocs_common.c b/arch/x86/tools/relocs_common.c new file mode 100644 index 000000000000..44d396823a53 --- /dev/null +++ b/arch/x86/tools/relocs_common.c | |||
@@ -0,0 +1,76 @@ | |||
1 | #include "relocs.h" | ||
2 | |||
3 | void die(char *fmt, ...) | ||
4 | { | ||
5 | va_list ap; | ||
6 | va_start(ap, fmt); | ||
7 | vfprintf(stderr, fmt, ap); | ||
8 | va_end(ap); | ||
9 | exit(1); | ||
10 | } | ||
11 | |||
12 | static void usage(void) | ||
13 | { | ||
14 | die("relocs [--abs-syms|--abs-relocs|--text|--realmode] vmlinux\n"); | ||
15 | } | ||
16 | |||
17 | int main(int argc, char **argv) | ||
18 | { | ||
19 | int show_absolute_syms, show_absolute_relocs; | ||
20 | int as_text, use_real_mode; | ||
21 | const char *fname; | ||
22 | FILE *fp; | ||
23 | int i; | ||
24 | unsigned char e_ident[EI_NIDENT]; | ||
25 | |||
26 | show_absolute_syms = 0; | ||
27 | show_absolute_relocs = 0; | ||
28 | as_text = 0; | ||
29 | use_real_mode = 0; | ||
30 | fname = NULL; | ||
31 | for (i = 1; i < argc; i++) { | ||
32 | char *arg = argv[i]; | ||
33 | if (*arg == '-') { | ||
34 | if (strcmp(arg, "--abs-syms") == 0) { | ||
35 | show_absolute_syms = 1; | ||
36 | continue; | ||
37 | } | ||
38 | if (strcmp(arg, "--abs-relocs") == 0) { | ||
39 | show_absolute_relocs = 1; | ||
40 | continue; | ||
41 | } | ||
42 | if (strcmp(arg, "--text") == 0) { | ||
43 | as_text = 1; | ||
44 | continue; | ||
45 | } | ||
46 | if (strcmp(arg, "--realmode") == 0) { | ||
47 | use_real_mode = 1; | ||
48 | continue; | ||
49 | } | ||
50 | } | ||
51 | else if (!fname) { | ||
52 | fname = arg; | ||
53 | continue; | ||
54 | } | ||
55 | usage(); | ||
56 | } | ||
57 | if (!fname) { | ||
58 | usage(); | ||
59 | } | ||
60 | fp = fopen(fname, "r"); | ||
61 | if (!fp) { | ||
62 | die("Cannot open %s: %s\n", fname, strerror(errno)); | ||
63 | } | ||
64 | if (fread(&e_ident, 1, EI_NIDENT, fp) != EI_NIDENT) { | ||
65 | die("Cannot read %s: %s", fname, strerror(errno)); | ||
66 | } | ||
67 | rewind(fp); | ||
68 | if (e_ident[EI_CLASS] == ELFCLASS64) | ||
69 | process_64(fp, use_real_mode, as_text, | ||
70 | show_absolute_syms, show_absolute_relocs); | ||
71 | else | ||
72 | process_32(fp, use_real_mode, as_text, | ||
73 | show_absolute_syms, show_absolute_relocs); | ||
74 | fclose(fp); | ||
75 | return 0; | ||
76 | } | ||