আমি কি ইতিমধ্যে সংকলিত বাইনারিগুলিতে 'আরপথ' পরিবর্তন করতে পারি?


98

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

আমার এটির জন্য উত্স নেই এবং এটি পাওয়া শক্ত হবে। আমি ভাবছিলাম - আমি কোনও ELF সচেতন সম্পাদক ব্যবহার করে এই ফাইলটি সম্পাদনা করতে পারি এবং নতুন লিবসে আঘাত করার জন্য আরপ্যাথে একটি সাধারণ PATH যুক্ত করতে পারি? এটি কি সম্ভব, না আপনি একবার ইএলএফ বাইনারি তৈরি করার পরে আপনি জিনিসগুলিকে লোকেশনে স্থির করেন এবং সেগুলি স্থানান্তরিত করা যায় না?


4
এটিকে একটি শেলসক্রিপ্টে মুড়িয়ে দিন যা LD_LIBRARY_PATH সেট করে এবং বাইনারিটিকে কল করে। কলারদের PATH- তে শেল স্ক্রিপ্টটি এমন জায়গায় রাখুন।
ওয়াইল্ডপ্লাজার

LD_LIBRARY_PATH শিশু প্রক্রিয়া দ্বারা উত্তরাধিকারসূত্রে প্রাপ্ত। আপনি এটি চান না পারে।
উইল

4
@ হ্যাঁ এবং আমি ইতিমধ্যে বলেছি যে আমি এটি করতে চাই না। :)
সমৃদ্ধ হোমোলকা

উত্তর:


82

এমন একটি সরঞ্জাম বলা হয়েছে chrpathযা এটি করতে পারে - এটি সম্ভবত আপনার বিতরণের প্যাকেজগুলিতে উপলব্ধ।


9
ম্যাক ব্যবহারকারীদের জন্য কেবল একটি নোট, পতাকাটির install_name_toolসাথে এটি করতে পারেন-rpath
কেভিন টনন

10
আপনি যদি ত্রুটিটি পান <binary>: no rpath or runpath tag found.chrpathpatchelfpatchelf --set-rpath /path/to/libaries <binary>
:,

আমি সম্ভবত chrpath পছন্দ করি যেহেতু এটি আরও সর্বজনীন, প্যাচেল্ফের কিছু দীর্ঘ স্থায়ী বাগ রয়েছে যা আপনার লাইব্রেরি / এক্সিকিউটেবলের আকারকে নাটকীয়ভাবে স্ফীত করে।
তারানকি

@ তাতরানকি: প্যাচেল্ফের কোন সংস্করণের কথা বলছেন?
হাজেলো

4
chrpath একটি মারাত্মক সীমাবদ্ধতা পেয়েছে: এটি কেবল একটি সমতুল্য বা স্বল্প দৈর্ঘ্যের (RPp সংস্করণ 0.16 ম্যান পেজ) এর সাথে একটি RPATH প্রতিস্থাপন করতে পারে
হিগেলো

169

chrpathবলা চেয়ে আরও একটি সার্বজনীন সরঞ্জাম আছে patchelf। এটি মূলত নিক্স এবং নিক্সস (প্যাকেজিং সিস্টেম এবং একটি জিএনইউ / লিনাক্স বিতরণ) এর জন্য প্যাকেজ তৈরিতে ব্যবহারের জন্য তৈরি হয়েছিল।

যদি বাইনারিটিতে কোনও আরপথ না থাকে (এখানে আরডিএস্প্প বলা হয়), chrpathব্যর্থ হয়:

chrpath -r '$ORIGIN/../lib64' rdsamp 
rdsamp: no rpath or runpath tag found.

অন্য দিকে,

patchelf --set-rpath '$ORIGIN/../lib64' rdsamp

ঠিক ঠিক আছে সফল।


10
বিশেষত, patchelfএকটি বাইনারিতে একটি আরপ্যাথ যুক্ত করতে সক্ষম হয় যা কোনও আরপ্যাথ ধারণ করে না, তবে - যেখানে chrpathকেবল উপস্থিত উপস্থিতিটি পরিবর্তন করতে সক্ষম বলে মনে হয়।
ম্যাক্সচলেপজিগ

5
একটি সাধারণ নোট, এটা এর মূল্য মধ্যে সূক্ষ্ম পার্থক্য বুঝতে rpathএবং runpath। মূলত, একটি ওভাররাইড করতে পারে LD_LIBRARY_PATHএবং অন্যটি পারে না। বিশদর
স্টুয়ার্ট বার্গ

6
বিরক্তিকর বিষয় হ'ল উভয় chrpathএবং patchelfতাদের পরিভাষাটি ম্লান। উদাহরণস্বরূপ, patchelfউপরে প্রদর্শিত কমান্ডটি পরিবর্তিত হবে তবে আপনি অপশনটি সরবরাহ runpathনা করা rpathপর্যন্ত নয় --force-rpath
স্টুয়ার্ট বার্গ

