Commit 34698bcbdf7b0629d6c873b5da7c63073fb45361
Committed by
Ingo Molnar
1 parent
dce9d18add
Exists in
master
and in
4 other branches
ftrace: dynamic ftrace process only text section
The text section stays in memory without ever leaving. With the exception of modules, but modules know how to handle that case. With the dynamic ftrace tracer, we need to make sure that it does not try to modify code that no longer exists. The only safe section is .text. This patch changes the recordmcount script to only record the mcount calls in the .text sections. Signed-off-by: Steven Rostedt <srostedt@redhat.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Showing 1 changed file with 14 additions and 3 deletions Side-by-side Diff
scripts/recordmcount.pl
... | ... | @@ -109,6 +109,11 @@ |
109 | 109 | my ($arch, $bits, $objdump, $objcopy, $cc, |
110 | 110 | $ld, $nm, $rm, $mv, $inputfile) = @ARGV; |
111 | 111 | |
112 | +# Acceptable sections to record. | |
113 | +my %text_sections = ( | |
114 | + ".text" => 1, | |
115 | +); | |
116 | + | |
112 | 117 | $objdump = "objdump" if ((length $objdump) == 0); |
113 | 118 | $objcopy = "objcopy" if ((length $objcopy) == 0); |
114 | 119 | $cc = "gcc" if ((length $cc) == 0); |
... | ... | @@ -139,7 +144,7 @@ |
139 | 144 | } |
140 | 145 | |
141 | 146 | if ($arch eq "x86_64") { |
142 | - $section_regex = "Disassembly of section"; | |
147 | + $section_regex = "Disassembly of section\\s+(\\S+):"; | |
143 | 148 | $function_regex = "^([0-9a-fA-F]+)\\s+<(.*?)>:"; |
144 | 149 | $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\smcount([+-]0x[0-9a-zA-Z]+)?\$"; |
145 | 150 | $type = ".quad"; |
... | ... | @@ -151,7 +156,7 @@ |
151 | 156 | $cc .= " -m64"; |
152 | 157 | |
153 | 158 | } elsif ($arch eq "i386") { |
154 | - $section_regex = "Disassembly of section"; | |
159 | + $section_regex = "Disassembly of section\\s+(\\S+):"; | |
155 | 160 | $function_regex = "^([0-9a-fA-F]+)\\s+<(.*?)>:"; |
156 | 161 | $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\smcount\$"; |
157 | 162 | $type = ".long"; |
... | ... | @@ -298,7 +303,13 @@ |
298 | 303 | while (<IN>) { |
299 | 304 | # is it a section? |
300 | 305 | if (/$section_regex/) { |
301 | - $read_function = 1; | |
306 | + | |
307 | + # Only record text sections that we know are safe | |
308 | + if (defined($text_sections{$1})) { | |
309 | + $read_function = 1; | |
310 | + } else { | |
311 | + $read_function = 0; | |
312 | + } | |
302 | 313 | # print out any recorded offsets |
303 | 314 | update_funcs() if ($text_found); |
304 | 315 |