Как узнать, какую разделяемую библиотеку фактически использует моя программа во время выполнения? - PullRequest
1 голос
/ 20 апреля 2019

Как определить путь к разделяемой библиотеке, используемой моей программой во время выполнения?

У меня glibc 2.12 в качестве основного glibc, работающего в моей системе CentOS 6.10, а также установлен glibc 2.14 в /opt/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 (возможно, с путем к файлу библиотеки) моя программа на самом деле использует , пока она работает ?

1 Ответ

4 голосов
/ 20 апреля 2019

В 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 (тот, который используется этой программой).


Пример (не хватает обработки ошибок!), Чтобы показать, откуда исходит 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);
}
...