簡體   English   中英

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

[英]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? 我知道lddreadelf可以做到這一點,但我需要在加載共享庫的可執行文件中使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM