gpt4 book ai didi

c++ - 在 Linux 上,在 C++ 程序中,如何找到加载的共享库的路径?

转载 作者:可可西里 更新时间:2023-11-01 11:51:12 25 4
gpt4 key购买 nike

我需要从没有很多常用工具(例如,没有 ldd、没有 gdb 等)的嵌入式平台上的自定义库加载函数。我正在交叉编译到那个平台。

假设我想使用 libx.so 中的函数 foo。现在平台在系统库目录中包含了 libx.so,但我希望我的程序从另一个位置获取它。我已经相应地设置了 LD_LIBRARY_PATH,但我强烈怀疑我的程序仍在获取系统路径。

我尝试了以下方法:

    Dl_info dl_info;
dladdr((void*)foo, &dl_info);
fprintf(stdout, "module %s loaded\n", 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 loaded\n", 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++ - 在 Linux 上,在 C++ 程序中,如何找到加载的共享库的路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58309551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com