diff options
-rwxr-xr-x | scripts/recordmcount.pl | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/scripts/recordmcount.pl b/scripts/recordmcount.pl index 2ded5c8e6b85..409596eca124 100755 --- a/scripts/recordmcount.pl +++ b/scripts/recordmcount.pl | |||
@@ -101,7 +101,7 @@ $P =~ s@.*/@@g; | |||
101 | my $V = '0.1'; | 101 | my $V = '0.1'; |
102 | 102 | ||
103 | if ($#ARGV < 7) { | 103 | if ($#ARGV < 7) { |
104 | print "usage: $P arch objdump objcopy cc ld nm rm mv is_module inputfile\n"; | 104 | print "usage: $P arch bits objdump objcopy cc ld nm rm mv is_module inputfile\n"; |
105 | print "version: $V\n"; | 105 | print "version: $V\n"; |
106 | exit(1); | 106 | exit(1); |
107 | } | 107 | } |
@@ -275,7 +275,6 @@ if (!$found_version) { | |||
275 | "\tDisabling local function references.\n"; | 275 | "\tDisabling local function references.\n"; |
276 | } | 276 | } |
277 | 277 | ||
278 | |||
279 | # | 278 | # |
280 | # Step 1: find all the local (static functions) and weak symbols. | 279 | # Step 1: find all the local (static functions) and weak symbols. |
281 | # 't' is local, 'w/W' is weak (we never use a weak function) | 280 | # 't' is local, 'w/W' is weak (we never use a weak function) |
@@ -343,13 +342,16 @@ sub update_funcs | |||
343 | # | 342 | # |
344 | # Step 2: find the sections and mcount call sites | 343 | # Step 2: find the sections and mcount call sites |
345 | # | 344 | # |
346 | open(IN, "$objdump -dr $inputfile|") || die "error running $objdump"; | 345 | open(IN, "$objdump -hdr $inputfile|") || die "error running $objdump"; |
347 | 346 | ||
348 | my $text; | 347 | my $text; |
349 | 348 | ||
349 | my $read_headers = 1; | ||
350 | |||
350 | while (<IN>) { | 351 | while (<IN>) { |
351 | # is it a section? | 352 | # is it a section? |
352 | if (/$section_regex/) { | 353 | if (/$section_regex/) { |
354 | $read_headers = 0; | ||
353 | 355 | ||
354 | # Only record text sections that we know are safe | 356 | # Only record text sections that we know are safe |
355 | if (defined($text_sections{$1})) { | 357 | if (defined($text_sections{$1})) { |
@@ -383,6 +385,19 @@ while (<IN>) { | |||
383 | $ref_func = $text; | 385 | $ref_func = $text; |
384 | } | 386 | } |
385 | } | 387 | } |
388 | } elsif ($read_headers && /$mcount_section/) { | ||
389 | # | ||
390 | # Somehow the make process can execute this script on an | ||
391 | # object twice. If it does, we would duplicate the mcount | ||
392 | # section and it will cause the function tracer self test | ||
393 | # to fail. Check if the mcount section exists, and if it does, | ||
394 | # warn and exit. | ||
395 | # | ||
396 | print STDERR "ERROR: $mcount_section already in $inputfile\n" . | ||
397 | "\tThis may be an indication that your build is corrupted.\n" . | ||
398 | "\tDelete $inputfile and try again. If the same object file\n" . | ||
399 | "\tstill causes an issue, then disable CONFIG_DYNAMIC_FTRACE.\n"; | ||
400 | exit(-1); | ||
386 | } | 401 | } |
387 | 402 | ||
388 | # is this a call site to mcount? If so, record it to print later | 403 | # is this a call site to mcount? If so, record it to print later |