私は/* .. */
内で次のdlopenに与えられた相対パスに対応する絶対ライブラリファイル名を取得する方法は?私のプログラムで
/* libname may be a relative path */
void loadLib(char const *libname) {
void *handle = dlopen(libname);
/* ... */
dlclose(handle);
}
のようなコードを持って、私はlibname
がマップされた仮想メモリアドレスを見つけるために、メモリ・マップ・ファイル/proc/self/maps
を読む必要があると私はまた、開く必要がありますライブラリを使用して、その中の特定のセクションを見つけます。このためには、dlopen
という絶対名が必要です(キャッシュファイルのldconfig
など)。そのファイル名をどのように受け取ることができますか?
これは私が最後になってしまったものです(はい、これはC++のコードで、dlopen
はC++と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
を使用しました。それはうまく動作します!私は機能pathfind()
を使用していると考えることができます
ありがとう。私はそれをし、それは動作します。私はすぐに私の最終的な道を示すでしょう。 –