[V2] testsuite: support mold linker

Message ID e41a37eb-20ae-b5ef-9ab3-6e38682bfbd3@suse.cz
State Accepted
Headers
Series [V2] testsuite: support mold linker |

Checks

Context Check Description
snail/binutils-gdb-check success Github commit url

Commit Message

Martin Liška Dec. 5, 2022, 1:48 p.m. UTC
  Mold linker demotes symbols like main to be local and the patch
adjusts expected output from nm.

Moreover, simplify the patterns and remove accidental type 'D' that
is supported value for _?main functions.
---
 binutils/testsuite/binutils-all/addr2line.exp | 4 ++--
 binutils/testsuite/binutils-all/objcopy.exp   | 6 ++----
 libbacktrace/Makefile.am                      | 2 +-
 libbacktrace/Makefile.in                      | 2 +-
 4 files changed, 6 insertions(+), 8 deletions(-)
  

Comments

Jan Beulich Dec. 5, 2022, 2:08 p.m. UTC | #1
On 05.12.2022 14:48, Martin Liška wrote:
> Mold linker demotes symbols like main to be local and the patch
> adjusts expected output from nm.
> 
> Moreover, simplify the patterns and remove accidental type 'D' that
> is supported value for _?main functions.

Hmm, in my v1 comment I've said "accidental" to the difference, not
to the presence of D. In fact I was expecting you to uniformly use
[TtDd] everywhere. See also adacfc818440 (sadly without any real
description). (That commit is also where [some of] the odd ([...]+)?
regexp constructs were introduced.) Cc-ing Jakub in case he recalls
background.

Furthermore I now even less understand ...

> --- a/libbacktrace/Makefile.am
> +++ b/libbacktrace/Makefile.am
> @@ -498,7 +498,7 @@ TESTS += mtest_minidebug
>  
>  %_minidebug: %
>  	$(NM) -D $< -P --defined-only | $(AWK) '{ print $$1 }' | sort > $<.dsyms
> -	$(NM) $< -P --defined-only | $(AWK) '{ if ($$2 == "T" || $$2 == "t" || $$2 == "D") print $$1 }' | sort > $<.fsyms
> +	$(NM) $< -P --defined-only | $(AWK) '{ if ($$2 == "T" || $$2 == "t" || $$2 == "D" || $$2 == "d") print $$1 }' | sort > $<.fsyms

