Commit fa51c867 authored by Steven Rostedt's avatar Steven Rostedt Committed by Willy Tarreau

ftrace/x86: Set ftrace_stub to weak to prevent gcc from using short jumps to it

commit 8329e818 upstream.

Matt Fleming reported seeing crashes when enabling and disabling
function profiling which uses function graph tracer. Later Namhyung Kim
hit a similar issue and he found that the issue was due to the jmp to
ftrace_stub in ftrace_graph_call was only two bytes, and when it was
changed to jump to the tracing code, it overwrote the ftrace_stub that
was after it.

Masami Hiramatsu bisected this down to a binutils change:

8dcea93252a9ea7dff57e85220a719e2a5e8ab41 is the first bad commit
commit 8dcea93252a9ea7dff57e85220a719e2a5e8ab41
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Fri May 15 03:17:31 2015 -0700

    Add -mshared option to x86 ELF assembler

    This patch adds -mshared option to x86 ELF assembler.  By default,
    assembler will optimize out non-PLT relocations against defined non-weak
    global branch targets with default visibility.  The -mshared option tells
    the assembler to generate code which may go into a shared library
    where all non-weak global branch targets with default visibility can
    be preempted.  The resulting code is slightly bigger.  This option
    only affects the handling of branch instructions.

Declaring ftrace_stub as a weak call prevents gas from using two byte
jumps to it, which would be converted to a jump to the function graph
code.

Link: http://lkml.kernel.org/r/20160516230035.1dbae571@gandalf.local.homeReported-by: default avatarMatt Fleming <matt@codeblueprint.co.uk>
Reported-by: default avatarNamhyung Kim <namhyung@kernel.org>
Tested-by: default avatarMatt Fleming <matt@codeblueprint.co.uk>
Reviewed-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
Signed-off-by: default avatarWilly Tarreau <w@1wt.eu>
parent 823a2a03
...@@ -122,7 +122,8 @@ GLOBAL(ftrace_graph_call) ...@@ -122,7 +122,8 @@ GLOBAL(ftrace_graph_call)
jmp ftrace_stub jmp ftrace_stub
#endif #endif
GLOBAL(ftrace_stub) /* This is weak to keep gas from relaxing the jumps */
WEAK(ftrace_stub)
retq retq
END(ftrace_caller) END(ftrace_caller)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment