在 Linux 上,在 C++ 程序中,如何找到已加载共享库的路径?
On Linux, in a C++ program, how do I find the path to the shared library that was loaded?
我需要从没有很多常用工具(例如没有ldd,没有gdb等(的嵌入式平台上的自定义库中加载函数。我正在交叉编译到该平台。
假设我想使用libx.so
中的函数foo
。现在该平台libx.so
包含在系统库目录中,但我希望我的程序从另一个位置获取它。我已经相应地设置了LD_LIBRARY_PATH,但我强烈怀疑我的程序仍在选择系统程序。
我尝试了以下方法:
Dl_info dl_info;
dladdr((void*)foo, &dl_info);
fprintf(stdout, "module %s loadedn", dl_info.dli_fname);
但这返回a.out
,这是没有帮助的。
我也试过:
Dl_info dl_info;
link_map* lm;
int code = dladdr1((void*)foo, &dl_info, (void**)(&lm), RTLD_DL_LINKMAP);
if (code == 0)
{
std::cout << "Failed" << std::endl;
return 0;
}
fprintf(stdout, "module %s loadedn", lm->l_name);
我得到一个空字符串。请注意,返回代码不是0。
我可以尝试其他方法吗?
谢谢。
您可以查看/proc/<pid>/maps
(或/proc/self/maps
以查看当前进程的映射(。这将显示映射到进程地址空间的所有文件,其中包括共享库。
# cat /proc/self/maps
55af8c635000-55af8c63d000 r-xp 00000000 08:01 4456473 /bin/cat
55af8c83c000-55af8c83d000 r--p 00007000 08:01 4456473 /bin/cat
55af8c83d000-55af8c83e000 rw-p 00008000 08:01 4456473 /bin/cat
55af8cb0f000-55af8cb30000 rw-p 00000000 00:00 0 [heap]
7f90267d6000-7f9027219000 r--p 00000000 08:01 6429169 /usr/lib/locale/locale-archive
7f9027219000-7f9027400000 r-xp 00000000 08:01 267123 /lib/x86_64-linux-gnu/libc-2.27.so
7f9027400000-7f9027600000 ---p 001e7000 08:01 267123 /lib/x86_64-linux-gnu/libc-2.27.so
7f9027600000-7f9027604000 r--p 001e7000 08:01 267123 /lib/x86_64-linux-gnu/libc-2.27.so
7f9027604000-7f9027606000 rw-p 001eb000 08:01 267123 /lib/x86_64-linux-gnu/libc-2.27.so
7f9027606000-7f902760a000 rw-p 00000000 00:00 0
7f902760a000-7f9027631000 r-xp 00000000 08:01 267095 /lib/x86_64-linux-gnu/ld-2.27.so
7f90277f7000-7f902781b000 rw-p 00000000 00:00 0
7f9027831000-7f9027832000 r--p 00027000 08:01 267095 /lib/x86_64-linux-gnu/ld-2.27.so
7f9027832000-7f9027833000 rw-p 00028000 08:01 267095 /lib/x86_64-linux-gnu/ld-2.27.so
7f9027833000-7f9027834000 rw-p 00000000 00:00 0
7ffd03876000-7ffd03897000 rw-p 00000000 00:00 0 [stack]
7ffd0399d000-7ffd039a0000 r--p 00000000 00:00 0 [vvar]
7ffd039a0000-7ffd039a2000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
相关文章:
- 加载共享库时C++错误:libopencv_ximgproc.so.4.4
- 从 CMake 中的库目录加载共享库?
- 在另一台 PC 上执行程序时加载 SDL2 共享库时出错
- 无法使用 python ctypes 加载C++共享库
- Linux c++.在预加载的共享库中定义的基类的崩溃调用函数
- 共享对象、符号、C/C++ 库链接和加载
- ./main:加载共享库时出错:libopencv_highgui.so.4.0:无法打开共享对象文件:没有这样的文件或
- 在 win32 上生成 R 包:无法加载共享对象 (.dll)
- 使用CFBundleCreate在C++中的Mac上加载动态共享库(DLL)
- 加载共享库时出错:libbsoncxx.so._noabi:无法打开共享对象文件:没有此类文件或目录
- 在 Linux 上,在 C++ 程序中,如何找到已加载共享库的路径?
- 如何以编程方式查找加载的共享库的版本?
- 如何更改路径以修复错误"./main:加载共享库 libmkl_core.so 时出错?
- 正在加载共享对象:文件中未定义版本Qt_5
- ASAN 检测与动态加载库共享的类的 vtable 的 ODR 违规
- 如何处理加载错误的共享库版本的情况
- 使用共享指针加载到变量 C++ 中
- 将生成文件转换为CMakeLists;无法加载共享库
- 加载共享库时出现"错误:libSDL2_mixer-2.0.so.0:无法打开共享对象文件:没有这样的文件或目录
- 使用dlopen动态加载共享库