โดยทั่วไปนี่เป็นคำถามสองข้อในคำถามเดียวเพราะถ้าฉันสามารถแสดงรายการสัญลักษณ์ทั้งหมดที่ส่งออกภายในระบบพร้อมกับเส้นทางไลบรารีที่ใช้ร่วมกันของพวกเขาฉันก็สามารถแสดง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
(อาจเป็นเพราะ symlink?) ซึ่ง แสดงข้อความข้อผิดพลาดเล็กน้อย (ซึ่งฉันไม่ชอบ)
สิ่งคือ - ldd
(หรือld
?) อาจทำการค้นหาสัญลักษณ์บางอย่าง แต่ฉันลองใช้ manpages ที่เกี่ยวข้องและฉันไม่เห็นวิธี "สัญลักษณ์" ใด ๆ จากบรรทัดคำสั่งโดยไม่ให้ไฟล์ปฏิบัติการที่เป็นไฟล์ ข้อโต้แย้ง. คำถามด้าน - มีวิธีใช้เครื่องมือเหล่านี้เพื่อสิ่งนั้นหรือไม่?
ดังนั้นสิ่งที่ฉันกำลังมองหาเครื่องมือบรรทัดคำสั่งซึ่งจะทำตัวเหมือน (pseudocode):
$ ./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 หรือไม่?