2015年12月20日(日) [長年日記]
■ [dev][howto][c][c++] GCCで一部のライブラリだけ静的にリンクする
リンクするライブラリの一部だけを静的にリンクすることは、GCCの機能だけではできないみたい。-Wl オプション経由でldの -Bstatic と -Bdynamic オプションを使うと実現できた。
CentOS 7上で試す。デフォルトではlibboost_filesystem.so.1.60.0が動的リンクされている。
% g++ hello.cpp -I/home/kenichi/boost_1_60_0/include -L/home/kenichi/boost_1_60_0/lib \ > -lboost_filesystem -lboost_system % ldd a.out linux-vdso.so.1 => (0x00007ffc6ede3000) libboost_filesystem.so.1.60.0 => /home/kenichi/boost_1_60_0/lib/libboost_filesystem.so.1.60.0 (0x00007f1384f75000) libboost_system.so.1.60.0 => /home/kenichi/boost_1_60_0/lib/libboost_system.so.1.60.0 (0x00007f1384d70000) libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f1384a62000) libm.so.6 => /lib64/libm.so.6 (0x00007f1384760000) libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f1384549000) libc.so.6 => /lib64/libc.so.6 (0x00007f1384188000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f1383f6c000) librt.so.1 => /lib64/librt.so.1 (0x00007f1383d63000) /lib64/ld-linux-x86-64.so.2 (0x00007f138518f000)
libboost_filesystemに対して -Wl,-Bstatic、それ以外には -Wl,-Bdynamic を指定すると、libboost_filesystem.so.1.60.0は動的リンクされなくなる。
% g++ hello.cpp -I/home/kenichi/boost_1_60_0/include -L/home/kenichi/boost_1_60_0/lib \ > -Wl,-Bstatic -lboost_filesystem -Wl,-Bdynamic -lboost_system % ldd a.out linux-vdso.so.1 => (0x00007ffd0b1cb000) libboost_system.so.1.60.0 => /home/kenichi/boost_1_60_0/lib/libboost_system.so.1.60.0 (0x00007f335878b000) libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f335847c000) libm.so.6 => /lib64/libm.so.6 (0x00007f335817a000) libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f3357f64000) libc.so.6 => /lib64/libc.so.6 (0x00007f3357ba2000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f3357986000) librt.so.1 => /lib64/librt.so.1 (0x00007f335777e000) /lib64/ld-linux-x86-64.so.2 (0x00007f3358990000)