В Linux, в программе на C ++, как найти путь к загруженной общей библиотеке? - PullRequest
3 голосов
/ 09 октября 2019

Мне нужно загрузить функции из пользовательской библиотеки на встроенной платформе, которая не имеет много обычных инструментов (например, без ldd, без gdb и т. Д.). Я кросс-компилирую для этой платформы.

Предположим, я хочу использовать функцию foo из libx.so. Теперь на платформе есть libx.so, включенный в системный каталог libs, но я хочу, чтобы моя программа забрала его из другого места. Я соответственно установил LD_LIBRARY_PATH, но я сильно подозреваю, что моя программа все еще подхватывает системную.

Я попробовал следующее:

    Dl_info dl_info;
    dladdr((void*)foo, &dl_info);
    fprintf(stdout, "module %s loaded\n", dl_info.dli_fname);

Но это возвращает a.out, чтоне полезно

Я также попробовал:

    Dl_info dl_info;
    link_map* lm;
    int code = dladdr1((void*)foo, &dl_info, (void**)(&lm), RTLD_DL_LINKMAP);
    if (code == 0)
    {
        std::cout << "Failed" << std::endl;
        return 0;
    }
    fprintf(stdout, "module %s loaded\n", lm->l_name);

И я получил пустую строку. Обратите внимание, код возврата был , а не 0.

Любые другие методы, которые я могу попробовать?

Спасибо.

1 Ответ

4 голосов
/ 09 октября 2019

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

# cat /proc/self/maps
55af8c635000-55af8c63d000 r-xp 00000000 08:01 4456473                    /bin/cat
55af8c83c000-55af8c83d000 r--p 00007000 08:01 4456473                    /bin/cat
55af8c83d000-55af8c83e000 rw-p 00008000 08:01 4456473                    /bin/cat
55af8cb0f000-55af8cb30000 rw-p 00000000 00:00 0                          [heap]
7f90267d6000-7f9027219000 r--p 00000000 08:01 6429169                    /usr/lib/locale/locale-archive
7f9027219000-7f9027400000 r-xp 00000000 08:01 267123                     /lib/x86_64-linux-gnu/libc-2.27.so
7f9027400000-7f9027600000 ---p 001e7000 08:01 267123                     /lib/x86_64-linux-gnu/libc-2.27.so
7f9027600000-7f9027604000 r--p 001e7000 08:01 267123                     /lib/x86_64-linux-gnu/libc-2.27.so
7f9027604000-7f9027606000 rw-p 001eb000 08:01 267123                     /lib/x86_64-linux-gnu/libc-2.27.so
7f9027606000-7f902760a000 rw-p 00000000 00:00 0 
7f902760a000-7f9027631000 r-xp 00000000 08:01 267095                     /lib/x86_64-linux-gnu/ld-2.27.so
7f90277f7000-7f902781b000 rw-p 00000000 00:00 0 
7f9027831000-7f9027832000 r--p 00027000 08:01 267095                     /lib/x86_64-linux-gnu/ld-2.27.so
7f9027832000-7f9027833000 rw-p 00028000 08:01 267095                     /lib/x86_64-linux-gnu/ld-2.27.so
7f9027833000-7f9027834000 rw-p 00000000 00:00 0 
7ffd03876000-7ffd03897000 rw-p 00000000 00:00 0                          [stack]
7ffd0399d000-7ffd039a0000 r--p 00000000 00:00 0                          [vvar]
7ffd039a0000-7ffd039a2000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...