В основному, це два питання в одне - адже, якщо я можу перерахувати всі символи, експортовані в системі, разом із їх спільним бібліотечним шляхом, то я міг би просто grep
вивести це.
Щодо символів ядра, я думаю, це дещо простіше - адже ми завжди можемо cat /proc/kallsyms
отримати список усіх символів тих модулів, завантажених у пам'ять; то sudo cat /proc/modules
дасть список завантажених модулів з їх адресами, але не шляхи, з яких завантажуються модулі (якщо вони побудовані як окремі, поза деревами .ko об'єкти)
Наприклад, я намагаюся простежити програму, kst
використовуючи ltrace
:
$ ltrace kst2
...
_ZNK13QGraphicsItem10parentItemEv(0xa1ccdb4, 0, 0xbfe631a8, 0x823652b, 0xbfe63298) = 0xa1ce854
__dynamic_cast(0xa1ce854, 0x839ff00, 0x8306b80, 84, 0xbfe63298) = 0xa1ce800
_ZNK13QGraphicsItem10parentItemEv(0xa1ccdb4, 0x839ff00, 0x8306b80, 84, 0xbfe63298) = 0xa1ce854
__dynamic_cast(0xa1ce854, 0x839ff00, 0x8306b80, 84, 0xbfe63298) = 0xa1ce800
...
... і я хотів би знати, де це місце проживання _ZNK13QGraphicsItem10parentItemEv
.
Отже, що робити зі спільними символами бібліотеки? Читання через [gcc-help] Re: пошук бібліотеки, в якій визначено символ. ; Я спробував щось подібне:
$ find /usr/lib -name '*.so*' -exec nm --print-file-name --defined-only --dynamic {} \; | grep "QGraphicsItem"
...
/usr/lib/libQtGui.so.4.7.2:00766d70 T _Zls6QDebugN13QGraphicsItem16GraphicsItemFlagE
/usr/lib/libQtGui.so.4.7.2:00766aa0 T _Zls6QDebugN13QGraphicsItem18GraphicsItemChangeE
/usr/lib/libQtGui.so.4.7.2:00767e80 T _Zls6QDebugP13QGraphicsItem
...
... але це створює мені додаткові проблеми: я насправді не знаю всіх шляхів, які скануються на спільні бібліотеки в моїй системі, тому коли я вперше спробував, find /lib ...
нічого не знайшов; Мені здається, що це вгадування каталогів є неприйнятним, так само як і альтернатива: сканування всієї кореневої файлової системи за допомогою find
... І також, я здається, потрапив * .so, який неможливо відкрити nm
(можливо, тому що вони є посиланнями?), Які вивести досить багато повідомлень про помилки (що мені теж не подобається).
Річ у тому, що ldd
(або ld
?), Ймовірно, виконує частину цього пошуку символів, але я спробував відповідні вказівки, і я не можу побачити спосіб "знайти" будь-який символ з командного рядка, не надаючи якийсь виконуваний файл як аргумент. Побічне запитання - чи існує спосіб використовувати ці інструменти для цього?
Отже, я шукаю інструмент командного рядка, який би поводився щось на зразок (псевдокод):
$ ./findsymbol '_Zls6QDebugN13QGraphicsItem16GraphicsItemFlagE'
symbol found in:
/usr/lib/libQtGui.so.4.7.2:00766d70 T _Zls6QDebugN13QGraphicsItem16GraphicsItemFlagE
...
... де я не вказую жодних каталогів для пошуку - але які б також обробляли, наприклад, LD_PRELOAD
або LD_LIBRARY_PATH
; скажіть, якщо я:
$ LD_PRELOAD="/path/to/mylib.so" ./findsymbol '*mylib_print*'
... тоді я отримав би те, /path/to/mylib.so
де визначено даний символ (враховуючи, що такого символу не буде в стандартних бібліотеках) - і виводиться "не знайдено" в іншому випадку. Інакше, ./findsymbol --dumpall
можна скласти список усіх доступних символів та їх розташування, що відображаються із заданого середовища (наприклад, конкретної bash
оболонки).
Чи існує такий інструмент для Linux?