Hi all-
Using the Intel compiler (composer_xe_2011_sp1.9.293, icpc --version returns 12.1.3 20120212) on CentOS 5.10, I'm seeing extra global (exported) text symbols for each template instantiation in my shared library. I can reproduce this behavior with the following simple example:
int internal_func(void) { return 0; }
template<typename T> T foo(T bar) { return bar; }
template int foo<int>(int bar); // instantiate the template
__attribute__((visibility("default"))) int api_func(void) { return internal_func(); }Compile and strip the sample:
$ icpc -fvisibility=hidden -fPIC -shared -o tmp.so test.cxx
$ strip -x tmp.so
$ nm tmp.so
00000000000005d0 T .text._Z3fooIiET_S0_
w _Jv_RegisterClasses
00000000000005e0 T _Z8api_funcv
0000000000200938 A __bss_start
w __cxa_finalize@@GLIBC_2.2.5
w __gmon_start__
U __gxx_personality_v0@@CXXABI_1.3
0000000000200938 A _edata
0000000000200948 A _end
0000000000000638 T _fini
00000000000004c8 T _init
$The symbol in question is the first one, .text._Z3fooIiET_S0_. Notice that the actual template instantiation, _Z3fooliET_S0_, was stripped as expected (it's visibility is hidden based on the compiler command line options). Does anyone know why this extra, exported symbol exists? Can I manually strip it without impacting the behavior of my library?
Thanks in advance,
Stephen