This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug c/19041] New: -fvisibility=hidden causes bad codegen for common symbols


Compile the following file with -fvisibility=hidden
int foo;
void bar(void) { foo = 0; }

You will find that the assembler rejects the .s file that the compiler creates, giving the error:
/var/tmp//cclfEVh7.s:16:non-relocatable subtraction expression, "_foo" minus "L00000000001$pb"
/var/tmp//cclfEVh7.s:16:symbol: "_foo" can't be undefined in a subtraction expression

The assembler is right to complain.  The compiler generates these lines:
        addis r2,r31,ha16(_foo-"L00000000001$pb")
        la r2,lo16(_foo-"L00000000001$pb")(r2)
This is incorrect.  Common symbols must be treated as undefined symbols, so they must be addressed 
indirectly through non-lazy pointers.  Without -fvisibility=hidden, the compiler gets this right.

-- 
           Summary: -fvisibility=hidden causes bad codegen for common
                    symbols
           Product: gcc
           Version: 4.0.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: austern at apple dot com
                CC: gcc-bugs at gcc dot gnu dot org
 GCC build triplet: powerpc-apple-darwin7.6.0
  GCC host triplet: powerpc-apple-darwin7.6.0
GCC target triplet: powerpc-apple-darwin7.6.0


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19041


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]