| // SPDX-License-Identifier: GPL-2.0-or-later | |
| #include <subcmd/parse-options.h> | |
| #include <string.h> | |
| #include <stdlib.h> | |
| #include <objtool/builtin.h> | |
| #include <objtool/objtool.h> | |
| #include <objtool/klp.h> | |
| struct subcmd { | |
| const char *name; | |
| const char *description; | |
| int (*fn)(int, const char **); | |
| }; | |
| static struct subcmd subcmds[] = { | |
| { "checksum", "Generate per-function checksums", cmd_klp_checksum, }, | |
| { "diff", "Generate binary diff of two object files", cmd_klp_diff, }, | |
| { "post-link", "Finalize klp symbols/relocs after module linking", cmd_klp_post_link, }, | |
| }; | |
| static void cmd_klp_usage(void) | |
| { | |
| fprintf(stderr, "usage: objtool klp <subcommand> [<options>]\n\n"); | |
| fprintf(stderr, "Subcommands:\n"); | |
| for (int i = 0; i < ARRAY_SIZE(subcmds); i++) { | |
| struct subcmd *cmd = &subcmds[i]; | |
| fprintf(stderr, " %s\t%s\n", cmd->name, cmd->description); | |
| } | |
| exit(1); | |
| } | |
| int cmd_klp(int argc, const char **argv) | |
| { | |
| argc--; | |
| argv++; | |
| if (!argc) | |
| cmd_klp_usage(); | |
| if (argc) { | |
| for (int i = 0; i < ARRAY_SIZE(subcmds); i++) { | |
| struct subcmd *cmd = &subcmds[i]; | |
| if (!strcmp(cmd->name, argv[0])) | |
| return cmd->fn(argc, argv); | |
| } | |
| } | |
| cmd_klp_usage(); | |
| return 0; | |
| } |