列出在Linux上使用C / C ++执行的程序中的共享库

问题描述 投票:1回答:2

我想知道在Linux上执行C / C ++程序时加载了哪些动态库。

例如,

int main()
{
    ...
    list = GetAllSharedLibraryFilePaths();
}

列表应包含:libm.so.6,librt.so.1,...或路径:/lib/x86_64-linux-gnu/libm.so.6、/lib/x86_64-linux-gnu/librt.so.1 ...

是否有返回所有共享库文件路径的API?我知道lddreadelf可以做到这一点,但我需要使用加载共享库的可执行文件中的C / C ++编程来做到这一点。

谢谢。

c++ linux dynamic-library
2个回答
0
投票

在加载共享库的可执行文件中。

我相信要获取当前进程,读取/proc/self/maps文件是在Linux上获取此信息并在最后一列中查找映射到进程内存的所有唯一.so文件的最简单方法,例如

55e8485f5000-55e8485fd000 r-xp 00000000 fd:01 654093                     /bin/cat
55e8487fc000-55e8487fd000 r--p 00007000 fd:01 654093                     /bin/cat
55e8487fd000-55e8487fe000 rw-p 00008000 fd:01 654093                     /bin/cat
55e84a238000-55e84a259000 rw-p 00000000 00:00 0                          [heap]
7f403d604000-7f403d8e2000 r--p 00000000 fd:01 920600                     /usr/lib/locale/locale-archive
7f403d8e2000-7f403dac9000 r-xp 00000000 fd:01 1439402                    /lib/x86_64-linux-gnu/libc-2.27.so
7f403dac9000-7f403dcc9000 ---p 001e7000 fd:01 1439402                    /lib/x86_64-linux-gnu/libc-2.27.so
...

所以您可以看到其中一个已加载的库是/lib/x86_64-linux-gnu/libc-2.27.so。它应该包括通过dlopen加载的所有内容以及直接链接的内容。


0
投票

您可以使用proc文件系统通过/proc/<pid>/maps查询共享库。查阅完整的reference for proc,其中显示了您可以解析的一些示例输出:

address           perms offset  dev   inode       pathname
...
35b1800000-35b1820000 r-xp 00000000 08:02 135522  /usr/lib64/ld-2.15.so
35b1a1f000-35b1a20000 r--p 0001f000 08:02 135522  /usr/lib64/ld-2.15.so
35b1a20000-35b1a21000 rw-p 00020000 08:02 135522  /usr/lib64/ld-2.15.so
35b1a21000-35b1a22000 rw-p 00000000 00:00 0
35b1c00000-35b1dac000 r-xp 00000000 08:02 135870  /usr/lib64/libc-2.15.so
35b1dac000-35b1fac000 ---p 001ac000 08:02 135870  /usr/lib64/libc-2.15.so
35b1fac000-35b1fb0000 r--p 001ac000 08:02 135870  /usr/lib64/libc-2.15.so
35b1fb0000-35b1fb2000 rw-p 001b0000 08:02 135870  /usr/lib64/libc-2.15.so

在第6列中采用唯一的路径名集将为您提供给定进程中加载​​的所有实际共享库。

注意,这只会为您提供在调用时在进程中处于活动状态的共享库,如果在启动时调用它,则将获得由加载器使用NEEDED条目解析的共享库。在ELF中。如果工具使用dyld,则需要再次检查列表。

请注意,如果出于安全目的执行此操作,则在您检查此列表时将已加载共享库,因此可能已经发生并掩盖了任何潜在的有害操作。如果出于安全原因要检查共享库,则需要解析ELF NEEDED条目,然后从环境中使用PATH进行解析。

© www.soinside.com 2019 - 2024. All rights reserved.