রণলিব কী?


13

আমি কিছুক্ষণের জন্য একটি ম্যাকোএসএক্স সিস্টেম ব্যবহার করে আসছি, তবে সম্প্রতি মাত্র সাহসী হওয়া শুরু করেছে। আমি একটি নির্দেশিকা পেয়েছি যা আমাকে 'সুডো রণলিব / অ্যাসার / লোকাল / লিবি / লিবিজেপেইগা.এ''তে ইনস্টল করে লাইবজেপে) চালাতে বলছে। আমি রনলিব ম্যানুয়ালটি পড়েছি এবং এটিতে অনলাইনে দেখার চেষ্টা করেছি। আমি কেবল বুঝতে পারি না। আরও জানার জন্য আমার কোন সংস্থানগুলির সন্ধান করা দরকার, বা কেউ এর ব্যবহার সম্পর্কে সংক্ষিপ্ত ব্যাখ্যা দিতে পারে? আগাম ধন্যবাদ!

উত্তর:


7

ranlibএকটি স্ট্যাটিক লাইব্রেরিতে অবজেক্ট ফাইল যুক্ত বা আপডেট করে । Linkers যখন স্ট্যাটিক লাইব্রেরি ব্যবহার করতে পারেন লিঙ্ক প্রদান করার জন্য প্রতীক , যাতে কোড চাহিদা কাজ চালানোর জন্য (যেমন বিরোধিতা লোডার তাদের খুঁজছেন গতিশীল লাইব্রেরি যখন এক্সিকিউটেবল চলমান)।


হাই Ignacio, প্রতিক্রিয়া জন্য ধন্যবাদ। এর অর্থ কি এই যে আমি যদি কোনও লাইব্রেরিতে রনলিব চালিত করি তবে লিঙ্কার এটি 'রেফারেন্স' দেওয়ার চেষ্টা করার সময় এটি ব্যবহারের জন্য উপলব্ধ হবে? এটি কীভাবে সরানো হয়?
ইং

ranlibগ্রন্থাগারগুলি তৈরি এবং সংশোধন করতে ব্যবহৃত হয়। এগুলি ব্যবহার করা লিংকের উপর নির্ভর করে, সাধারণত কমান্ড লাইনে লাইব্রেরির অবস্থান এবং / অথবা নামটি পাস করে। বিশদটির জন্য gcc- তে যুক্তি -Lএবং -lযুক্তি দেখুন ।
ইগনাসিও ওয়াজকেজ-আব্রামগুলি

5
কিন্তু arতাও করে না ? পার্থক্য কি?
গ্রেটওয়ल्फ

18

এই বিবরণটি বেশ পরিষ্কার দেখাচ্ছে: http://sourceware.org/binutils/docs/binutils/ranlib.html

সুতরাং আপনি যদি অবজেক্ট ফাইলগুলির একটি সংরক্ষণাগার সংরক্ষণ করেন তবে বলুন:

$ ar r fruits.a apple.o orange.o pineapple.o

তারপরে চলছে

$ ranlib fruits.a

ফল.আর বিষয়বস্তুর একটি সূচক তৈরি করে এবং ফলমূলগুলিতে সূচকটি সংরক্ষণ করে। এটি সংযোগের জন্য দরকারী এবং যদি বস্তুগুলি একে অপরকে কল করে।


"রানলিব একটি সংরক্ষণাগারগুলির সামগ্রীতে একটি সূচক তৈরি করে এবং সংরক্ষণাগারে সংরক্ষণ করে"। এটির মতো কিছু মিলিয়ে যাওয়ার মতো শোনাচ্ছে tarএবং আমি বলব খুব পরিষ্কার নয়।
কোডবলিং

9

রেনলিব একটি সংরক্ষণাগারগুলির সামগ্রীতে একটি সূচক তৈরি করে এবং সংরক্ষণাগারে সংরক্ষণ করে। সূচকটি একটি সংরক্ষণাগারটির সদস্য দ্বারা নির্ধারিত প্রতিটি প্রতীককে তালিকাবদ্ধ করে যা একটি স্থানান্তরযোগ্য অবজেক্ট ফাইল। এই জাতীয় সূচকের সাথে একটি সংরক্ষণাগারটি গ্রন্থাগারের সাথে সংযোগ বাড়িয়ে তোলে এবং সংরক্ষণাগারে তাদের অবস্থান নির্বিশেষে গ্রন্থাগারের রুটিনগুলিকে একে অপরকে কল করার অনুমতি দেয়।

উত্স: রানলিব ম্যান পৃষ্ঠা


2

আরবী ভাষায়

