objtool: Fix noinstr vs KCOV
Since many compilers cannot disable KCOV with a function attribute, help it to NOP out any __sanitizer_cov_*() calls injected in noinstr code. This turns: 12: e8 00 00 00 00 callq 17 <lockdep_hardirqs_on+0x17> 13: R_X86_64_PLT32 __sanitizer_cov_trace_pc-0x4 into: 12: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 13: R_X86_64_NONE __sanitizer_cov_trace_pc-0x4 Just like recordmcount does. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Acked-by: Dmitry Vyukov <dvyukov@google.com>
This commit is contained in:
@@ -565,3 +565,21 @@ void arch_initial_func_cfi_state(struct cfi_init_state *state)
|
||||
state->regs[16].base = CFI_CFA;
|
||||
state->regs[16].offset = -8;
|
||||
}
|
||||
|
||||
const char *arch_nop_insn(int len)
|
||||
{
|
||||
static const char nops[5][5] = {
|
||||
/* 1 */ { 0x90 },
|
||||
/* 2 */ { 0x66, 0x90 },
|
||||
/* 3 */ { 0x0f, 0x1f, 0x00 },
|
||||
/* 4 */ { 0x0f, 0x1f, 0x40, 0x00 },
|
||||
/* 5 */ { 0x0f, 0x1f, 0x44, 0x00, 0x00 },
|
||||
};
|
||||
|
||||
if (len < 1 || len > 5) {
|
||||
WARN("invalid NOP size: %d\n", len);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return nops[len-1];
|
||||
}
|
||||
|
6
tools/objtool/arch/x86/include/arch_elf.h
Normal file
6
tools/objtool/arch/x86/include/arch_elf.h
Normal file
@@ -0,0 +1,6 @@
|
||||
#ifndef _OBJTOOL_ARCH_ELF
|
||||
#define _OBJTOOL_ARCH_ELF
|
||||
|
||||
#define R_NONE R_X86_64_NONE
|
||||
|
||||
#endif /* _OBJTOOL_ARCH_ELF */
|
Reference in New Issue
Block a user