মূলত, এটি একটিতে দুটি প্রশ্ন - কারণ যদি আমি যদি কোনও সিস্টেমের মধ্যে রফতানি করা সমস্ত চিহ্নগুলি তাদের ভাগ করে নেওয়া লাইব্রেরির পাথের সাথে তালিকাভুক্ত করতে পারি তবে আমি কেবল 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] এর মাধ্যমে পড়া পুনরায়: লাইব্রেরিটি সন্ধান করুন যেখানে প্রতীকটি সংজ্ঞায়িত করা হয়েছে। ; আমি এরকম কিছু চেষ্টা করেছি:
$ 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
হিসাবেও দেখতে পাই: পুরো রুট ফাইল সিস্টেমটি দিয়ে স্ক্যান করা ... এবং এছাড়াও, আমি * .সকে হিট করে বলে মনে করি যা সেগুলি দ্বারা খোলা যায় না 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
প্রদত্ত প্রতীকটি যেখানে সংজ্ঞায়িত হয়েছিল (সেখানে এই জাতীয় প্রতীক মান গ্রন্থাগারে উপস্থিত থাকবে না) পেয়েছি এবং অন্যথায় "খুঁজে পাওয়া যায়নি" would এবং অন্যথায়, ./findsymbol --dumpall
সমস্ত উপলভ্য চিহ্ন এবং একটি নির্দিষ্ট পরিবেশ (যেমন একটি নির্দিষ্ট bash
শেল) থেকে দেখা তাদের অবস্থানগুলির তালিকা তৈরি করতে পারে ।
লিনাক্সের জন্য কি এর মতো কোনও সরঞ্জাম উপস্থিত রয়েছে?