Commit 34698bcbdf7b0629d6c873b5da7c63073fb45361

Authored by Steven Rostedt
Committed by Ingo Molnar
1 parent dce9d18add

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