Re: Linker Error When Building gnat 4.6.0

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Shea Levy <shea@xxxxxxxxxxxx> writes:

> On 03/29/2011 04:00 PM, Ian Lance Taylor wrote:
>> Shea Levy<shea@xxxxxxxxxxxx>  writes:
>>
>>> On 03/29/2011 03:42 PM, Ian Lance Taylor wrote:
>>>> Shea Levy<shea@xxxxxxxxxxxx>   writes:
>>>>
>>>>>>> When trying to build GCC 4.6.0 with Ada support, I get the following error:
>>>>>>>
>>>>>>> ld: ../libiberty/pic/libiberty.a(simple-object-coff.o): relocation
>>>>>>> R_X86_64_PC32 against undefined symbol `simple_object_set_big_16' can not
>>>>>>> be used when making a shared object; recompile with -fPIC
>>>>>>> ld: final link failed: Bad value
>>>>>>> make[4]: *** [liblto_plugin.la] Error 1
>>>>>>>
>>>>>>> It was my understanding that the pic/ subdirectory of libiberty/ was for a
>>>>>>> PIC version of libiberty. This error occurs whether I explicitly export
>>>>>>> -fPIC in CFLAGS or not. I have been able to build GCC 4.6.0 successfully
>>>>>>> without Ada.
>>>>>> The cases where I have seen this are where somebody runs configure, runs
>>>>>> make, and then runs configure again in the same directory in a way that
>>>>>> changes whether the PIC version of libiberty needs to build.  Is it
>>>>>> possible that that happened here?
>>>>> I'm fairly certain this isn't happening, I automate my builds and
>>>>> start with a fresh unpacking each time. I've looked through the build
>>>>> logs, and I don't see any configure-like output after building
>>>>> starts. Also, there is a file libiberty/pic/libiberty.a after the
>>>>> build failure, though I don't know how to check if it has been built
>>>>> with PIC.
>>>> One simple thing is to check the build logs and see if you see -fPIC
>>>> there when building libiberty.  To see if libiberty/pic/libiberty.a is
>>>> PIC, run readelf -r and look for PLT or GOT relocs (see if the name of
>>>> the reloc has the string "PLT" or "GOT").  If you see those relocs, the
>>>> code was compiled with -fPIC.
>>>>
>>>> Looking at the code, I am reminded that simple_object_set_big_16 is
>>>> actually a static inline function in a header file #include'd by
>>>> simple-object-coff.c.  So it's odd that the function was not inlined.
>>>> And even if it weren't inlined, it's very odd that it is not defined.
>>>> So tell us more about how you are building gcc.  What compiler are you
>>>> using?  Are you using --enable-build-with-cxx?
>>>>
>>>> Ian
>>> For the build logs, I see libiberty being built twice, with everything
>>> in the pic/ subdirectory being built with -fpic (not -fPIC). The
>>> non-debug relocation sections of readelf -r libiberty/pic/libiberty.a
>>> contains many entries with type R_X86_64_PLT32, as well as many with
>>> type R_X86_64_PC32 and a few with type R_X86_64_GOTPCREL. The debug
>>> relocation sections contain entries of type R_X86_64_32 or
>>> R_X86_64_64.
>>>
>>> I am compiling with GCC 4.5.1, and all libraries on the system were
>>> built with that same compiler. My configure flags are as follows:
>>>
>>> --prefix=/nix/store/z8h0d602w6bhxjdcbvvc57b84dbf744i-gnat-4.6.0
>>> --disable-multilib
>>> --with-gmp=/nix/store/ji6py9m9w2ray1bmpkmgig9llj1i2ggf-gmp-4.3.2
>>> --with-mpfr=/nix/store/zy26xh7csglfc5vqb78pj4xi2z3qy9qc-mpfr-3.0.0
>>> --with-mpc=/nix/store/v3r9yi1fnf1v07zqifnvmwbv0mhv3iii-mpc-0.8.2
>>> --with-libelf=/nix/store/mfls8slvmcvg7r1c5k9z1lkcvi4ivwjg-libelf-0.8.13
>>> --disable-libstdcxx-pch
>>> --without-included-gettext
>>> --with-system-zlib
>>> --enable-languages=c,ada
>>> --enable-libada
>> That all looks entirely reasonable.  (The difference between -fpic and
>> -fPIC is irrelevant here.)
>>
>> The error message says
>>
>> relocation R_X86_64_PC32 against undefined symbol `simple_object_set_big_16' can not be used when making a shared object; recompile with -fPIC
>>
>> If you look at the file libiberty/pic/simple-object-coff.o, does it
>> define the symbol simple_object_set_big_16 (see readelf -s output)?
> Yes:
> 40: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND
> simple_object_set_big_16
>> Does it have a relocation against that symbol (see readelf -r output)?
> There are two relocations that might be it, I'm not sure how to tell:
> 000000000c62  002800000002 R_X86_64_PC32     0000000000000000
> simple_object_set_big_ - 4
> 000000000c9a  002a00000002 R_X86_64_PC32     0000000000000000
> simple_object_set_big_ - 4

The readelf program has an extremely unfortunate default behaviour,
which is to truncate symbol names.  Try passing the -w option.

This looks like the bug but I have no idea why it is happening.  A
static inline function should not be discarded if it is referenced
without being inlined.

Ian


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux