2021-10-14 23:09:14

by Steven Rostedt

[permalink] [raw]
Subject: [PATCH] nds32/ftrace: Fix Error: invalid operands (*UND* and *UND* sections) for `^'

[ Resending with "PATCH" in subject ]

I received a build failure for a new patch I'm working on the nds32
architecture, and when I went to test it, I couldn't get to my build error,
because it failed to build with a bunch of:

Error: invalid operands (*UND* and *UND* sections) for `^'

issues with various files. Those files were temporary asm files that looked
like: kernel/.tmp_mc_fork.s

I decided to look deeper, and found that the "mc" portion of that name
stood for "mcount", and was created by the recordmcount.pl script. One that
I wrote over a decade ago. Once I knew the source of the problem, I was
able to investigate it further.

The way the recordmcount.pl script works (BTW, there's a C version that
simply modifies the ELF object) is by doing an "objdump" on the object
file. Looks for all the calls to "mcount", and creates an offset of those
locations from some global variable it can use (usually a global function
name, found with <.*>:). Creates a asm file that is a table of references
to these locations, using the found variable/function. Compiles it and
links it back into the original object file. This asm file is called
".tmp_mc_<object_base_name>.s".

The problem here is that the objdump produced by the nds32 object file,
contains things that look like:

0000159a <.L3^B1>:
159a: c6 00 beqz38 $r6, 159a <.L3^B1>
159a: R_NDS32_9_PCREL_RELA .text+0x159e
159c: 84 d2 movi55 $r6, #-14
159e: 80 06 mov55 $r0, $r6
15a0: ec 3c addi10.sp #0x3c


Where ".L3^B1 is somehow selected as the "global" variable to index off of.

Then the assembly file that holds the mcount locations looks like this:

.section __mcount_loc,"a",@progbits
.align 2
.long .L3^B1 + -5522
.long .L3^B1 + -5384
.long .L3^B1 + -5270
.long .L3^B1 + -5098
.long .L3^B1 + -4970
.long .L3^B1 + -4758
.long .L3^B1 + -4122
[...]

And when it is compiled back to an object to link to the original object,
the compile fails on the "^" symbol.

Simple solution for now, is to have the perl script ignore using function
symbols that have an "^" in the name.

