এক্সিকিউটেবলগুলি রানটাইমে ভাগ করা বস্তুগুলি কোথায় খুঁজে পাবে?


101

লিঙ্কিং / সংকলনের সময় ভাগ করা অবজেক্টগুলিকে কীভাবে অন্তর্ভুক্ত করা যায় তা আমি বুঝতে পারি। তবে, আমি এখনও আশ্চর্য হয়েছি যে এক্সিকিউটেবলগুলি *.soকার্যকর করার সময় কীভাবে ভাগ করা বস্তুর ( গ্রন্থাগারগুলি) সন্ধান করে।

উদাহরণস্বরূপ, আমার অ্যাপ্লিকেশনটি লাইব্রেরিতে a.outসংজ্ঞায়িত ফাংশনগুলিকে কল করে lib.so। সংকলনের পরে, আমি lib.soআমার একটি নতুন ডিরেক্টরিতে চলেছি $HOME

আমি কীভাবে বলতে a.outপারি সেখানে এটি সন্ধান করতে?

উত্তর:


101

ভাগ গ্রন্থাগার হাওটুর জড়িত প্রক্রিয়া অধিকাংশ বর্ণনা দেওয়া আছে এবং গতিশীল লোডার ম্যানুয়াল আরো বিস্তারিত মধ্যে যায়। প্রতিটি ইউনিক্স ভেরিয়েন্টের নিজস্ব পদ্ধতি রয়েছে তবে বেশিরভাগ একই এক্সিকিউটেবল ফর্ম্যাট ( ইএলএফ ) ব্যবহার করেন এবং একই রকম ডায়নামিক লিংকার থাকে (সোলারিস থেকে প্রাপ্ত)। নীচে আমি লিনাক্সের উপর ফোকাস দিয়ে সাধারণ আচরণের সংক্ষিপ্তসার করব; সম্পূর্ণ গল্পের জন্য আপনার সিস্টেমের ম্যানুয়ালগুলি পরীক্ষা করে দেখুন।

সংক্ষেপে, যখন এটি ডায়নামিক লাইব্রেরি ( .soফাইল) সন্ধান করে লিঙ্কার চেষ্টা করে:

  • LD_LIBRARY_PATHপরিবেশে পরিবর্তনশীল ( DYLD_LIBRARY_PATHOSX- এ) তালিকাভুক্ত ডিরেক্টরিগুলি ;
  • এক্সিকিউটেবলের আরপথে তালিকাভুক্ত ডিরেক্টরিসমূহ ;
  • সিস্টেম অনুসন্ধানের পাথের ডিরেক্টরিগুলি, যা (অন্তত লিনাক্সে) /etc/ld.so.confপ্লাস /libএবং এন্ট্রি নিয়ে গঠিত /usr/lib

আরপ্যাথটি এক্সিকিউটেবলে সংরক্ষণ করা হয় (এটি DT_RPATHবা DT_RUNPATHগতিশীল বৈশিষ্ট্য)। $ORIGINএক্সিকিউটেবলের অবস্থানের সাথে সম্পর্কিত কোনও পথ নির্দেশ করতে /opt/myapp/binএটিতে শুরু হওয়া নিখুঁত পাথ বা পাথ থাকতে পারে (উদাহরণস্বরূপ যদি এক্সিকিউটেবলটি থাকে এবং এর আরপথ থাকে $ORIGIN/../lib:$ORIGIN/../pluginsতবে ডায়নামিক লিঙ্কারটি সন্ধান করবে /opt/myapp/libএবং /opt/myapp/plugins)। আরপ্যাথটি সাধারণত নির্ধারিত হয় যখন এক্সিকিউটেবলটি সংকলিত হয়, -rpathবিকল্প সহ ld, তবে আপনি এটির পরে এটি পরিবর্তন করতে পারেন chrpath

আপনি যে দৃশ্যের বর্ণনা দিয়েছেন তাতে আপনি যদি অ্যাপ্লিকেশনটির বিকাশকারী বা প্যাকেজর হন এবং এটি একটি …/bin, …/libকাঠামোতে ইনস্টল করার উদ্দেশ্যে থাকেন তবে তার সাথে লিঙ্ক করুন -rpath='$ORIGIN/../lib'। আপনি যদি আপনার সিস্টেমে প্রাক-বিল্ট বাইনারি ইনস্টল করেন, হয় হয় লাইব্রেরিকে অনুসন্ধানের পথে একটি ডিরেক্টরিতে রেখে দিন ( /usr/local/libআপনি যদি সিস্টেম প্রশাসক হন, অন্যথায় আপনি যে ডিরেক্টরিতে যুক্ত করেন $LD_LIBRARY_PATH) তবে চেষ্টা করুন chrpath


3
কিছু সিস্টেমে, /lib64এবং /usr/lib6464 বিট বাইনারি জন্য ব্যবহার করা হয় এবং /libএবং /usr/lib32 বিট বাইনারি জন্য ব্যবহৃত হয়।
লাকাতা

কেন এই সঠিক উত্তর ldconfig সম্পর্কে কিছু কথা বলে না ??
সম্ভাব্যতা পছন্দ

