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/7/20 10:40 PM, Nick Bowler wrote:
> On 1/7/20, Bob Friesenhahn <[email protected]> wrote:
>> On Tue, 7 Jan 2020, 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:
>>
>> I don't know what vintage this documentation is (the copyright says it
>> is from 2020 so it seems to be the latest), but the page at
>> https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html says this
>> about "-fcommon"
>>
>> "The default is -fno-common, which specifies..."
>>
>> GCC 9.2 documentation says that the default is target dependent, which
>> suggests that some targets use no-common by default.
> 
> I think the fact that this test produces a common symbol most of the
> time, and that nm happens to work under LTO in this specific case, is
> mostly just a happy accident.

Well, the nm is using LTO plugin, so it should properly communicate
symbol types (in ideal world) :)

> 
>>> 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?
>>
>> Are there many users of dlpreopen()?
> 
> I imagine there are users of -dlopen, which is supposed to automatically
> fall back to dlpreopen when shared library support is not available (for
> example, if the user configures the package with --disable-shared).
> 
> Whether or not developers routinely test that their packages work with
> shared libraries disabled is another matter.
> 
> Regardless, $global_symbol_pipe is part of the documented libtool
> interface, which says you can do:
> 
>    eval "$NM progname | $global_symbol_pipe"
> 
> This is obviously busted because the failed configure test leads to
> global_symbol_pipe='' which will obviously cause problems in this
> usage (I just tested one of my scripts and yup, it is busted).

Yes, that's what I see for many package failures in openSUSE when I enable
-fno-common in optimization flags:

> 
> But more importantly I suspect the actual busted feature is
> $global_symbol_to_cdecl, which is supposed to produce declarations for
> the symbols you get from global_symbol_pipe.  This is clearly not
> working under LTO as it fails to distinguish functions and variables.
> 
> It might be possible to detect this case in configure and come up with
> a symbol declaration that works for both functions and data, which might
> enable global_symbol_to_cdecl to generate working declarations, and would
> probably fix this configure test and typical usage scenarios like
> dlpreopen.
> 
>>> 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...
>>
>> LTO often causes strange issues.  It needs to be used with care.
>>
>> Thus far I have seen LTO reduce the output executable size (sometimes
>> substantially if there is a lot of "dead" code) but I have not seen a
>> speed benefit to properly written code.
> 
> When I last played around with LTO on my C code I was hoping to
> achieve reduced executable size but I found the results to be almost
> exactly the same as what I was already getting by compiling everything
> with -ffunction-sections -fdata-sections and then linking with
> -Wl,--gc-sections.  And unlike LTO, those options don't break nm
> which would have required a massive amount of futzing with the
> build system to get things to even work.

I can provide quite some interesting numbers about usage of LTO (ideally with PGO):
http://hubicka.blogspot.com/2019/05/gcc-9-link-time-and-inter-procedural.html

Or if you want to compare SPEC numbers:
https://lnt.opensuse.org/db_default/v4/SPEC/spec_report/branch

In both scenarios LTO brings both speed up and size reduction.
And note that we enabled LTO in openSUSE Tumbleweed by default.

Martin

> 
> 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.