Fixes: fbf58a52ac088 ("nds32/ftrace: Add RECORD_MCOUNT support")
Signed-off-by: Steven Rostedt (VMware) <[email protected]>
---
diff --git a/scripts/recordmcount.pl b/scripts/recordmcount.pl
index 8f6b13ae46bf..7d631aaa0ae1 100755
--- a/scripts/recordmcount.pl
+++ b/scripts/recordmcount.pl
@@ -189,7 +189,7 @@ if ($arch =~ /(x86(_64)?)|(i386)/) {
$local_regex = "^[0-9a-fA-F]+\\s+t\\s+(\\S+)";
$weak_regex = "^[0-9a-fA-F]+\\s+([wW])\\s+(\\S+)";
$section_regex = "Disassembly of section\\s+(\\S+):";
-$function_regex = "^([0-9a-fA-F]+)\\s+<(.*?)>:";
+$function_regex = "^([0-9a-fA-F]+)\\s+<([^^]*?)>:";
$mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\s(mcount|__fentry__)\$";
$section_type = '@progbits';
$mcount_adjust = 0;


2021-10-15 07:53:37

by Greentime Hu

[permalink] [raw]
Subject: Re: [PATCH] nds32/ftrace: Fix Error: invalid operands (*UND* and *UND* sections) for `^'

Steven Rostedt <[email protected]> 於 2021年10月15日 週五 上午2:35寫道:
>
> [ Resending with "PATCH" in subject ]
>
> I received a build failure for a new patch I'm working on the nds32
> architecture, and when I went to test it, I couldn't get to my build error,
> because it failed to build with a bunch of:
>
> Error: invalid operands (*UND* and *UND* sections) for `^'
>
> issues with various files. Those files were temporary asm files that looked
> like: kernel/.tmp_mc_fork.s
>
> I decided to look deeper, and found that the "mc" portion of that name
> stood for "mcount", and was created by the recordmcount.pl script. One that
> I wrote over a decade ago. Once I knew the source of the problem, I was
> able to investigate it further.
>
> The way the recordmcount.pl script works (BTW, there's a C version that
> simply modifies the ELF object) is by doing an "objdump" on the object
> file. Looks for all the calls to "mcount", and creates an offset of those
> locations from some global variable it can use (usually a global function
> name, found with <.*>:). Creates a asm file that is a table of references
> to these locations, using the found variable/function. Compiles it and
> links it back into the original object file. This asm file is called
> ".tmp_mc_<object_base_name>.s".
>
> The problem here is that the objdump produced by the nds32 object file,
> contains things that look like:
>
> 0000159a <.L3^B1>:
> 159a: c6 00 beqz38 $r6, 159a <.L3^B1>
> 159a: R_NDS32_9_PCREL_RELA .text+0x159e
> 159c: 84 d2 movi55 $r6, #-14
> 159e: 80 06 mov55 $r0, $r6
> 15a0: ec 3c addi10.sp #0x3c
>
>
> Where ".L3^B1 is somehow selected as the "global" variable to index off of.
>
> Then the assembly file that holds the mcount locations looks like this:
>
> .section __mcount_loc,"a",@progbits
> .align 2
> .long .L3^B1 + -5522
> .long .L3^B1 + -5384
> .long .L3^B1 + -5270
> .long .L3^B1 + -5098
> .long .L3^B1 + -4970
> .long .L3^B1 + -4758
> .long .L3^B1 + -4122
> [...]
>
> And when it is compiled back to an object to link to the original object,
> the compile fails on the "^" symbol.
>
> Simple solution for now, is to have the perl script ignore using function
> symbols that have an "^" in the name.
>
> Fixes: fbf58a52ac088 ("nds32/ftrace: Add RECORD_MCOUNT support")
> Signed-off-by: Steven Rostedt (VMware) <[email protected]>
> ---
> diff --git a/scripts/recordmcount.pl b/scripts/recordmcount.pl
> index 8f6b13ae46bf..7d631aaa0ae1 100755
> --- a/scripts/recordmcount.pl
> +++ b/scripts/recordmcount.pl
> @@ -189,7 +189,7 @@ if ($arch =~ /(x86(_64)?)|(i386)/) {
> $local_regex = "^[0-9a-fA-F]+\\s+t\\s+(\\S+)";
> $weak_regex = "^[0-9a-fA-F]+\\s+([wW])\\s+(\\S+)";
> $section_regex = "Disassembly of section\\s+(\\S+):";
> -$function_regex = "^([0-9a-fA-F]+)\\s+<(.*?)>:";
> +$function_regex = "^([0-9a-fA-F]+)\\s+<([^^]*?)>:";
> $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\s(mcount|__fentry__)\$";
> $section_type = '@progbits';
> $mcount_adjust = 0;
loop in Alan and KC

2021-10-16 11:28:34

by Steven Rostedt

[permalink] [raw]
Subject: Re: [PATCH] nds32/ftrace: Fix Error: invalid operands (*UND* and *UND* sections) for `^'

On Fri, 15 Oct 2021 08:54:35 +0800
Greentime Hu <[email protected]> wrote:

> loop in Alan and KC

Any thoughts?

This has passed my tests, and I want to send it off to Linus. But it would
be nice to have an acked by from one of the nds32 maintainers.

If I don't hear back today, I'll just send my queue without this update to
Linus, as I want to get my changes in before the next rc release.

Thanks!

-- Steve

2021-10-16 21:16:44

by Greentime Hu

[permalink] [raw]
Subject: Re: [PATCH] nds32/ftrace: Fix Error: invalid operands (*UND* and *UND* sections) for `^'

Steven Rostedt <[email protected]> 於 2021年10月15日 週五 下午10:18寫道:
>
> On Fri, 15 Oct 2021 08:54:35 +0800
> Greentime Hu <[email protected]> wrote:
>
> > loop in Alan and KC
>
> Any thoughts?
>
> This has passed my tests, and I want to send it off to Linus. But it would
> be nice to have an acked by from one of the nds32 maintainers.
>
> If I don't hear back today, I'll just send my queue without this update to
> Linus, as I want to get my changes in before the next rc release.
>
> Thanks!

Acked-by: Greentime Hu <[email protected]>
Thanks you, Steven.