Về cơ bản, đây là hai câu hỏi thành một - bởi vì nếu tôi có thể liệt kê tất cả các biểu tượng được xuất trong một hệ thống, cùng với đường dẫn thư viện dùng chung của chúng, thì tôi có thể chỉ đơn giản grep
là đầu ra đó.
Đối với các ký hiệu kernel, tôi đoán nó có phần dễ dàng hơn - bởi vì chúng ta luôn có thể cat /proc/kallsyms
và nhận được một danh sách tất cả các ký hiệu của các mô-đun được tải trong bộ nhớ; sau đó sudo cat /proc/modules
sẽ đưa ra một danh sách các mô-đun được tải với địa chỉ của chúng, nhưng không phải là các đường dẫn mà các mô-đun đã được tải từ đó (nếu chúng được xây dựng dưới dạng các đối tượng .ko ngoài cây riêng biệt)
Chẳng hạn, tôi cố gắng theo dõi chương trình kst
bằng cách sử dụng 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
...
... Và tôi muốn biết nơi này _ZNK13QGraphicsItem10parentItemEv
nằm ở đâu.
Vì vậy, những gì để làm về các biểu tượng thư viện chia sẻ? Đọc qua [gcc-help] Re: tìm thư viện trong đó ký hiệu được xác định. ; Tôi đã thử một cái gì đó như thế này:
$ 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
...
... nhưng điều đó mang đến cho tôi những vấn đề khác: Tôi thực sự không biết tất cả các đường dẫn được quét cho các thư viện dùng chung trên hệ thống của mình, vì vậy khi tôi thử lần đầu tiên, find /lib ...
nó không tìm thấy gì; Tôi thấy việc đoán các thư mục này rất hay, cũng như cách khác: quét toàn bộ hệ thống tập tin gốc bằng find
... Và ngoài ra, tôi dường như đánh lên * .so không thể mở được nm
(có thể vì chúng là liên kết tượng trưng?), Mà xuất ra khá nhiều thông báo lỗi (mà tôi cũng không thích).
Vấn đề là - ldd
(hoặc ld
?) Có thể thực hiện một số tra cứu biểu tượng này, nhưng tôi đã thử các trang tương ứng và tôi không thể thấy cách "tìm" bất kỳ biểu tượng nào từ dòng lệnh, mà không cung cấp một loại tệp thực thi nào đó dưới dạng tranh luận. Câu hỏi phụ - có cách nào để sử dụng các công cụ này cho việc đó không?
Vì vậy, những gì tôi đang tìm kiếm một công cụ dòng lệnh, sẽ hoạt động giống như (mã giả):
$ ./findsymbol '_Zls6QDebugN13QGraphicsItem16GraphicsItemFlagE'
symbol found in:
/usr/lib/libQtGui.so.4.7.2:00766d70 T _Zls6QDebugN13QGraphicsItem16GraphicsItemFlagE
...
... nơi tôi không chỉ định bất kỳ thư mục nào để tìm kiếm - nhưng cũng sẽ xử lý, ví dụ LD_PRELOAD
hoặc LD_LIBRARY_PATH
; nói nếu tôi làm:
$ LD_PRELOAD="/path/to/mylib.so" ./findsymbol '*mylib_print*'
... sau đó tôi sẽ nhận được vị /path/to/mylib.so
trí của biểu tượng đã cho (được xác định rằng biểu tượng đó sẽ không tồn tại trong các thư viện chuẩn) - và sẽ xuất ra "không tìm thấy" nếu không. Và mặt khác, ./findsymbol --dumpall
có thể tạo ra một danh sách tất cả các biểu tượng có sẵn và vị trí của chúng nhìn thấy từ một môi trường nhất định (ví dụ: một bash
vỏ cụ thể ).
Có một công cụ như thế này tồn tại cho Linux?