メモの日々


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)