Temel olarak, bu iki soruya tek bir sorudur - çünkü bir sistem içerisinde dışa aktarılan tüm sembolleri, paylaşılan kütüphane yollarıyla birlikte listeleyebilirsem, o zaman basitçe grep
bu çıktıyı alabilirdim.
Çekirdek sembolleri için sanırım biraz daha kolay - çünkü her zaman cat /proc/kallsyms
bellekte yüklü olan modüllerin tüm sembollerinin bir listesini alabiliriz; daha sonra sudo cat /proc/modules
adresleriyle birlikte yüklü modüllerin bir listesini verecektir, ancak modüllerin yüklendiği yolları içermez (eğer ayrı, ağaç dışı .ko nesneleri olarak oluşturulmuşlarsa)
Örneğin, programı kst
kullanarak izlemeyi denerim 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
...
... ve bunun nerede olduğunu bilmek istiyorum _ZNK13QGraphicsItem10parentItemEv
.
Peki, paylaşılan kütüphane sembolleri hakkında ne yapmalı? [Gcc-help] Re ile okuma : Sembolün tanımlandığı kütüphaneyi bulma. ; Böyle bir şey denedim:
$ 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
...
... ama bu bana ek problemler veriyor: Sistemimdeki paylaşılan kütüphaneler için taranan tüm yolları gerçekten bilmiyorum, bu yüzden ilk denediğimde find /lib ...
hiçbir şey bulamadı; Dizinlerin tahminini zahmetli buluyorum, bunun yanı sıra alternatif: tüm kök dosya sistemini taramakla find
... Ve ayrıca, * .so'lar tarafından açılmayan nm
(belki onlar sembolik olduklarından?) Çarptığım gibi görünüyor. Oldukça fazla hata mesajı çıktısı alın (ki bu da hoşuma gitmedi).
Mesele şu ki - ldd
(veya ld
?) Muhtemelen bu sembollerin aranmasını gösteriyor, ancak ilgili man sayfalarını denedim ve komut satırından herhangi bir sembolü "çalıştırılabilir", bir tür çalıştırılabilir dosya sağlamadan bir yol göremiyorum. argüman. Yan soru - bu araçları bunun için kullanmanın bir yolu var mı?
Öyleyse, aradığım komut satırı aracı, şöyle bir şey olurdu (sözde kodu):
$ ./findsymbol '_Zls6QDebugN13QGraphicsItem16GraphicsItemFlagE'
symbol found in:
/usr/lib/libQtGui.so.4.7.2:00766d70 T _Zls6QDebugN13QGraphicsItem16GraphicsItemFlagE
...
... aranacak dizinleri belirtmediğim - ancak bunların da ele alınacağı, örneğin LD_PRELOAD
veya LD_LIBRARY_PATH
; eğer yapsam:
$ LD_PRELOAD="/path/to/mylib.so" ./findsymbol '*mylib_print*'
... o zaman /path/to/mylib.so
verilen sembolün nerede tanımlandığını (standart kütüphanelerde böyle bir sembolün bulunmaması nedeniyle) ve aksi takdirde "bulunmaz" çıktısını alırdım . Aksi halde, ./findsymbol --dumpall
mevcut tüm sembollerin bir listesini ve belirli bir ortamdan görülen konumlarını (örn bash
. Belirli bir kabuk) üretebilir .
Linux için böyle bir araç var mı?