[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: checking command to parse /usr/bin/nm -B output from gcc object... f
From: |
Nick Bowler |
Subject: |
Re: checking command to parse /usr/bin/nm -B output from gcc object... failed |
Date: |
Tue, 7 Jan 2020 17:26:11 -0500 |
On 2020-01-07, Nick Bowler <address@hidden> wrote:
> On 1/7/20, Martin Liška <address@hidden> 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.
[...]
> However, LTO breaks nm really badly and with -fno-common this variable
> gets marked as "T" in the nm output. 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).
Workaround: add -ffat-lto-objects to CFLAGS so you get proper symbol
tables in object files and then set NM='nm --plugin ""' to completely
disable the busted LTO support in nm.
For example:
./configure CFLAGS='-flto -fno-common -ffat-lto-objects' NM='nm --plugin ""'