লিনাক্স-এ, arজিএনইউ সাধারণ উদ্দেশ্য ধনুবিদ। ( arঅন্যান্য ইউনিক্সের মতো ওএসে নন-জিএনইউ ভেরিয়েন্ট রয়েছে )। বিকল্প সহc

ar c... archive-name file...

এটির একটি অনুলিপি তৈরি করে যার কপি রয়েছে file...archive-nameসাধারনত কিন্তু অবশ্যম্ভাবীরূপে এক্সটেনশন .a(জন্য সংরক্ষণাগার )। প্রত্যেকটি file...যে কোনও ধরণের ফাইল হতে পারে, অগত্যা কোনও অবজেক্ট ফাইল নয়।

সংরক্ষণাগারভুক্ত ফাইলগুলি যখন সমস্ত অবজেক্ট ফাইল হয় সাধারণত প্রোগ্রাম বা ডিএসও (ডায়নামিক শেয়ার্ড অবজেক্টস) এর লিঙ্কে অবজেক্ট ফাইলের সেই নির্বাচন প্রদান করার জন্য সংরক্ষণাগারটি ব্যবহার করার উদ্দেশ্য হয়। এই ক্ষেত্রে archive-nameএছাড়াও সাধারনত উপসর্গ দেওয়া হবে lib, যেমন libfoo.a, যাতে এটি linker বিকল্পের মাধ্যমে একটি প্রার্থী linker ইনপুট ফাইল হিসাবে আবিষ্কার করা যেতে পারে -lfoo

লিঙ্কার ইনপুট ফাইল হিসাবে ব্যবহৃত হয়, libfoo.aসাধারণত একটি স্ট্যাটিক লাইব্রেরি বলা হয় । এই ব্যবহার অযোগ্য প্রোগ্রামারদের কাছে বিভ্রান্তির চিরস্থায়ী উত্স, কারণ এটি তাদের মনে করে যে আর্কাইভটি libfoo.aডিএসওর মতো একই ধরণের জিনিস libfoo.so, সাধারণত ডাইনামিক / শেয়ার্ড লাইব্রেরি নামে পরিচিত , এবং এই ভিত্তিতে মিথ্যা প্রত্যাশা তৈরি করতে। আসলে একটি "স্ট্যাটিক লাইব্রেরি" এবং "ডায়নামিক লাইব্রেরি" একেবারে অনুরূপ জিনিস নয় এবং একেবারে বিভিন্ন উপায়ে লিঙ্কেজে ব্যবহৃত হয়।

একটি সুস্পষ্ট পার্থক্য হ'ল স্ট্যাটিক লাইব্রেরি লিঙ্কার দ্বারা উত্পাদিত হয় না , তবে দ্বারা ar। সুতরাং কোনও সংযোগ ঘটে না, কোনও প্রতীক রেজোলিউশন হয় না। সংরক্ষণাগারযুক্ত অবজেক্ট ফাইলগুলি অপরিবর্তিত রয়েছে: সেগুলি কেবল একটি ব্যাগে রাখা হয়েছে।

যখন একটি সংরক্ষণাগার এমন কিছু বিষয় যা এর দুটো ঘটনার ইনপুট হয় হয় এমন একটা প্রোগ্রাম বা DSO যেমন - - linker দ্বারা উত্পাদিত ব্যাগে linker সৌন্দর্য যদি তাতে কোন বস্তুর ফাইল অমীমাংসিত প্রতীক রেফারেন্স যে জমা হয়েছে সংজ্ঞা প্রদান দেখতে লিঙ্কেজ আগে। যদি এটি কোনও সন্ধান করে তবে এটি ব্যাগ থেকে object অবজেক্ট ফাইলগুলি বের করে এবং আউটপুট ফাইলে তাদের লিঙ্ক করে , ঠিক যেমনটি লিঙ্কার কমান্ডলাইনে এবং আর্কাইভের কোনও উল্লেখ নেই। সুতরাং লিংকেজে আর্কাইভের পুরো ভূমিকা হ'ল অবজেক্ট ফাইলগুলির ব্যাগ হিসাবে যা থেকে লিঙ্কারটি লিঙ্কেজটি বহন করার জন্য প্রয়োজনীয় এটি নির্বাচন করতে পারে।

