Fedora では、動的リンクは ld-linux.so.2 によって実行されます。動的リンカーは、/etc/ld.so.cache および /etc/ld.so.preload を使用してライブラリ ファイルを検索します。
ldconfig を実行して、libfoo が libbar を探す場所をシステムに伝えます。
ldconfig は、/lib、/usr/lib、および /etc/ld.so.conf にリストされている任意のディレクトリを調べます。プログラムがどのライブラリを使用しているかは、ldd で確認できます。
詳細については、各コマンドのマニュアル ページを参照してください。
共有ライブラリを使用したアプリケーションの例を次に示します。
プログラム.cc
#include "foo.h"
#include <iostream>
int main(int argc, char *argv[])
{
for (int i = 0; i < argc; ++i) {
std::cout << func_foo(argv[i]) << std::endl;
}
}
foo.h
#ifndef FOO_H
#define FOO_H
#include <string>
std::string func_foo(std::string const &);
#endif
foo.cc
#include "foo.h"
std::string func_foo(std::string const &arg)
{
return arg + "|" + __func__;
}
bar.h
#ifndef BAR_H
#define BAR_H
#include <string>
std::string func_bar();
#endif
bar.cc
#include "bar.h"
std::string func_bar()
{
return __func__;
}
libfoo.so を共有ライブラリとしてビルドします。
g++ -Wall -Wextra -fPIC -shared foo.cc -o libfoo.so
g++ -lfoo -L./ -Wall -Wextra program.cc foo.h -o program
ldd program
...
libfoo.so => 見つかりません
/etc/ld.so.cache
sudo ldconfig /home/tobias/projects/stubs/so/ を 更新します
ldd は、動的リンカーが libfoo.so
ldd プログラム を見つけたことを示してい
ます ...
libfoo.so => /home/tobias/projects/stubs/so/libfoo.so (0x00007f0bb9f15000)
libfoo.so に libbar.so への呼び出しを追加
新しい foo.cc
#include "foo.h"
#include "bar.h"
std::string func_foo(std::string const &arg)
{
return arg + "|" + __func__ + "|" + func_bar();
}
libbar.so をビルドし、libfoo.so を再ビルドします
g++ -Wall -Wextra -fPIC -shared bar.cc -o libbar.so
g++ -Wall -Wextra -fPIC -shared libbar.so foo.cc -o libfoo.so
ldd libfoo.so
...
libbar.so => 見つかりません
ldd program
...
libfoo.so => /home/tobias/projects/stubs/so/libfoo.so (0x00007f49236c7000)
libbar.so => not found
これは、ダイナミック リンカが libfoo.so をまだ見つけているが、libbar.so を見つけてい ないことを示しています。
再度 /etc/ld.so.cache を更新して再チェックします。
sudo ldconfig /home/tobias/projects/stubs/so/
ldd libfoo.so
...
libbar.so => /home/tobias/projects/stubs/so/libbar.so (0x00007f935e0bd000)
ldd プログラム
...
libfoo.so => /home/tobias/projects/stubs/so/libfoo.so (0x00007f2be4f11000)
libbar.so => /home/tobias/projects/stubs/so/libbar.so (0x00007f2be4d0e000)
libfoo.so と libbar.so の両方が見つかります。
この最後の手順は、アプリケーション プログラムに影響を与えないことに注意してください。本当に厳密な場合、ldconfig の実行は一種の再リンクです。奇妙なことに、リンカーはリンクするライブラリの依存関係を知る必要があります。これを実装するには他にも多くの方法がありますが、これが選択されました。