This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: An unusual x86_64 code model
On Tue, Aug 09, 2011 at 04:58:01PM -0700, Andrew Pinski wrote:
> On Tue, Aug 9, 2011 at 4:26 PM, Jed Davis <jedidiah@vmware.com> wrote:
> > The existing workaround, which predates my personal involvement, is to
> > use -fPIE together with a -include'd file that uses a #pragma to set the
> > default symbol visibility to hidden, which suppresses the PLTness.
> > That works on GCC 4.1, but with newer versions that no longer affects
> > implicitly declared functions (which turn up occasionally in third-party
> > drivers), or coverage instrumentation's calls to __gcov_init, or probably
> > other things that have not yet been discovered. ?Also, it was never an
> > ideal solution, except in that it didn't require modifying the compiler
> > (at the time).
>
> Have you tried -fvisibility=hidden option ?
Sadly, that doesn't work:
$ cat test.c
int baz();
int quux() { return baz(); }
int foo() { return bar() + quux(); }
$ gcc -fprofile-arcs -fvisibility=hidden -fPIE -S test.c
$ grep call test.s
call baz@PLT
call bar@PLT
call quux
call __gcov_init@PLT
The fine manual states that "extern declarations are not affected by
-fvisibility", so that result is expected.
Adding "#pragma GCC visibility push(hidden)" also takes care of baz
(declared and extern), but not bar (implicit) or __gcov_init (very
implicit).
--Jed