forked from Minki/linux
414eece95b
- Generate __mcount_loc in objtool (Peter Zijlstra) - Support running objtool against vmlinux.o (Sami Tolvanen) - Clang LTO enablement for x86 (Sami Tolvanen) -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEpcP2jyKd1g9yPm4TiXL039xtwCYFAmA1fn8ACgkQiXL039xt wCbswQ//Zmnq912Ubyn5uPe9SOS/kumGDoqtxGzlZwo/pSB3qFArhD6G07sJ49XD nu/05ZcOda760wubnhcuK91n2fY5i/eGLXMSjfgtdVcco4Q67nPQydc+LGdhuDco FlhL8TAIwqYN1f2nJK1IggZpZFxz5r/r1Pq8q1S0oQRqDenxDBQwNtBba4B1OIxw /FE/1Hp3xwRnuJEP2jREBeY1yQ+Y1n859pZcDgSOWlTArcp8EVUi5hIWJ9DwIe73 mqnx6PcFWEYB0zLNZmZz2gpEac+ncGyme6ChayeuQfInbL5dhx97jFGt3S6/+NSY mF2zyaR/+JsGGuM8dVqH3izKCJXCEAGirrdMO1ndb9HdwS3KnYEiag2ciNWL0wm3 UEM4r0i2B14sU3pkyotKgsJdOSgorMKkQUPb2wW+OUfnkZNEWKLqylMgNXBD80l4 WG5vYQRwwFN9jRBik6Z5YFGnwGsNIoGg1F1GRNMjh6h51adYQeBN/1QJE1FJ5L4D iKzmZYqimKUINXWfI6TNyqiv9TctOt65pxnRyq+MHxfTDzHGyc3MUeCeCiR1a1yI S5QhcgfSnC/NjDA0+oYC6yRlcBtfhjtUqFTGoZ4q4q/LF1BVU1bPyIXZrROLc05s LNMMBcWbJetJxFtm/gYfiVFuNitYtxbBV1krVtsWznCA2nKGJ9w= =htKJ -----END PGP SIGNATURE----- Merge tag 'clang-lto-v5.12-rc1-part2' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux Pull more clang LTO updates from Kees Cook: "Clang LTO x86 enablement. Full disclosure: while this has _not_ been in linux-next (since it initially looked like the objtool dependencies weren't going to make v5.12), it has been under daily build and runtime testing by Sami for quite some time. These x86 portions have been discussed on lkml, with Peter, Josh, and others helping nail things down. The bulk of the changes are to get objtool working happily. The rest of the x86 enablement is very small. Summary: - Generate __mcount_loc in objtool (Peter Zijlstra) - Support running objtool against vmlinux.o (Sami Tolvanen) - Clang LTO enablement for x86 (Sami Tolvanen)" Link: https://lore.kernel.org/lkml/20201013003203.4168817-26-samitolvanen@google.com/ Link: https://lore.kernel.org/lkml/cover.1611263461.git.jpoimboe@redhat.com/ * tag 'clang-lto-v5.12-rc1-part2' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux: kbuild: lto: force rebuilds when switching CONFIG_LTO x86, build: allow LTO to be selected x86, cpu: disable LTO for cpu.c x86, vdso: disable LTO only for vDSO kbuild: lto: postpone objtool objtool: Split noinstr validation from --vmlinux x86, build: use objtool mcount tracing: add support for objtool mcount objtool: Don't autodetect vmlinux.o objtool: Fix __mcount_loc generation with Clang's assembler objtool: Add a pass for generating __mcount_loc
156 lines
3.1 KiB
C
156 lines
3.1 KiB
C
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
/*
|
|
* Copyright (C) 2015 Josh Poimboeuf <jpoimboe@redhat.com>
|
|
*/
|
|
|
|
/*
|
|
* objtool:
|
|
*
|
|
* The 'check' subcmd analyzes every .o file and ensures the validity of its
|
|
* stack trace metadata. It enforces a set of rules on asm code and C inline
|
|
* assembly code so that stack traces can be reliable.
|
|
*
|
|
* For more information, see tools/objtool/Documentation/stack-validation.txt.
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdbool.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <subcmd/exec-cmd.h>
|
|
#include <subcmd/pager.h>
|
|
#include <linux/kernel.h>
|
|
|
|
#include <objtool/builtin.h>
|
|
#include <objtool/objtool.h>
|
|
#include <objtool/warn.h>
|
|
|
|
struct cmd_struct {
|
|
const char *name;
|
|
int (*fn)(int, const char **);
|
|
const char *help;
|
|
};
|
|
|
|
static const char objtool_usage_string[] =
|
|
"objtool COMMAND [ARGS]";
|
|
|
|
static struct cmd_struct objtool_cmds[] = {
|
|
{"check", cmd_check, "Perform stack metadata validation on an object file" },
|
|
{"orc", cmd_orc, "Generate in-place ORC unwind tables for an object file" },
|
|
};
|
|
|
|
bool help;
|
|
|
|
const char *objname;
|
|
static struct objtool_file file;
|
|
|
|
struct objtool_file *objtool_open_read(const char *_objname)
|
|
{
|
|
if (objname) {
|
|
if (strcmp(objname, _objname)) {
|
|
WARN("won't handle more than one file at a time");
|
|
return NULL;
|
|
}
|
|
return &file;
|
|
}
|
|
objname = _objname;
|
|
|
|
file.elf = elf_open_read(objname, O_RDWR);
|
|
if (!file.elf)
|
|
return NULL;
|
|
|
|
INIT_LIST_HEAD(&file.insn_list);
|
|
hash_init(file.insn_hash);
|
|
INIT_LIST_HEAD(&file.static_call_list);
|
|
INIT_LIST_HEAD(&file.mcount_loc_list);
|
|
file.c_file = !vmlinux && find_section_by_name(file.elf, ".comment");
|
|
file.ignore_unreachables = no_unreachable;
|
|
file.hints = false;
|
|
|
|
return &file;
|
|
}
|
|
|
|
static void cmd_usage(void)
|
|
{
|
|
unsigned int i, longest = 0;
|
|
|
|
printf("\n usage: %s\n\n", objtool_usage_string);
|
|
|
|
for (i = 0; i < ARRAY_SIZE(objtool_cmds); i++) {
|
|
if (longest < strlen(objtool_cmds[i].name))
|
|
longest = strlen(objtool_cmds[i].name);
|
|
}
|
|
|
|
puts(" Commands:");
|
|
for (i = 0; i < ARRAY_SIZE(objtool_cmds); i++) {
|
|
printf(" %-*s ", longest, objtool_cmds[i].name);
|
|
puts(objtool_cmds[i].help);
|
|
}
|
|
|
|
printf("\n");
|
|
|
|
if (!help)
|
|
exit(129);
|
|
exit(0);
|
|
}
|
|
|
|
static void handle_options(int *argc, const char ***argv)
|
|
{
|
|
while (*argc > 0) {
|
|
const char *cmd = (*argv)[0];
|
|
|
|
if (cmd[0] != '-')
|
|
break;
|
|
|
|
if (!strcmp(cmd, "--help") || !strcmp(cmd, "-h")) {
|
|
help = true;
|
|
break;
|
|
} else {
|
|
fprintf(stderr, "Unknown option: %s\n", cmd);
|
|
cmd_usage();
|
|
}
|
|
|
|
(*argv)++;
|
|
(*argc)--;
|
|
}
|
|
}
|
|
|
|
static void handle_internal_command(int argc, const char **argv)
|
|
{
|
|
const char *cmd = argv[0];
|
|
unsigned int i, ret;
|
|
|
|
for (i = 0; i < ARRAY_SIZE(objtool_cmds); i++) {
|
|
struct cmd_struct *p = objtool_cmds+i;
|
|
|
|
if (strcmp(p->name, cmd))
|
|
continue;
|
|
|
|
ret = p->fn(argc, argv);
|
|
|
|
exit(ret);
|
|
}
|
|
|
|
cmd_usage();
|
|
}
|
|
|
|
int main(int argc, const char **argv)
|
|
{
|
|
static const char *UNUSED = "OBJTOOL_NOT_IMPLEMENTED";
|
|
|
|
/* libsubcmd init */
|
|
exec_cmd_init("objtool", UNUSED, UNUSED, UNUSED);
|
|
pager_init(UNUSED);
|
|
|
|
argv++;
|
|
argc--;
|
|
handle_options(&argc, &argv);
|
|
|
|
if (!argc || help)
|
|
cmd_usage();
|
|
|
|
handle_internal_command(argc, argv);
|
|
|
|
return 0;
|
|
}
|