10
@ সুপর্ব্যাটফিশ হ্যাঁ, তবে পার্থক্যটি সাধারণত কিছু যায় আসে না। এর পরিবর্তণের থেকে এই এন্ট্রি patchelfএটা ব্যাখ্যা করেন: " --set-rpath, --shrink-rpathএবং --print-rpathএখন পছন্দ করা DT_RUNPATHউপর DT_RPATH, যা অচল হওয়ার যখন আপডেট, যদি উভয় উপস্থিত উভয় আপডেট করা হয় যদি শুধুমাত্র DT_RPATH উপস্থিত থাকলে, এটি রূপান্তরিত হয়।। DT_RUNPATHযদি না --force-rpathনির্দিষ্ট করা থাকে তন্ন তন্ন উপস্থিত। , নির্দিষ্ট DT_RUNPATHনা --force-rpathকরা হলে একটি যুক্ত করা DT_RPATHহয়, এক্ষেত্রে একটি যুক্ত করা হয়। " উপযুক্ততার কারণে বিকল্পটির নামটি সম্ভবত অপরিবর্তিত রাখা হয়েছিল।
ব্যবহারকারী 7610

4
এখন পর্যন্ত সেরা উত্তর, এটি পরিবর্তিত গ্রহণযোগ্য উত্তর হওয়া উচিত!
কেনেথ হোস্টে

19

ঠিক যেমন @ ইউজার 7610 বলেছেন, যাওয়ার সঠিক উপায়টি হল patchelfসরঞ্জাম।

তবে, আমি অনুভব করি যে আমি আরও একটি বিস্তৃত উত্তর দিতে পারি, সমস্ত কমান্ডকে সঠিকভাবে করা উচিত covering

বিষয় সম্পর্কে একটি বিস্তৃত নিবন্ধের জন্য, এখানে ক্লিক করুন

প্রথমত, অনেক বিকাশকারী সম্পর্কে কথা বলেন RPATHতবে তারা আসলে বোঝায় RUNPATH। এটি দুটি পৃথক alচ্ছিক গতিশীল বিভাগ এবং লোডার এগুলি খুব আলাদাভাবে পরিচালনা করে। আমি আগে উল্লিখিত লিঙ্কটিতে তাদের মধ্যে পার্থক্য সম্পর্কে আরও পড়তে পারেন।

আপাতত, শুধু মনে রাখবেন:

  • যদি RUNPATHসেট করা থাকে তবে RPATHতা উপেক্ষা করা হবে
  • RPATH অবচয় করা হয় এবং এড়ানো উচিত
  • RUNPATH এটি অগ্রাহ্য করা হয় কারণ এটি দ্বারা ওভাররাইড করা যায় LD_LIBRARY_PATH

বর্তমান আর [ইউএন] পাঠ দেখুন

readelf -d <path-to-elf> | egrep "RPATH|RUNPATH"

আর [ইউএন] পথ পরিষ্কার করুন

patchelf --remove-rpath <path-to-elf>

মন্তব্য:

  • উভয় সরান RPATHএবংRUNPATH

আর [ইউএন] পাঠে মান যুক্ত করুন

patchelf [--force-rpath] --set-rpath "<desired-rpath>" <path-to-elf>

মন্তব্য:

  • <desired-path> একটি কমা দ্বারা পৃথক ডিরেক্টরি তালিকা, যেমন: /my/libs:/my/other/libs
  • যদি আপনি নির্দিষ্ট করেন --force-rpath, সেট করেন RPATH, অন্যথায় সেট করেRUNPATH

4
-Wl,-R,<desired-rpath> -Wl,--enable-new-dtagsসেটগুলি DT_RUNPATHএবং এটিই সর্বাধিক লোকেরা ব্যবহার করা উচিত। RUNPATHএর দ্বারা ওভাররাইড করা যেতে পারে LD_LIBRARY_PATH, তাই লোকেরা ব্যবহার করা উচিত নয় --force-rpath
jww

@jww আমি দেখতে পাচ্ছি যে আমি আরপাথের অবমূল্যায়ন সম্পর্কে কোনও মন্তব্য যোগ করিনি, তাই আমি এখনই একটি যুক্ত করেছি। ধন্যবাদ!
ড্যানিয়েল ট্রুগম্যান

নোট করুন যে উদাহরণটি <desired-path>একটি কোলন ব্যবহার করে; এটি কমা হওয়া উচিত (যা /my/libs,/my/other/libs:)।
অ্যালান ডি স্মেট

@ অ্যালানডিসমেট, আমি কমা সম্পর্কে জানি না, তবে কোলন আমার পক্ষে কাজ করে।
ড্যানিয়েল ট্রুগম্যান

RPATH অবহেলিত হতে পারে, তবে রুনপথ ব্যবহার করা "অপ্রত্যাশিত" কোণার ক্ষেত্রে ডেকে আনতে পারে। উদাহরণস্বরূপ, qt.io/blog/2011/10/28/rpath-and-runpath দেখুন
রব

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