diff options
author | Peter Zijlstra <peterz@infradead.org> | 2020-06-18 17:55:29 +0200 |
---|---|---|
committer | Peter Zijlstra <peterz@infradead.org> | 2020-06-18 17:55:29 +0200 |
commit | d832c0051f4e9cc7d26ef3bc6e9b662bc6a90f3a (patch) | |
tree | f7980a9c140174713b703851d06ed61283631e13 /tools/objtool/check.c | |
parent | 14bda4e5293ed9722f1dc39b543024e37707d6c6 (diff) | |
parent | 0f1441b44e823a74f3f3780902a113e07c73fbf6 (diff) |
Merge branch 'objtool/urgent' into objtool/core
Conflicts:
tools/objtool/elf.c
tools/objtool/elf.h
tools/objtool/orc_gen.c
tools/objtool/check.c
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Diffstat (limited to 'tools/objtool/check.c')
-rw-r--r-- | tools/objtool/check.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/tools/objtool/check.c b/tools/objtool/check.c index 559c1baf9fc5..a2313ecce6d1 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -12,6 +12,7 @@ #include "check.h" #include "special.h" #include "warn.h" +#include "arch_elf.h" #include <linux/hashtable.h> #include <linux/kernel.h> @@ -766,6 +767,24 @@ static int add_call_destinations(struct objtool_file *file) insn->call_dest = reloc->sym; /* + * Many compilers cannot disable KCOV with a function attribute + * so they need a little help, NOP out any KCOV calls from noinstr + * text. + */ + if (insn->sec->noinstr && + !strncmp(insn->call_dest->name, "__sanitizer_cov_", 16)) { + if (reloc) { + reloc->type = R_NONE; + elf_write_reloc(file->elf, reloc); + } + + elf_write_insn(file->elf, insn->sec, + insn->offset, insn->len, + arch_nop_insn(insn->len)); + insn->type = INSN_NOP; + } + + /* * Whatever stack impact regular CALLs have, should be undone * by the RETURN of the called function. * @@ -2740,7 +2759,7 @@ int check(const char *_objname, bool orc) objname = _objname; - file.elf = elf_open_read(objname, orc ? O_RDWR : O_RDONLY); + file.elf = elf_open_read(objname, O_RDWR); if (!file.elf) return 1; @@ -2801,7 +2820,9 @@ int check(const char *_objname, bool orc) ret = create_orc_sections(&file); if (ret < 0) goto out; + } + if (file.elf->changed) { ret = elf_write(file.elf); if (ret < 0) goto out; |