কোনও লাইভ সিস্টেমে সংযুক্ত লাইব্রেরি প্রতীক কোথায় রয়েছে তা সন্ধান করুন / একটি সিস্টেমে রফতানি হওয়া সমস্ত চিহ্নের তালিকা করুন


21

মূলত, এটি একটিতে দুটি প্রশ্ন - কারণ যদি আমি যদি কোনও সিস্টেমের মধ্যে রফতানি করা সমস্ত চিহ্নগুলি তাদের ভাগ করে নেওয়া লাইব্রেরির পাথের সাথে তালিকাভুক্ত করতে পারি তবে আমি কেবল 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শেল) থেকে দেখা তাদের অবস্থানগুলির তালিকা তৈরি করতে পারে ।

লিনাক্সের জন্য কি এর মতো কোনও সরঞ্জাম উপস্থিত রয়েছে?

উত্তর:


16

লাইব্রেরিগুলির সন্ধানের জন্য পাথগুলি ফাইলের মধ্যে তালিকাভুক্ত করা হবে /etc/ld.so.conf, পরিবেশ পরিবর্তনশীল LD_LIBRARY_PATHএবং ELF বাইনারিতে এনকোড করা কোনও RPATHs H প্রোগ্রামটি lddআপনাকে বলবে যে কোনও নির্দিষ্ট অ্যাপ্লিকেশন লোড হবে কি লাইব্রেরি।

একবার আপনার প্রতীকটি সম্পর্কে আগ্রহী হয়ে উঠলে আপনি প্রোগ্রামটি ব্যবহার করতে পারেন ফাইলগুলির nmচিহ্ন .oএবং .aফাইলগুলি ছুঁড়ে ফেলার জন্য এবং readelfএকটি .soবা অন্য কোনও নির্বাহী থেকে চিহ্নগুলি ডাম্প করার জন্য ।

উদাহরণ:

nm -g /usr/lib/blah.a
readelf -Ws /usr/lib/blah.so

এবং অবশেষে, সেই ব্যাকগ্রাউন্ডটি একপাশে রেখে দেওয়া হল, এখানে আপনার পবিত্র কচুকাটি রয়েছে:

একটি প্রতীক দেওয়া _ZN6Kopete6Global10PropertiesC2Ev, এটি কোথায়?

scanelf -l -s _ZN6Kopete6Global10PropertiesC2Ev | grep _ZN6Kopete6Global10PropertiesC2Ev

যা ফলন দেয়:

ET_DYN _ZN6Kopete6Global10PropertiesC2Ev /usr/lib64/libkopete.so.4.11.4

-lপতাকায় dirs অনুসন্ধান করতে বলেছেন /etc/ld.so.confএবং -sতা নির্দিষ্ট প্রতীক খুঁজে।


এটি অসম্পূর্ণ: কিছু প্রোগ্রাম অ্যাপ্লিকেশন-নির্দিষ্ট ডিরেক্টরি থেকে লাইব্রেরি লোড করে।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

2
@ গিলস scanelfআপনাকে সন্ধানের জন্য নির্দিষ্ট ডিরেক্টরি নির্দিষ্ট করতে এবং পুনরাবৃত্তাকার সিচিং সমর্থন করে -rযাতে আপনি এর অনুসন্ধানের পথগুলি টুইঙ্ক করতে পারেন বা খুব বেশি ঝামেলা ছাড়াই আপনার পুরো সিস্টেমটি অনুসন্ধান করতে পারেন। উদাহরণস্বরূপ, scanelf -r -s SYMBOL /lib/* /usr/* /opt/*বেশিরভাগ জায়গাগুলি গ্রন্থাগারগুলি লুকিয়ে রয়েছে তা খুঁজে পাবে।
কেসি

7

GNU সিস্টেমে (GNU libc ডায়নামিক লিঙ্কার ব্যবহার করার সময়) আপনি নিজের প্রোগ্রামটি চালিয়ে যেতে পারেন:

LD_DEBUG=bindings kst2

প্রতীকগুলি কোথায় সমাধান করে তা সন্ধান করতে।


0

আমি এটি বেশ কয়েকবার চালিয়েছি, একটি লিনাক্স সিস্টেম থেকে অন্যটিতে কোড পোর্ট করার চেষ্টা করছি। সাধারণত আমি সব স্ট্যান্ডার্ড ডিরেক্টরি গ্রেপ করে শেষ করি। আমি গুগল করার মতো কিছু খুঁজে পেলাম না। সুতরাং এখানে একটি দ্রুত স্ক্রিপ্ট:

edt11x / findinsharedlibs

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.