Compiling the following code with fvisibility=hidden exports Test::test(). (The used compiler is 4.2.1 20070622. Version 4.2.0 on a i686 gives the same results).
~$ cat test.cc #include <streambuf> class Test { void test(); }; void Test::test() { } ~$ g++ -fvisibility=hidden -fPIC -c -o test.o test.cc ~$ readelf -s test.o Symbol table '.symtab' contains 12 entries: Num: Value Size Type Bind Vis Ndx Name 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 1: 0000000000000000 0 FILE LOCAL DEFAULT ABS test.cc 2: 0000000000000000 0 SECTION LOCAL DEFAULT 1 3: 0000000000000000 0 SECTION LOCAL DEFAULT 2 4: 0000000000000000 0 SECTION LOCAL DEFAULT 3 5: 0000000000000000 0 SECTION LOCAL DEFAULT 4 6: 0000000000000000 0 SECTION LOCAL DEFAULT 6 7: 0000000000000000 0 SECTION LOCAL DEFAULT 9 8: 0000000000000000 0 SECTION LOCAL DEFAULT 8 9: 0000000000000000 10 FUNC GLOBAL DEFAULT 1 _ZN4Test4testEv 10: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND __gxx_personality_v0 11: 0000000000000000 8 OBJECT WEAK HIDDEN 6 DW.ref.__gxx_personality_ After removing #include <streambuf> from the testcase, Test::test() is hidden as expected. ~$ g++ -fvisibility=hidden -fPIC -c -o test.o test.cc ~$ readelf -s test.o Symbol table '.symtab' contains 12 entries: Num: Value Size Type Bind Vis Ndx Name 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 1: 0000000000000000 0 FILE LOCAL DEFAULT ABS test.cc 2: 0000000000000000 0 SECTION LOCAL DEFAULT 1 3: 0000000000000000 0 SECTION LOCAL DEFAULT 2 4: 0000000000000000 0 SECTION LOCAL DEFAULT 3 5: 0000000000000000 0 SECTION LOCAL DEFAULT 4 6: 0000000000000000 0 SECTION LOCAL DEFAULT 6 7: 0000000000000000 0 SECTION LOCAL DEFAULT 9 8: 0000000000000000 0 SECTION LOCAL DEFAULT 8 9: 0000000000000000 10 FUNC GLOBAL HIDDEN 1 _ZN4Test4testEv 10: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND __gxx_personality_v0 11: 0000000000000000 8 OBJECT WEAK HIDDEN 6 DW.ref.__gxx_personality_ -- Summary: fvisibility=hidden without effect in some casses Product: gcc Version: 4.2.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: gd at spherenet dot de GCC build triplet: x86_64-unknown-linux-gnu GCC host triplet: x86_64-unknown-linux-gnu GCC target triplet: x86_64-unknown-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32470