objtool: Split noinstr validation from --vmlinux
authorSami Tolvanen <samitolvanen@google.com>
Wed, 30 Sep 2020 21:36:59 +0000 (14:36 -0700)
committerKees Cook <keescook@chromium.org>
Tue, 23 Feb 2021 20:46:57 +0000 (12:46 -0800)
This change adds a --noinstr flag to objtool to allow us to specify
that we're processing vmlinux.o without also enabling noinstr
validation. This is needed to avoid false positives with LTO when we
run objtool on vmlinux.o without CONFIG_DEBUG_ENTRY.

Signed-off-by: Sami Tolvanen <samitolvanen@google.com>
scripts/link-vmlinux.sh
tools/objtool/builtin-check.c
tools/objtool/builtin.h
tools/objtool/check.c

index 423a410..18aed76 100755 (executable)
@@ -106,7 +106,7 @@ objtool_link()
        local objtoolopt;
 
        if [ -n "${CONFIG_VMLINUX_VALIDATION}" ]; then
-               objtoolopt="check --vmlinux"
+               objtoolopt="check --vmlinux --noinstr"
                if [ -z "${CONFIG_FRAME_POINTER}" ]; then
                        objtoolopt="${objtoolopt} --no-fp"
                fi
index facfc10..b84cdc7 100644 (file)
@@ -18,7 +18,7 @@
 #include "builtin.h"
 #include "objtool.h"
 
-bool no_fp, no_unreachable, retpoline, module, backtrace, uaccess, stats, validate_dup, vmlinux, mcount;
+bool no_fp, no_unreachable, retpoline, module, backtrace, uaccess, stats, validate_dup, vmlinux, mcount, noinstr;
 
 static const char * const check_usage[] = {
        "objtool check [<options>] file.o",
@@ -34,6 +34,7 @@ const struct option check_options[] = {
        OPT_BOOLEAN('a', "uaccess", &uaccess, "enable uaccess checking"),
        OPT_BOOLEAN('s', "stats", &stats, "print statistics"),
        OPT_BOOLEAN('d', "duplicate", &validate_dup, "duplicate validation for vmlinux.o"),
+       OPT_BOOLEAN('n', "noinstr", &noinstr, "noinstr validation for vmlinux.o"),
        OPT_BOOLEAN('l', "vmlinux", &vmlinux, "vmlinux.o validation"),
        OPT_BOOLEAN('M', "mcount", &mcount, "generate __mcount_loc"),
        OPT_END(),
index 94565a7..2502bb2 100644 (file)
@@ -8,7 +8,7 @@
 #include <subcmd/parse-options.h>
 
 extern const struct option check_options[];
-extern bool no_fp, no_unreachable, retpoline, module, backtrace, uaccess, stats, validate_dup, vmlinux, mcount;
+extern bool no_fp, no_unreachable, retpoline, module, backtrace, uaccess, stats, validate_dup, vmlinux, mcount, noinstr;
 
 extern int cmd_check(int argc, const char **argv);
 extern int cmd_orc(int argc, const char **argv);
index ab87fb9..85993e6 100644 (file)
@@ -244,7 +244,7 @@ static void init_insn_state(struct insn_state *state, struct section *sec)
         * not correctly determine insn->call_dest->sec (external symbols do
         * not have a section).
         */
-       if (vmlinux && sec)
+       if (vmlinux && noinstr && sec)
                state->noinstr = sec->noinstr;
 }