প্রদত্ত এক্সিকিউটেবলের জন্য লিঙ্কড লাইব্রেরি পরিবর্তন করা (সেন্টও 6)


29

আমার এর মতো এক্সিকিউটেবল লিংক রয়েছে:

  $ ldd a.out
        libboost_system-mt.so.1.47.0 => /usr/lib64/libboost_system-mt.so.1.47.0 (0x00007f4881f56000)
        libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f4881cfb000)
        libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f4881965000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f488175d000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4881540000)
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f4881239000)
.
.

যেখানে libcrypto এবং libssl গ্রন্থাগারগুলি ওপেনসেল ১.০.০-ফিপস লাইবস। পরিবর্তে আমি 1.0.1 গ্রন্থাগারগুলির সাথে পরীক্ষা করতে চাই এবং তাই আমি এগুলি আমার হোম ডিরেক্টরিতে তৈরি করেছি। a.outপ্রচুর ব্যথা ছাড়াই আমার নতুন ওপেনসেল লাইব্রেরিগুলির বিরুদ্ধে পুনরায় যোগাযোগ করার কোনও উপায় আছে কি ? আমি এড়াতে চাই

  • রিলিঙ্ক করা a.out(কারণ বিল্ড সরঞ্জামগুলি ব্যাপকভাবে জটিল)
  • যে কোনও বিশ্বব্যাপী সেটিংস পরিবর্তন করা (কারণ অন্যান্য ডিভগুলি এই মেশিনে কাজ করে)

আমি এখানে যা আশা করি তা করা কি সম্ভব?

উত্তর:


22

আপনি এই নির্দিষ্ট মৃত্যুর জন্য অস্থায়ীভাবে একটি পৃথক গ্রন্থাগার স্থাপন করতে পারেন। লিনাক্সে, এনভায়রনমেন্ট ভেরিয়েবল LD_LIBRARY_PATH ডিরেক্টরিগুলির একটি কোলন-বিচ্ছিন্ন সেট যেখানে স্ট্যান্ডার্ড ডিরেক্টরিগুলির আগে লাইব্রেরিগুলি অনুসন্ধান করা উচিত; একটি নতুন লাইব্রেরি ডিবাগ করার সময় বা বিশেষ উদ্দেশ্যে একটি অমানুষিক লাইব্রেরি ব্যবহার করার সময় এটি দরকারী। এনভায়রনমেন্ট ভেরিয়েবল LD_PRELOAD স্ট্যান্ডার্ড সেটটিকে ওভাররাইড করে এমন ফাংশনগুলির সাথে ভাগ করা লাইব্রেরি তালিকাবদ্ধ করে, ঠিক যেমন /etc/ld.so.preload করে। - ভাগ লাইব্রেরি

আপনি সরাসরি লোডারকেও ডেকে আনতে পারেন:

/lib/ld-linux.so.2 - লাইবারি-পাথ path executable


1
LD_LIBRARY_PATH ডিফল্ট অনুসন্ধানের পথটিকে ওভাররাইড করে না। আমি এটি সেট করেছি কিন্তু এলডিডি এখনও আমাকে সিস্টেমের ডিফল্ট পাথটি দেখায়, ওভাররাইড করা নয়। যদিও আমি নিজের লাইব্রেরিটি লোডিংকে এলডিপ্রেলএড সেট করে জোর করতে পারি।
কলমারিয়াস

18

একটি মোড়ক স্ক্রিপ্ট লিখুন যা LD_LIBRARY_PATHপরিবেশের পরিবর্তনশীল সেট করে । এটি PATHভাগ করা লাইব্রেরির জন্য দুল । সিস্টেম অনুসন্ধানের পথটি সর্বদা তালিকাভুক্ত ডিরেক্টরিগুলির পরে অনুসন্ধান করা হয় $LD_LIBRARY_PATH। রেফারেন্সের জন্য ডায়নামিক লিঙ্কার ম্যানুয়ালটি দেখুন ।

#!/bin/sh
export LD_LIBRARY_PATH=~/opt/openssl-1.0.1/lib
exec /path/to/a.out "$@"

বা, একযোগে সরাসরি কমান্ড লাইনে:

LD_LIBRARY_PATH=~/opt/openssl-1.0.1/lib ./a.out

বিকল্পভাবে, আপনি যদি বাইনারিটি সংশোধন করতে চান তবে chrpath চেষ্টা করুন , যা আপনাকে এক্সিকিউটেবলের মধ্যে বেকড গ্রন্থাগার অনুসন্ধানের পথ সম্পাদনা করতে দেয়।


2
+1 এর জন্য chrpath। ঠিক আমার যা প্রয়োজন ছিল।
রাঘব আরভি

সুন্দর গল্প, মাইক্রোসফ্ট 2 মিনিট এটি গুগল করতে ব্যয় করতে খুব বোকা এবং সবাইকে এসকিউএল সার্ভারকে ওপেনস -১.০ স্পষ্টভাবে লিঙ্ক করার পরিবর্তে বা ওপ্সএসএল.স. ব্লগস.এমএসএনএন.মাইক্রোসফট / সংস্করণ_সেসর_র
ইভান ক্যারল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.