On Tue, Aug 09, 2011 at 04:58:01PM -0700, Andrew Pinski wrote: > On Tue, Aug 9, 2011 at 4:26 PM, Jed Davis <jedid...@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