ডিফল্টরূপে, জিএনইউ arতার আউটপুট সংরক্ষণাগারটিকে লিঙ্কার ইনপুট হিসাবে ব্যবহারের জন্য প্রস্তুত করে তোলে। এটি একটি যাদু ফোনি ফাইল নাম সহ সংরক্ষণাগারটিতে একটি ফনি "ফাইল" যুক্ত করে এবং এই ফোনি ফাইলে এটি লিখিতরূপে এমন লিখিত সামগ্রী লিখিত হয় যে আর্কাইভের কোনও অবজেক্ট ফাইল দ্বারা সংজ্ঞায়িত গ্লোবাল প্রতীকগুলি থেকে লকিং টেবিল হিসাবে পড়তে সক্ষম হয় সংরক্ষণাগারে object অবজেক্ট ফাইলগুলির নাম এবং অবস্থান। এই সন্ধানের টেবিলটি হ'ল লিঙ্কারটিকে সংরক্ষণাগারটি সন্ধান করতে এবং হস্তান্তরিত কোন সমাধান না হওয়া প্রতীক উল্লেখগুলি সংজ্ঞায়িত করে এমন কোনও বস্তুর ফাইল সনাক্ত করতে সক্ষম করে।

আপনি q(= দ্রুত ) বিকল্পটি - যা বাস্তবে আপনি নিজের arউদাহরণে ব্যবহার করেছেন - এবং এছাড়াও (মূলধন) S(= কোনও প্রতীক টেবিল ) বিকল্পের সাহায্যে এই অনুসন্ধান সারণীর তৈরি বা আপডেটকে দমন করতে পারেন । এবং যদি আপনি arকোনও সংরক্ষণাগার তৈরি বা আপডেট করার জন্য অনুরোধ করেন যা কোনও কারণে (একটি uptodate) প্রতীক টেবিলটি পায় নি, তবে আপনি sবিকল্পটি দিয়ে এটি দিতে পারেন ।

ranlib

ranlibমোটেও লাইব্রেরি তৈরি করে না। লিনাক্স-এ, ranlibএকটি লিগ্যাসি প্রোগ্রাম যা কোনও arসংরক্ষণাগারে একটি (আপডোটেট) প্রতীক টেবিল যুক্ত করে যদি এটি না থাকে। এটা তোলে এর প্রভাব হিসাবে একই ঠিক ar sগনুহ সঙ্গে, ar। Icallyতিহাসিকভাবে , এর আগে arনিজেই একটি প্রতীক টেবিল তৈরির জন্য সজ্জিত ranlibছিল, সেই কলডেজটি ছিল যা লিঙ্কারটিকে তার থেকে অবজেক্ট ফাইলগুলি বাছাই করতে সক্ষম করার জন্য একটি সংরক্ষণাগারটিতে জাদু ফোনি ফাইলটি ইনজেক্ট করেছিল। নন-জিএনইউ ইউনিক্স-এর মতো ওএসে, ranlibএখনও এই উদ্দেশ্যে প্রয়োজন হতে পারে। আপনার উদাহরণ:

ar qc libgraphics.a *.o
ranlib libgraphics.a

বলেছেন:

  • বর্তমান ডিরেক্টরিতে libgraphics.aসমস্ত *.oফাইল সংরক্ষণাগারে সংযুক্ত করে তৈরি করুন , কোনও চিহ্ন সারণী ছাড়াই।
  • তারপরে একটি প্রতীক টেবিল যুক্ত করুন libgraphics.a

লিনাক্সে, এর একই নেট প্রভাব রয়েছে:

ar cr libgraphics.a *.o

নিজেই, ar qc libgraphics.a *.oএকটি সংরক্ষণাগার তৈরি করে যা লিঙ্কারটি ব্যবহার করতে পারে না, কারণ এর কোনও চিহ্ন টেবিল নেই।

lD

আপনার উদাহরণ:

ld -r -o libgraphics.a *.o

আসলে বেশ নিরপেক্ষ। হয়তো এই ব্যাপারে বিরল ব্যবহার প্রকাশ linker , ld, একটি উত্পাদন করতে মার্জ একটি একক আউটপুট বস্তুর ফাইল, যা প্রতীক রেজল্যুশন সম্পন্ন করা হয়েছে বা একাধিক ইনপুট ফাইল লিঙ্ক করে বস্তুর ফাইল যতদূর সম্ভব হিসাবে , ইনপুট ফাইল দেওয়া। -r(= Relocatable ) বিকল্প linker linkaqe ব্যর্থ যদি অনির্ধারিত প্রতীক রেফারেন্স আউটপুট ফাইল থাকা যতটা সম্ভব এবং ইনপুট লিঙ্ক করে একটি বস্তু ফাইল টার্গেট (বদলে একটি প্রোগ্রাম, অথবা DSO) উত্পাদন করতে নির্দেশ দেয়। এই ব্যবহারকে আংশিক সংযোগ বলা হয় ।

