On Wed, Jun 11, 2014 at 5:01 AM, Rainer Orth
<r...@cebitec.uni-bielefeld.de> wrote:
> Ian Lance Taylor <i...@google.com> writes:
>
>> On Fri, Jun 6, 2014 at 2:12 AM, Rainer Orth <r...@cebitec.uni-bielefeld.de> 
>> wrote:
>>> Ian Lance Taylor <i...@google.com> writes:
>>>
>>>> I have committed a patch to libgo to merge from revision
>>>> 18783:00cce3a34d7e of the master library.  This revision was committed
>>>> January 7.  I picked this revision to merge to because the next revision
>>>> deleted a file that is explicitly merged in by the libgo/merge.sh
>>>> script.
>>>>
>>>> Among other things, this patch changes type descriptors to add a new
>>>> pointer to a zero value.  In gccgo this is implemented as a common
>>>> variable, and that requires some changes to the compiler and a small
>>>> change to go-gcc.cc.
>>>
>>> This change introduced many failures on Solaris with /bin/ld, e.g.
>>>
>>> FAIL: go.test/test/bom.go -O (test for excess errors)
>>>
>>> ld: warning: symbol 'go$zerovalue' has differing sizes:
>>>         (file bom.o value=0x8; file
>>> /var/gcc/regression/trunk/11-gcc/build/i386-pc-solaris2.11/./libgo/.libs/libgo.so
>>> value=0x800);
>>>         bom.o definition taken and updated with larger size
>>
>> Interesting.  This is working as intended, except for the warning.
>>
>> go$zerovalue is a common symbol, and the linker is supposed to use the
>> larger version.  From the error message I'm guessing the Solaris
>> linker supports this when linking object files, but not when linking
>> an object file against a shared library.
>>
>> I wonder if we could avoid this warning by giving go$zerovalue hidden
>> visibility.  That would mean something like this patch.
>>
>> Ian
>>
>> Index: go-gcc.cc
>> ===================================================================
>> --- go-gcc.cc (revision 211315)
>> +++ go-gcc.cc (working copy)
>> @@ -2521,6 +2521,8 @@ Gcc_backend::implicit_variable(const std
>>        DECL_COMMON(decl) = 1;
>>        TREE_PUBLIC(decl) = 1;
>>        gcc_assert(init_tree == NULL_TREE);
>> +      DECL_VISIBILITY(decl) = VISIBILITY_HIDDEN;
>> +      DECL_VISIBILITY_SPECIFIED(decl) = 1;
>>      }
>>    else if (is_constant)
>>      {
>
> Unfortunately, this doesn't make a difference.

That is peculiar.  Can you verify that in libgo.so the symbol
go$zerovalue is marked as hidden?  I don't understand why the linker
would say anything about a symbol in a .o file not matching a hidden
symbol in a .so file.  That seems like a linker bug, since the symbols
are not being linked together.


> I've now found that ld
> supports
>
>      -t
>
>          Turns off the  warning  for  multiply-defined  tentative
>          (common block) data symbols that have different sizes or
>          different  alignments.  This  option  is  equivalent  to
>          specifying the -z relax=common option.
>
> But I'm reluctant to enable this globally.  Since Go uses no specs file,
> support for target-specific (linker) options would have to go into gccgo
> somehow.

Does using that option fix the problem?

The place to add a target-specific linker option is gcc/go/gospec.c.
See, for example, the ways it adds -Wl,-u,pthread_create on some
systems.

Ian

Reply via email to