Подтвердить что ты не робот

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

Есть ли способ проверить, какие библиотеки выполняются с помощью?

Чтобы быть более конкретным, если программа загружает некоторые общие библиотеки, используя dlopen, то readelf или ldd не покажут ее. Возможно ли вообще получить эту информацию из работающего процесса? Если да, то как?

4b9b3361

Ответ 1

Другие люди на правильном пути. Вот несколько способов.

cat /proc/NNNN/maps | awk '{print $6}' | grep '\.so' | sort | uniq

Или, с strace:

strace CMD.... 2>&1 | grep '^open(".*\.so"'

Оба из них предполагают, что общие библиотеки имеют ".so" где-то на своих путях, но вы можете это изменить. Первый дает довольно хороший результат, как список библиотек, по одному на строку. Второй будет продолжать перечислять библиотеки по мере их открытия, так что приятно.

Изменить: И, конечно, lsof...

lsof -p NNNN | awk '{print $9}' | grep '\.so'

Ответ 2

Может быть lsof - поможет швейцарский армейский нож Linux?

edit: для запуска, lsof -p <pid>, перечислены всевозможные полезные сведения, например, если процесс java, перечислены все открытые банки - очень круто...

Ответ 3

Собственно, вы можете сделать это в своем коде следующим образом:

#include <link.h>

using UnknownStruct = struct unknown_struct {
   void*  pointers[3];
   struct unknown_struct* ptr;
};
using LinkMap = struct link_map;

auto* handle = dlopen(NULL, RTLD_NOW);
auto* p = reinterpret_cast<UnknownStruct*>(handle)->ptr;
auto* map = reinterpret_cast<LinkMap*>(p->ptr);

while (map) {
  std::cout << map->l_name << std::endl;
  // do something with |map| like with handle, returned by |dlopen()|.
  map = map->l_next;
}

Структура link_map содержит, по крайней мере, базовый адрес и абсолютное имя файла. Это структура, которая фактически возвращается dlopen() с не-NULL первым аргументом. Подробнее см. здесь.

Ответ 4

ltrace кажется вашим другом.

Из ltrace руководства:

ltrace - это программа, которая просто выполняет указанную команду, пока            выходы. Он перехватывает и записывает вызовы динамической библиотеки которые            вызываемые выполненным процессом и сигналы, которые полученных            этот процесс. Он также может перехватывать и распечатывать системные вызовы Exe-            вырезанные программой.

       Its use is very similar to strace(1).

Ответ 5

В Linux /proc/<processid>/maps содержит список всех файлов, отображаемых в память, которые, как я полагаю, должны включать любые загруженные dlopen().

Ответ 6

В Solaris есть команда pldd.

Ответ 7

Будет ли strace трассировать открытый файл библиотеки?

Ответ 8

Вы можете сделать это программно в Linux. Вы можете использовать функцию dl_iterate_phdr.

Вот небольшой пример из справочной страницы:

#define _GNU_SOURCE
#include <link.h>
#include <stdlib.h>
#include <stdio.h>

static int
callback(struct dl_phdr_info *info, size_t size, void *data)
{
    int j;

   printf("name=%s (%d segments)\n", info->dlpi_name,
        info->dlpi_phnum);

   for (j = 0; j < info->dlpi_phnum; j++)
         printf("\t\t header %2d: address=%10p\n", j,
             (void *) (info->dlpi_addr + info->dlpi_phdr[j].p_vaddr));
    return 0;
}

int
main(int argc, char *argv[])
{
    dl_iterate_phdr(callback, NULL);

   exit(EXIT_SUCCESS);
}