Partially dynamically, partially statically :
- statically get linked all template instantiations (explicit or implicit)
- other things gets linked dynamically
This simple example :
#include <vector>
int main()
{
std::vector<int> v;
}
compiled like
g++ xxx.cpp -g -Wall -Wextra
produce a file which links next libraries :
$ ldd a.out
linux-vdso.so.1 => (0x00007fffa7767000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f353bee7000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f353bcd1000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f353b908000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f353b604000)
/lib64/ld-linux-x86-64.so.2 (0x00007f353c20c000)
and it has vector symbols :
$ nm a.out | grep vector
000000000040073e W _ZNSt6vectorIiSaIiEEC1Ev
000000000040073e W _ZNSt6vectorIiSaIiEEC2Ev
0000000000400758 W _ZNSt6vectorIiSaIiEED1Ev
0000000000400758 W _ZNSt6vectorIiSaIiEED2Ev