簡體   English   中英

如何知道我的程序在運行時實際使用哪個共享庫?

[英]How to know which shared library my program is actually using at run time?

如何確定運行時程序正在使用的共享庫的路徑?

我將glibc 2.12作為運行在CentOS 6.10系統上的主要glibc,並且還在/opt/glibc-2.14 安裝了 glibc 2.14。

當我檢查我的可執行文件時

$ objdump -p ./myProgram

它給出了這個信息

Dynamic Section:
NEEDED               libpthread.so.0
NEEDED               libcurl.so.4
NEEDED               libc.so.6

而我的LD_LIBRARY_PATH具有此值/opt/glibc-2.14/lib

是否可以查看我的程序在運行時實際上在使用哪個libc.so.6庫(也許帶有庫文件的路徑)?

在Linux上 :一種可能的方法是查看/proc/文件系統中的相應條目。 例如,對於具有PID X的程序,您可以在/proc/X/maps類似於以下內容的信息:

...
7f34a73d6000-7f34a73f8000 r--p 00000000 08:03 18371015                   /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/libc-2.27.so
7f34a73f8000-7f34a7535000 r-xp 00022000 08:03 18371015                   /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/libc-2.27.so
...

它清楚地顯示了我的libc(該程序使用的libc)在哪里。


示例 (缺少一些錯誤處理!)顯示fopen來自何處:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <stdint.h>

#define BSIZE 200

int main(void) {
    char buffer[BSIZE];
    int const pid = getpid();
    snprintf(buffer, BSIZE, "/proc/%d/maps", pid);
    FILE * const maps = fopen(buffer, "r");
    while (fgets(buffer, BSIZE, maps) != NULL) {
        unsigned long from, to;
        int const r = sscanf(buffer, "%lx-%lx", &from, &to);
        if (r != 2) {
            puts("!");
            continue;
        }
        if ((from <= (uintptr_t)&fopen) && ((uintptr_t)&fopen < to)) {
            char const * name = strchr(buffer, '/');
            if (name) {
                printf("%s", name);
            } else {
                puts("?");
            }
        }
    }
    fclose(maps);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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