1
@LovesProbability কারণ প্রশ্ন সম্পর্কে যেখানে এক্সেকিউটেবল লাইব্রেরির জন্য চেহারা ছিল, যা সঙ্গে যুক্ত নয় ldconfigldconfigআপনি যখন কোনও লাইব্রেরি ইনস্টল করেন তখন জড়িত হন।
গিলস

1
মনে রাখবেন যে, এর জন্য "সিস্টেম অনুসন্ধান পথ" *.soলাইব্রেরি হয় না হিসাবে একই $PATH। অনুসন্ধানের পথটি তাদের উত্তর হিসাবে @ এঞ্জোটিব দিয়েছেন। অনুসন্ধান করা হবে যে পাথ মুদ্রণ করতে, চালানো ldconfig -v 2>/dev/null | grep -v ^$'\t'
অ্যান্ড্রু বাট

আমার জন্য, এলডকনফিগ চালানোর জন্য, আমার দরকার ছিল /sbin/ldconfigএবং অ্যান্ড্রু বাটের অন্য যাদুটি এটি অ-রুট চালাতে পারা
রবার্ট লাগ

16

লিনাক্সে আচরণটি ld(1)ম্যান পৃষ্ঠাতে বর্ণিত হয়েছে

       The linker uses the following search paths to locate required
       shared libraries:

       1.  Any directories specified by -rpath-link options.

       2.  Any directories specified by -rpath options.  The difference
           between -rpath and -rpath-link is that directories specified by
           -rpath options are included in the executable and used at
           runtime, whereas the -rpath-link option is only effective at
           link time. Searching -rpath in this way is only supported by
           native linkers and cross linkers which have been configured
           with the --with-sysroot option.

       3.  On an ELF system, for native linkers, if the -rpath and
           -rpath-link options were not used, search the contents of the
           environment variable "LD_RUN_PATH".

       4.  On SunOS, if the -rpath option was not used, search any
           directories specified using -L options.

       5.  For a native linker, the search the contents of the environment
           variable "LD_LIBRARY_PATH".

       6.  For a native ELF linker, the directories in "DT_RUNPATH" or
           "DT_RPATH" of a shared library are searched for shared
           libraries needed by it. The "DT_RPATH" entries are ignored if
           "DT_RUNPATH" entries exist.

       7.  The default directories, normally /lib and /usr/lib.

       8.  For a native linker on an ELF system, if the file
           /etc/ld.so.conf exists, the list of directories found in that
           file.

       If the required shared library is not found, the linker will issue
       a warning and continue with the link.

1
"ডিফল্ট ডিরেক্টরিগুলি, সাধারণত / lib এবং / usr / lib।" -> আমার সিস্টেমটি স্বাভাবিক কিনা আমি কীভাবে তা জানতে পারি?
থারস্টেন স্টার্ক

2
প্রশ্ন রানটাইম সম্পর্কে এবং লিঙ্ক টাইমের নয়
টেলসপিন_কিট

2

আমি উত্তর নিশ্চিত এখানে নিশ্চিত ldconfig

ldconfig কম্যান্ড লাইনে উল্লিখিত ডিরেক্টরিগুলিতে, ফাইল /etc/ld.so.conf এবং বিশ্বস্ত ডিরেক্টরিতে (/ lib এবং / usr / lib) সন্ধানকারী অতি সম্প্রতি ভাগ করা লাইব্রেরিগুলিতে প্রয়োজনীয় লিঙ্ক এবং ক্যাশে তৈরি করে। ক্যাশে রান-টাইম লিঙ্কার, ld.so বা ld-linux.so দ্বারা ব্যবহৃত হয়। কোন সংস্করণে তাদের লিঙ্কগুলি আপডেট করা উচিত তা নির্ধারণ করার সময় ldconfig এটি যে লাইব্রেরিগুলির মুখোমুখি হয় তার হেডার এবং ফাইলের নাম পরীক্ষা করে che

http://linux.die.net/man/8/ldconfig


0

চলমান অ্যাপ্লিকেশনগুলির জন্য ফাইলটিতে /proc/1234/mapsসমস্ত প্রকৃত গতিযুক্ত যুক্ত লাইব্রেরি রয়েছে।

1234চলমান এক্সিকিউটেবলের পিড কোথায় ।

লিনাক্স এলডি_লিবিআরএআইপিএটিএইচ এবং অন্যান্য ভেরিয়েবলগুলি অনুসরণ করে, যেমন গিলসের উত্তরে উল্লেখ করা হয়েছে।


4
এটা খুব সুন্দর যে আপনি আপনার দ্বিতীয় বাক্যে নিশ্চিত করেছেন যে গিলস উত্তরটি সহায়তা করে। ফাইলটি কোথায় আছে, কীভাবে এটি ইতিমধ্যে পাওয়া গেছে কেবল সেখান থেকে কী পাওয়া গেছে সে সম্পর্কে কীভাবে বলতে হবে তা ব্যাখ্যা করার জন্য প্রথম অংশটি মোটেই অবদান রাখে না। সব মিলিয়ে একটি মন্তব্য হওয়া উচিত, উত্তর নয়।
অ্যান্থন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.