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)
[ツッコミを入れる]