こんにちは私は、実行時にカスタマイズしたいグローバル関数を持つプログラムを持っています。さあ、共有ライブラリには多くのバージョンの関数foo()が散在しています。さて、実行時に検出されたシステム構成に基づいて、適切なライブラリの関数を使用したいと思います。動的ライブラリの関数のオーバーライド
ファイルloader.cpp:
#include <dlfcn.h>
#include <iostream>
void __attribute__((weak)) foo();
int main(int argc, char *argv[])
{
void* dl = dlopen("./other.so", RTLD_NOW | RTLD_GLOBAL);
if (!dl)
{
std::cerr << dlerror() << std::endl;
return 1;
}
if (foo)
{
foo();
}
else
{
std::cerr << "No foo?" << std::endl;
}
dlclose(dl);
return 0;
}
ファイルother.cpp:
#include <iostream>
void foo()
{
std::cout << "FOO!" << std::endl;
}
弱いシンボルがオーバーライドされていない場合しかし、私は
g++ -Wall -fPIC -o loaded loader.cpp -ldl
g++ -Wall -fPIC -shared -o other.so other.cpp
してプログラムをコンパイルします。何かヒント?