LINUX.ORG.RU

Как вывести список модулей загруженных в определённый процесс?

 


0

3

В Haiku есть listimage:

> listimage Tracker

TEAM  274 (/boot/system/Tracker):
   ID       Text       Data  Seq#      Init# Name
--------------------------------------------------------------------------------
 1638 0x00fc6000 0x00fc7000     0          0 /boot/system/Tracker
 1636 0x60de6000 0x00000000     0          0 commpage
 1637 0x0068d000 0x006ac000     0          0 /boot/system/runtime_loader
 1639 0x01bbe000 0x01e8f000     0          0 /boot/system/lib/libbe.so
 1640 0x0179b000 0x01962000     0          0 /boot/system/lib/libtracker.so
 1641 0x019f8000 0x01ad3000     0          0 /boot/system/lib/libroot.so
 1645 0x00926000 0x00958000     0          0 /boot/system/lib/libstdc++.r4.so
 1646 0x02460000 0x03ce0000     0          0 /boot/system/lib/libicudata.so.57.2
 1648 0x01f99000 0x0222a000     0          0 /boot/system/lib/libicui18n.so.57.2
 1649 0x01474000 0x0147d000     0          0 /boot/system/lib/libicuio.so.57.2
 1650 0x00b06000 0x00b59000     0          0 /boot/system/lib/libicule.so.57.2
 1651 0x00d32000 0x00d3d000     0          0 /boot/system/lib/libiculx.so.57.2
 1652 0x0047a000 0x004b3000     0          0 /boot/system/lib/libicutu.so.57.2
 1653 0x0229e000 0x02410000     0          0 /boot/system/lib/libicuuc.so.57.2
 1654 0x0137a000 0x01394000     0          0 /boot/system/lib/libz.so.1.2.11
 1655 0x00bd3000 0x00bea000     0          0 /boot/system/lib/libtranslation.so
 1656 0x041e3000 0x042da000     0          0 /boot/system/lib/libtextencoding.so

В Windows тоже без проблем можно вывести список модулей. Есть что-то аналогичное в Линуксе? Список mmap’ed файлов не предлагать.


Ответ на: комментарий от X512

ну в таком случае модули вообще не обязаны загружаться системным динамическим линкером а не самопальным, потому «надёжное решение» невозможно

anonymous ()
Ответ на: комментарий от X512

Что такое «модуль»?

Если я слинкую бинарник с библиотекой, и она будет загружена в адресное пространство во время старта, это модуль? Если я через dlopen подгружу библиотеку, это модуль? Если я mmap’ну файл, настрою права на исполнение, это модуль? Если я сгенерирую код в памяти на ходу, это модуль? Если я скопирую содержимое из файла в память без mmap’а и сделаю этот код исполняемым, это модуль? Если я просто адресное пространство у системы побольше попрошу, но ничего туда записывать не буду, это модуль?

i-rinat ★★★★★ ()
Ответ на: комментарий от i-rinat

Что такое «модуль»?

Это исполняемый файл процесса, всё что загружено через ld-linux.so и он сам.

Если я через dlopen подгружу библиотеку, это модуль?

Да.

Если я mmap’ну файл, настрою права на исполнение, это модуль? Если я сгенерирую код в памяти на ходу, это модуль? Если я скопирую содержимое из файла в память без mmap’а и сделаю этот код исполняемым, это модуль? Если я просто адресное пространство у системы побольше попрошу, но ничего туда записывать не буду, это модуль?

Нет. Модуль должен быть доступен для поиска символов из ld-linux.so.

X512 ()
Последнее исправление: X512 (всего исправлений: 1)
Ответ на: комментарий от X512

всё что загружено через ld-linux.so

То есть на Android нет «модулей», так?

Модуль должен быть доступен для поиска символов из ld-linux.so.

Это как вообще? Как из ld-linux.so искать символы?

i-rinat ★★★★★ ()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от i-rinat

Если я правильно понимаю, в Android используется /system/bin/linker. Конкретное названия модуля менеджера модулей зависит от дистрибутива. В Haiku это runtime_loader.

Как из ld-linux.so искать символы?

dlsym

X512 ()
Последнее исправление: X512 (всего исправлений: 1)
Ответ на: комментарий от X512

Если я mmap’ну файл, настрою права на исполнение, это модуль?

Нет.

Ты ведь в курсе, что интерпретатор именно это и делает? Но когда это сделал какой-то выбранный тобой интерпретатор, результат его деятельности это «модуль», а когда программа сама это сделала, нет.

i-rinat ★★★★★ ()
Ответ на: комментарий от i-rinat

Ты ведь в курсе, что интерпретатор именно это и делает?

Он ещё добавляет модуль в список модулей так чтобы можно было повторно использовать. То есть модуль - это то что зарегистрировано в списке модулей.

X512 ()
Ответ на: комментарий от X512

То есть модуль - это то что зарегистрировано в списке модулей.

С таким определением задача скорее всего решаема, но готового не знаю. Нужно что-то, что сделает ptrace(), заинжектит свою библиотеку (ну или любым другим образом вставит код) и дёрнет dl_iterate_phdr(). Отладчик исполняет так произвольный код значит это возможно, но отладчик также может и уронить приложение…

Нашёлся какой-то проект hotpatch.

xaizek ★★★★★ ()
Последнее исправление: xaizek (всего исправлений: 1)

zzz специально подгрузил через dlopen(«./zzz», RTLD_LAZY)

$ gdb
(gdb) attach PID
(gdb) info dll
From                To                  Syms Read   Shared Object Library
0x00007ffff7fd3100  0x00007ffff7ff2c24  Yes (*)     /lib64/ld-linux-x86-64.so.2
0x00007ffff7fad210  0x00007ffff7fae179  Yes (*)     /usr/lib/libdl.so.2
0x00007ffff7e0a630  0x00007ffff7f560ed  Yes (*)     /usr/lib/libc.so.6
0x00007ffff7fc7020  0x00007ffff7fc70e9  Yes (*)     ./zzz
(*): Shared library is missing debugging information.

Не?

pavlick ★★ ()