mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-25 09:41:09 -04:00
For all CONFIG_CFI+CONFIG_CALL_PADDING configs, for C functions, the __cfi_ symbols only cover the 5-byte kCFI type hash. After that there also N bytes of NOP padding between the hash and the function entry which aren't associated with any symbol. The NOPs can be replaced with actual code at runtime. Without a symbol, unwinders and tooling have no way of knowing where those bytes belong. Grow the existing __cfi_* symbols to fill that gap. Note that assembly functions with SYM_TYPED_FUNC_START() aren't affected by this issue, their __cfi_ symbols also cover the padding. Also, CONFIG_PREFIX_SYMBOLS has no reason to exist: CONFIG_CALL_PADDING is what causes the compiler to emit NOP padding before function entry (via -fpatchable-function-entry), so it's the right condition for creating prefix symbols. Remove CONFIG_PREFIX_SYMBOLS, as it's no longer needed. Simplify the LONGEST_SYM_KUNIT_TEST dependency accordingly. Rework objtool's arguments a bit to handle the variety of prefix/cfi-related cases. Suggested-by: Peter Zijlstra <peterz@infradead.org> Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
63 lines
1.0 KiB
C
63 lines
1.0 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/*
|
|
* Copyright (C) 2015 Josh Poimboeuf <jpoimboe@redhat.com>
|
|
*/
|
|
#ifndef _BUILTIN_H
|
|
#define _BUILTIN_H
|
|
|
|
#include <subcmd/parse-options.h>
|
|
|
|
struct opts {
|
|
/* actions: */
|
|
bool checksum;
|
|
const char *disas;
|
|
bool dump_orc;
|
|
bool hack_jump_label;
|
|
bool hack_noinstr;
|
|
bool hack_skylake;
|
|
bool ibt;
|
|
bool mcount;
|
|
bool noabs;
|
|
bool noinstr;
|
|
bool orc;
|
|
int prefix;
|
|
bool retpoline;
|
|
bool rethunk;
|
|
bool unret;
|
|
bool sls;
|
|
bool stackval;
|
|
bool static_call;
|
|
bool uaccess;
|
|
|
|
/* options: */
|
|
bool backtrace;
|
|
bool backup;
|
|
bool cfi;
|
|
const char *debug_checksum;
|
|
bool dryrun;
|
|
bool fineibt;
|
|
bool link;
|
|
bool mnop;
|
|
bool module;
|
|
bool no_unreachable;
|
|
const char *output;
|
|
bool sec_address;
|
|
bool stats;
|
|
const char *trace;
|
|
bool verbose;
|
|
bool werror;
|
|
bool wide;
|
|
};
|
|
|
|
extern struct opts opts;
|
|
|
|
int cmd_parse_options(int argc, const char **argv, const char * const usage[]);
|
|
|
|
int objtool_run(int argc, const char **argv);
|
|
|
|
int make_backup(void);
|
|
|
|
int cmd_klp(int argc, const char **argv);
|
|
|
|
#endif /* _BUILTIN_H */
|