[英]List shared library in the program executed using C/C++ on Linux
我想知道在 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? 我知道ldd
, readelf
可以做到這一點,但我需要在加載共享庫的可執行文件中使用 C/C++ 編程來做到這一點。
謝謝你。
在加載共享庫的可執行文件中。
我相信要獲取當前進程,讀取/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
加載的任何內容以及直接鏈接的內容。
您可以使用 proc 文件系統通過/proc/<pid>/maps
查詢共享庫。 請參閱 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 列中采用唯一的一組路徑名將為您提供在給定進程中加載的所有實際共享庫。
請注意,這只會為您提供調用時進程中處於活動狀態的共享庫,如果您在啟動時調用它,您將獲得加載器使用 ELF 中的NEEDED
條目解析的共享庫。 如果該工具使用dyld
您將需要再次檢查列表。
請注意,如果您出於安全目的執行此操作,則在您檢查此列表時共享庫已被加載,因此任何潛在的惡意操作都可能已經發生並被掩蓋。 如果出於安全原因要檢查共享庫,則需要解析 ELF NEEDED
條目,然后使用環境中的PATH
進行解析。
您可以使用非標准的dl_iterate_phdr(3)
函數來遍歷加載的共享對象列表。
#define _GNU_SOURCE
#include <link.h>
#include <stdio.h>
int print(struct dl_phdr_info *info, size_t size, void *data) {
printf("%s\n", info->dlpi_name);
return 0;
}
int main() {
dl_iterate_phdr(print, NULL);
return 0;
}
$ gcc test.c -o test
$ ./test
linux-vdso.so.1
/lib/x86_64-linux-gnu/libc.so.6
/lib64/ld-linux-x86-64.so.2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.