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)
     {

Reply via email to