... this part of the change, where - as in v1 - you add a check for
'd', while a check for 't' (which supposedly is what you're after)
was already there.

Jan
  
Martin Liška Dec. 5, 2022, 2:24 p.m. UTC | #2
On 12/5/22 15:08, Jan Beulich wrote:
> On 05.12.2022 14:48, Martin Liška wrote:
>> Mold linker demotes symbols like main to be local and the patch
>> adjusts expected output from nm.
>>
>> Moreover, simplify the patterns and remove accidental type 'D' that
>> is supported value for _?main functions.
> 
> Hmm, in my v1 comment I've said "accidental" to the difference, not
> to the presence of D. In fact I was expecting you to uniformly use
> [TtDd] everywhere. See also adacfc818440 (sadly without any real
> description). (That commit is also where [some of] the odd ([...]+)?
> regexp constructs were introduced.) Cc-ing Jakub in case he recalls
> background.

Oh, I'm also curious why 'D' was added in the revision.

> 
> Furthermore I now even less understand ...
> 
>> --- a/libbacktrace/Makefile.am
>> +++ b/libbacktrace/Makefile.am
>> @@ -498,7 +498,7 @@ TESTS += mtest_minidebug
>>  
>>  %_minidebug: %
>>  	$(NM) -D $< -P --defined-only | $(AWK) '{ print $$1 }' | sort > $<.dsyms
>> -	$(NM) $< -P --defined-only | $(AWK) '{ if ($$2 == "T" || $$2 == "t" || $$2 == "D") print $$1 }' | sort > $<.fsyms
>> +	$(NM) $< -P --defined-only | $(AWK) '{ if ($$2 == "T" || $$2 == "t" || $$2 == "D" || $$2 == "d") print $$1 }' | sort > $<.fsyms
> 
> ... this part of the change, where - as in v1 - you add a check for
> 'd', while a check for 't' (which supposedly is what you're after)
> was already there.

This nm invocation is supposed to save dynamic symbols (.dyns) and normal symbols ('.fsyms'),
where .fsymc contains both data and functions.

The symbol which I need to properly list is:

mtest.c:int global = 1;

which gets 'b' with mold linker.

Martin

> 
> Jan
  
Jakub Jelinek Dec. 5, 2022, 2:25 p.m. UTC | #3
On Mon, Dec 05, 2022 at 03:08:58PM +0100, Jan Beulich wrote:
> On 05.12.2022 14:48, Martin Liška wrote:
> > Mold linker demotes symbols like main to be local and the patch
> > adjusts expected output from nm.
> > 
> > Moreover, simplify the patterns and remove accidental type 'D' that
> > is supported value for _?main functions.
> 
> Hmm, in my v1 comment I've said "accidental" to the difference, not
> to the presence of D. In fact I was expecting you to uniformly use
> [TtDd] everywhere. See also adacfc818440 (sadly without any real
> description). (That commit is also where [some of] the odd ([...]+)?
> regexp constructs were introduced.) Cc-ing Jakub in case he recalls
> background.

Only thing I found was
https://sourceware.org/pipermail/binutils/2004-March/033799.html
so it was ppc64.  Seems even these days ppc64 function symbols are
printed as D by nm (those symbols are in .opd section, which contains
the function descriptors).

	Jakub
  
Jan Beulich Dec. 5, 2022, 2:48 p.m. UTC | #4
On 05.12.2022 15:24, Martin Liška wrote:
> On 12/5/22 15:08, Jan Beulich wrote:
>> On 05.12.2022 14:48, Martin Liška wrote:
>> Furthermore I now even less understand ...
>>
>>> --- a/libbacktrace/Makefile.am
>>> +++ b/libbacktrace/Makefile.am
>>> @@ -498,7 +498,7 @@ TESTS += mtest_minidebug
>>>  
>>>  %_minidebug: %
>>>  	$(NM) -D $< -P --defined-only | $(AWK) '{ print $$1 }' | sort > $<.dsyms
>>> -	$(NM) $< -P --defined-only | $(AWK) '{ if ($$2 == "T" || $$2 == "t" || $$2 == "D") print $$1 }' | sort > $<.fsyms
>>> +	$(NM) $< -P --defined-only | $(AWK) '{ if ($$2 == "T" || $$2 == "t" || $$2 == "D" || $$2 == "d") print $$1 }' | sort > $<.fsyms
>>
>> ... this part of the change, where - as in v1 - you add a check for
>> 'd', while a check for 't' (which supposedly is what you're after)
>> was already there.
> 
> This nm invocation is supposed to save dynamic symbols (.dyns) and normal symbols ('.fsyms'),
> where .fsymc contains both data and functions.
> 
> The symbol which I need to properly list is:
> 
> mtest.c:int global = 1;
> 
> which gets 'b' with mold linker.

Yet then 'b' != 'd', and this is unrelated to "main" (which is the only
thing you mention in the description)?

Jan
  
Martin Liška Dec. 5, 2022, 2:52 p.m. UTC | #5
On 12/5/22 15:48, Jan Beulich wrote:
> On 05.12.2022 15:24, Martin Liška wrote:
>> On 12/5/22 15:08, Jan Beulich wrote:
>>> On 05.12.2022 14:48, Martin Liška wrote:
>>> Furthermore I now even less understand ...
>>>
>>>> --- a/libbacktrace/Makefile.am
>>>> +++ b/libbacktrace/Makefile.am
>>>> @@ -498,7 +498,7 @@ TESTS += mtest_minidebug
>>>>  
>>>>  %_minidebug: %
>>>>  	$(NM) -D $< -P --defined-only | $(AWK) '{ print $$1 }' | sort > $<.dsyms
>>>> -	$(NM) $< -P --defined-only | $(AWK) '{ if ($$2 == "T" || $$2 == "t" || $$2 == "D") print $$1 }' | sort > $<.fsyms
>>>> +	$(NM) $< -P --defined-only | $(AWK) '{ if ($$2 == "T" || $$2 == "t" || $$2 == "D" || $$2 == "d") print $$1 }' | sort > $<.fsyms
>>>
>>> ... this part of the change, where - as in v1 - you add a check for
>>> 'd', while a check for 't' (which supposedly is what you're after)
>>> was already there.
>>
>> This nm invocation is supposed to save dynamic symbols (.dyns) and normal symbols ('.fsyms'),
>> where .fsymc contains both data and functions.
>>
>> The symbol which I need to properly list is:
>>
>> mtest.c:int global = 1;
>>
>> which gets 'b' with mold linker.
> 
> Yet then 'b' != 'd',

Sure, 'd' should be there.

> and this is unrelated to "main" (which is the only
> thing you mention in the description)?

I mentioned 'symbols like main', so would it be better mentioning
'global symbols and variables'?

Thanks,
Martin

> 
> Jan
  
Jan Beulich Dec. 5, 2022, 3:13 p.m. UTC | #6
On 05.12.2022 15:52, Martin Liška wrote:
> On 12/5/22 15:48, Jan Beulich wrote:
>> On 05.12.2022 15:24, Martin Liška wrote:
>>> On 12/5/22 15:08, Jan Beulich wrote:
>>>> On 05.12.2022 14:48, Martin Liška wrote:
>>>> Furthermore I now even less understand ...
>>>>
>>>>> --- a/libbacktrace/Makefile.am
>>>>> +++ b/libbacktrace/Makefile.am
>>>>> @@ -498,7 +498,7 @@ TESTS += mtest_minidebug
>>>>>  
>>>>>  %_minidebug: %
>>>>>  	$(NM) -D $< -P --defined-only | $(AWK) '{ print $$1 }' | sort > $<.dsyms
>>>>> -	$(NM) $< -P --defined-only | $(AWK) '{ if ($$2 == "T" || $$2 == "t" || $$2 == "D") print $$1 }' | sort > $<.fsyms
>>>>> +	$(NM) $< -P --defined-only | $(AWK) '{ if ($$2 == "T" || $$2 == "t" || $$2 == "D" || $$2 == "d") print $$1 }' | sort > $<.fsyms
>>>>
>>>> ... this part of the change, where - as in v1 - you add a check for
>>>> 'd', while a check for 't' (which supposedly is what you're after)
>>>> was already there.
>>>
>>> This nm invocation is supposed to save dynamic symbols (.dyns) and normal symbols ('.fsyms'),
>>> where .fsymc contains both data and functions.
>>>
>>> The symbol which I need to properly list is:
>>>
>>> mtest.c:int global = 1;
>>>
>>> which gets 'b' with mold linker.
>>
>> Yet then 'b' != 'd',
> 
> Sure, 'd' should be there.
> 
>> and this is unrelated to "main" (which is the only
>> thing you mention in the description)?
> 
> I mentioned 'symbols like main', so would it be better mentioning
> 'global symbols and variables'?

Well, apologies - I didn't properly read that sentence, ignoring in
particular the "like". But of course your alternative text sounds
overall better to me ...

Jan
  

Patch

diff --git a/binutils/testsuite/binutils-all/addr2line.exp b/binutils/testsuite/binutils-all/addr2line.exp
index 66a2d5d32a0..957ae55df33 100644
--- a/binutils/testsuite/binutils-all/addr2line.exp
+++ b/binutils/testsuite/binutils-all/addr2line.exp
@@ -34,7 +34,7 @@  if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog executable debug
 #testcase for default option.
 #Run nm command and input the main symbol address to addr2line.
 set output [binutils_run $NM "$opts tmpdir/testprog$exe"]
-if ![regexp -line "^(\[0-9a-fA-F\]+)? +T ${dot}main" $output contents] then {
+if ![regexp -line "^(\[0-9a-fA-F\]+)? +\[Tt\] ${dot}main" $output contents] then {
     fail "$testname"
 } else {
     set list [regexp -inline -all -- {\S+} $contents]
@@ -49,7 +49,7 @@  if ![regexp -line "^(\[0-9a-fA-F\]+)? +T ${dot}main" $output contents] then {
 
 #testcase for -f option.
 #Run nm command and input the fn function symbol address to addr2line.
-if ![regexp -line "^(\[0-9a-fA-F\]+)? +T ${dot}fn" $output contents] then {
+if ![regexp -line "^(\[0-9a-fA-F\]+)? +\[Tt\] ${dot}fn" $output contents] then {
     fail "$testname -f option"
 } else {
     set list [regexp -inline -all -- {\S+} $contents]
diff --git a/binutils/testsuite/binutils-all/objcopy.exp b/binutils/testsuite/binutils-all/objcopy.exp
index de6f3aaaef2..7a1a36b9b57 100644
--- a/binutils/testsuite/binutils-all/objcopy.exp
+++ b/binutils/testsuite/binutils-all/objcopy.exp
@@ -652,8 +652,7 @@  proc strip_test_with_saving_a_symbol { } {
 
     set exec_output [binutils_run $NM "$NMFLAGS $objfile"]
     set exec_output [prune_warnings $exec_output]
-    if {![regexp {^([0-9a-fA-F]+)?[ ]+[TD] main} $exec_output] \
-         && ![regexp {^([0-9a-fA-F]+)?[ ]+T _main} $exec_output]} {
+    if {![regexp {^([0-9a-fA-F]+)?[ ]+[tT] _?main} $exec_output]} {
 	fail $test
 	return
     }
@@ -902,8 +901,7 @@  proc strip_executable_with_saving_a_symbol { prog flags test1 test2 } {
 	regsub "^\[0-9a-fA-F\]+\[ \]+T Main\[\n\r\]+" $exec_output "" exec_output
     }
 
-    if {![regexp {^([0-9a-fA-F]+)?[ ]+[TD] main} $exec_output] \
-         && ![regexp {^([0-9a-fA-F]+)?[ ]+[TD] _main} $exec_output]} {
+    if {![regexp {^([0-9a-fA-F]+)?[ ]+[Tt] _?main} $exec_output]} {
 	fail $test1
 	return
     }
diff --git a/libbacktrace/Makefile.am b/libbacktrace/Makefile.am
index 8874f41338a..bf9d30a382c 100644
--- a/libbacktrace/Makefile.am
+++ b/libbacktrace/Makefile.am
@@ -498,7 +498,7 @@  TESTS += mtest_minidebug
 
 %_minidebug: %
 	$(NM) -D $< -P --defined-only | $(AWK) '{ print $$1 }' | sort > $<.dsyms
-	$(NM) $< -P --defined-only | $(AWK) '{ if ($$2 == "T" || $$2 == "t" || $$2 == "D") print $$1 }' | sort > $<.fsyms
+	$(NM) $< -P --defined-only | $(AWK) '{ if ($$2 == "T" || $$2 == "t" || $$2 == "D" || $$2 == "d") print $$1 }' | sort > $<.fsyms
 	$(COMM) -13 $<.dsyms $<.fsyms > $<.keepsyms
 	$(OBJCOPY) --only-keep-debug $< $<.dbg
 	$(OBJCOPY) -S --remove-section .gdb_index --remove-section .comment --keep-symbols=$<.keepsyms $<.dbg $<.mdbg
diff --git a/libbacktrace/Makefile.in b/libbacktrace/Makefile.in
index 2ba8dfa8428..5167ca80ad1 100644
--- a/libbacktrace/Makefile.in
+++ b/libbacktrace/Makefile.in
@@ -2459,7 +2459,7 @@  uninstall-am:
 
 @HAVE_MINIDEBUG_TRUE@@NATIVE_TRUE@%_minidebug: %
 @HAVE_MINIDEBUG_TRUE@@NATIVE_TRUE@	$(NM) -D $< -P --defined-only | $(AWK) '{ print $$1 }' | sort > $<.dsyms
-@HAVE_MINIDEBUG_TRUE@@NATIVE_TRUE@	$(NM) $< -P --defined-only | $(AWK) '{ if ($$2 == "T" || $$2 == "t" || $$2 == "D") print $$1 }' | sort > $<.fsyms
+@HAVE_MINIDEBUG_TRUE@@NATIVE_TRUE@	$(NM) $< -P --defined-only | $(AWK) '{ if ($$2 == "T" || $$2 == "t" || $$2 == "D" || $$2 == "d") print $$1 }' | sort > $<.fsyms
 @HAVE_MINIDEBUG_TRUE@@NATIVE_TRUE@	$(COMM) -13 $<.dsyms $<.fsyms > $<.keepsyms
 @HAVE_MINIDEBUG_TRUE@@NATIVE_TRUE@	$(OBJCOPY) --only-keep-debug $< $<.dbg
 @HAVE_MINIDEBUG_TRUE@@NATIVE_TRUE@	$(OBJCOPY) -S --remove-section .gdb_index --remove-section .comment --keep-symbols=$<.keepsyms $<.dbg $<.mdbg