私のプログラムには、次のようなコードがあります
/* libname may be a relative path */
void loadLib(char const *libname) {
void *handle = dlopen(libname);
/* ... */
dlclose(handle);
}
内/* .. */
で、メモリ マップ ファイルを読み取って、マップ/proc/self/maps
先の仮想メモリ アドレスを見つけるlibname
必要があります。また、ライブラリを開いてその中の特定のセクションを見つける必要もあります。このためには、さまざまな場所 (キャッシュ ファイルdlopen
など) を検索して見つかった絶対名が必要です。ldconfig
そのファイル名を受け取るにはどうすればよいですか?
これが私が最終的に得たものです(はい、これはC++コードですが、Cタグはdlopen
C++とCの両方で使用され、私の質問は両方に適格であり、POSIXはCに対してそれを指定しているため、この質問には意味があります. )。
boost::shared_ptr<void> dl;
if(void *handle = dlopen(libfile, RTLD_LAZY)) {
dl.reset(handle, &dlclose);
} else {
printdlerr();
return -1;
}
/* update sofile to be an absolute file name */
{
struct link_map *map;
dlinfo(dl.get(), RTLD_DI_LINKMAP, &map);
if(!map) {
return -1;
}
char *real = realpath(map->l_name, NULL);
if(!real)
return -1;
sofile.reset(real, &free);
}
libfile
相対/プレーンファイル名です。マップはプレーンでないファイル名を生成します (つまり、そうではありませんfoo.so
が、そうかもしれません./foo.so
)。その後realpath
、最終的な絶対パス名を取得していました。それはうまく機能します!