আউটপুট ফাইল ld -r ... একটি বস্তু ফাইল, কোনো হয় ar সংরক্ষণাগার , এবং একটি আউটপুট ফাইলের নাম যে নির্দিষ্ট রূপ একটি মত arসংরক্ষণাগার এটা এক দেখা যায় না। সুতরাং আপনার উদাহরণ একটি প্রতারণার চিত্রিত করে। এই:

ld -r -o graphics.o *.o

সত্যবাদী হবে। এ জাতীয় প্রতারণার উদ্দেশ্য কী হতে পারে তা আমার কাছে অস্পষ্ট, কারণ কোনও ইএলএফ অবজেক্ট ফাইল বলা হলেও libgraphics.a, এবং এই নামটি দ্বারা বা কোনও সংযোগের ইনপুট -lgraphicsহলেও লিঙ্কারটি এটি সঠিকভাবে ELF অবজেক্ট ফাইল হিসাবে সনাক্ত করবে , একটি না arসংরক্ষণাগার, এবং এটি গ্রাস করবে তা কমান্ড যে কোন বস্তুর ফাইল হ্রাস: এটা, নিঃশর্তভাবে এটা সংযোগ আউটপুট ফাইলে যেহেতু একটি জেনুইন সংরক্ষণাগার ইনপুট করার বিন্দু লিংক আর্কাইভ সদস্যদের হয় শুধুমাত্র এই শর্তে যে তারা রেফারেন্সড হয় । সম্ভবত আপনার এখানে অসতর্কিত লিঙ্ক দেওয়ার উদাহরণ রয়েছে।

মোড়ক উম্মচন...

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

এবং আমরা কীভাবে প্রথাগতভাবে একটি লাইব্রেরি নামে ডাকে ডায়নামিক শেয়ার্ড অবজেক্ট / শেয়ার্ড লাইব্রেরি / ডায়নামিক লাইব্রেরি নামে অন্যান্য এবং সবচেয়ে গুরুত্বপূর্ণ ধরণের জিনিস তৈরি করতে পারি তা কিছুই দেখিনি ।

একটি প্রোগ্রামের মতো, ডিএসও লিঙ্কার দ্বারা উত্পাদিত হয় । একটি প্রোগ্রাম এবং একটি ডিএসও হ'ল ইএলএফ বাইনারিগুলির রূপগুলি যা ওএস লোডার বোঝে এবং চলমান প্রক্রিয়াটি একত্রিত করতে ব্যবহার করতে পারে। সাধারণত আমরা এক জিসিসি frontends এক (মাধ্যমে linker ডাকা gcc, g++, gfortran, ইত্যাদি):

একটি প্রোগ্রাম লিঙ্ক:

gcc -o prog file.o ... -Ldir ... -lfoo ...

একটি ডিএসও সংযোগ:

gcc -shared -o libbar.so file.o ... -Ldir ... -lfoo ...

-lfooআপনি যখন অন্য কোনও প্রোগ্রাম বা ডিএসও সংযোগ করছেন তখন ভাগ করা লাইব্রেরি এবং স্থির গ্রন্থাগারগুলি ইউনিফর্ম প্রোটোকল দ্বারা লিঙ্কারের কাছে দেওয়া যেতে পারে । এই বিকল্পটি লিঙ্কারকে তার নির্দিষ্ট বা ডিফল্ট অনুসন্ধান ডিরেক্টরিগুলি হয় libfoo.soবা এটির জন্য স্ক্যান করতে নির্দেশ দেয় libfoo.a। ডিফল্টরূপে, একবার তাদের কোনওটির সন্ধান পেলে তা ফাইলটিকে লিঙ্কেজে ইনপুট দেবে এবং যদি এটি একই অনুসন্ধান ডিরেক্টরিতে উভয়কে খুঁজে পায় তবে এটি পছন্দ করবে libfoo.so। যদি libfoo.so, নির্বাচিত হয় তবে লিঙ্কার যুক্ত করে যে আপনি যে কোনও প্রোগ্রাম বা ডিএসও তৈরি করছেন তার রানটাইম নির্ভরতা তালিকায় ডিএসও যুক্ত করে। যদি libfoo.aনির্বাচিত হয় তবে লিঙ্কার আর্কাইভটি আউটপুট ফাইলের সংযোগের জন্য অবজেক্ট ফাইলের নির্বাচন হিসাবে ব্যবহার করে, প্রয়োজনে, ঠিক তখনই ব্যবহার করে। কোনও রানটাইম নির্ভরতা নেই libfoo.aনিজেই সম্ভব; এটি কোনও প্রক্রিয়াতে ম্যাপ করা যায় না; এটি ওএস লোডারকে কিছুই বোঝায় না।

Https://stackoverflow.com/a/47924864/195787 থেকে অনুলিপি করা হয়েছে ।

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