Re: checking command to parse /usr/bin/nm -B output from gcc object... failed

Martin Liška <[email protected]>
Newsgroups gmane.comp.gnu.libtool.general
Message-ID <[email protected]>
On 1/8/20 10:16 AM, Martin Liška wrote:
> On 1/7/20 9:47 PM, Nick Bowler wrote:
>> On 1/7/20, Martin Liška <[email protected]> wrote:
>>> nm -B detection fails to be detected with -flto and -fno-common CFLAGS:
>>>
>>> configure:6307: checking command to parse /usr/bin/nm -B output from gcc
>>> object
>> [...]
>>> configure:6536: gcc -o conftest -O2 -Wall -D_FORTIFY_SOURCE=2
>>> -fstack-protector-strong -funwind-tables -fasynchronous-unwind-tables
>>> -fstack-clash-protection -Werror=return-type -g -fno-common -flto  -O2
>>> -Wall -D_FORTIFY_SOURCE=2 -fstack-protector-strong -funwind-tables
>>> -fasynchronous-unwind-tables -fstack-clash-protection
>>> -Werror=return-type -g -fno-common -flto conftest.c conftstm.o >&5
>>> conftest.c:18:12: error: variable 'nm_test_var' redeclared as function
>>>      18 | extern int nm_test_var();
>>>         |            ^
>>> conftest.c:4:6: note: previously declared here
>>>       4 |    relocations are performed -- see ld's documentation on
>>> pseudo-relocs.  */
>>>         |      ^
>>> lto1: fatal error: errors during merging of translation units
>>> compilation terminated.
>>>
>>> As seen, I bet problem is in conftstm.o file (for which I can't see
>>> how it's created). Probably the file is missing declaration of
>>> nm_test_var and so that it's implicitly deduced to be int
>>> nm_test_var().
>>
>> nm_test_var is defined as:
>>
>>    char nm_test_var;
>>
>> The test works by running nm on this file, parsing the output, and then
>> generating a C file which inserts references to all the exported symbols
>> it finds.  Then this is linked with the original file.
>>
>> With a "normal" compiler and -fno-common nm_test_var goes in BSS and
>> will be marked "B" in the nm output.
> 
> Hello.
> 
>>
>> However, LTO breaks nm really badly and with -fno-common this variable
>> gets marked as "T" in the nm output.
> 
> Thank you for identification of the root cause. I've just created a nm issue
> for that:
> https://sourceware.org/bugzilla/show_bug.cgi?id=25355

So apparently it's a known limitation of the LTO plugin. Question is whether
we can somehow workaround that?

Martin

> 
> That will fix the problem, so let's see.
> 
> Thanks,
> Martin
> 
>>  So it is indistinguishable from
>> functions and when the C file is generated, a function declaration for
>> nm_test_var is emitted (if it was correctly marked "B", then a variable
>> declaration will be emitted).
>>
>> It's really unfortunate that LTO breaks nm in this way.  But even
>> if this configure test didn't fail I suspect subsequent users of
>> $global_symbol_pipe will expect nm to work properly and it won't.
>>
>> I'm not 100% sure which libtool features will be affected by this
>> configuration failure.  It doesn't fatally stop the configure script.
>> Probably dlpreopen won't work at all?
>>
>> It's also unfortunate that since there is no way to directly reference
>> symbol values in standard C, a common way to do so is with dummy array
>> or function declarations, and lo and behold LTO apparently breaks this
>> too...
>>
>> Cheers,
>>    Nick
>>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.