ডিএলএল এবং এলআইবি ফাইল - কী এবং কেন?


214

আমি ডিএলএল এবং এলআইবির অন্যান্য সম্পর্কে খুব কমই জানি যে এগুলিতে প্রোগ্রাম সঠিকভাবে চালানোর জন্য প্রয়োজনীয় লাইব্রেরি রয়েছে - গ্রন্থাগারগুলি। তবে সংকলকরা এগুলি আদৌ কেন উত্পন্ন করে? কেবলমাত্র একক এক্সিকিউটেবলের মধ্যে সমস্ত কোড অন্তর্ভুক্ত করা কি সহজ হবে না? এবং ডিএলএল এবং এলআইবির মধ্যে পার্থক্য কী?


উত্তর:


298

স্ট্যাটিক লাইব্রেরি (এলআইবি) এবং ডায়নামিক লাইব্রেরি (ডিএলএল) রয়েছে - তবে নোট করুন যে .LB ফাইলগুলি স্ট্যাটিক লাইব্রেরি হতে পারে (বস্তুযুক্ত ফাইলগুলি) বা আমদানি গ্রন্থাগারগুলি (লিঙ্কারকে একটি ডিএলএলে লিঙ্ক করার অনুমতি দেওয়ার জন্য প্রতীকযুক্ত) থাকতে পারে।

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

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

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


80
দেখা যাচ্ছে যে .LIBফাইলগুলি স্ট্যাটিক লাইব্রেরি হতে পারে (বস্তুযুক্ত ফাইলগুলি) বা আমদানি পাঠাগারগুলি (লিঙ্কারকে একটি ডিএলএলে লিঙ্ক করার অনুমতি দেওয়ার জন্য প্রতীকযুক্ত) থাকতে পারে। আমি ভাবছি কেন এমন হয়।
লুমি

2
ভাল ব্যাখ্যা! কোড ভাগ করা হয় এবং ডেটা (ডিফল্ট প্রতি) ডিএল ব্যবহার করে এমন অ্যাপ্লিকেশনগুলির মধ্যে ভাগ হয় না।
মক্স

4
@ লুমি: ভালো কথা। ডিএলএলসের ক্ষেত্রে আমাদের দুটি সংযোগ রয়েছে। অন্তর্ভুক্ত লিঙ্কিং , যখন আমাদের .libডিএলএল স্রষ্টার সাথে যথাযথ শিরোলেখ সরবরাহ করা হয়; এই .libনিছক লক্ষ্য ডিএলএল একটি বর্ণনাকারী, এটা ঠিকানা, এন্ট্রি পয়েন্ট, ইত্যাদি কিন্তু কোন কোড ধারণ করে। এটি .libঅবশ্যই লিঙ্কারে পৌঁছে দিতে হবে। দ্বিতীয়টি হ'ল ফাংশন দিয়ে ম্যানুয়ালি লোড করে যখন আমরা ডিএলএল ব্যবহার করি তখন স্পষ্টত লিঙ্কLoadLibrary হয়। এই ধরণের আমাদের সেই .libফাইলটির দরকার নেই , তবে আমাদের অবশ্যই ডিএলএল রফতানি, তাদের ঠিকানাগুলি খুঁজে পেতে এবং পয়েন্টারগুলির মাধ্যমে এই ফাংশনগুলিতে কল করার জন্য কিছুটা প্রচেষ্টা করতে হবে।
itachi

37

আরেকটি দিক হ'ল সুরক্ষা (অবরুদ্ধতা)। একবার মূল অ্যাপ্লিকেশন থেকে কোনও অংশের কোড বের করা এবং একটি "বিচ্ছিন্ন" ডায়নামিক-লিংক লাইব্রেরিতে রাখার পরে, কোডটি পৃথক করা হয়েছে বলে কোড আক্রমণ করা, বিশ্লেষণ (বিপরীত প্রকৌশলী) করা সহজ easier যখন কোডটির একই অংশটি একটি এলআইবি লাইব্রেরিতে রাখা হয়, এটি সংকলিত (লিঙ্কযুক্ত) লক্ষ্য প্রয়োগের অংশ এবং এটি লক্ষ্য বাইনারিগুলির বাকী অংশ থেকে এই কোডটিকে পৃথক করা (পার্থক্য) করা আরও শক্ত।


সুরক্ষার দিকটি আমার কাছে নতুন ছিল। উপরোক্ত যুক্তিটি কী সি # অ্যাপ্লিকেশনটিকে কোনও স্থানীয় পরিচালিত সি ++ ডেল কল করার ক্ষেত্রে সত্য?
মার্টিন

1
তবে এলআইবিও বিচ্ছিন্ন, তাই না? সুতরাং কোনও আক্রমণকারী সহজেই এলআইবি বিশ্লেষণ করতে পারে। বা এলআইবি জনসাধারণের জন্য অ্যাক্সেসযোগ্য নয় এমন একটি সাধারণ দৃশ্য?
নিক রাশুলার

8
এলআইবিও "বিচ্ছিন্ন", যতদূর সংকলক প্রক্রিয়া সম্পর্কিত, তবে একবার সংযোগকারী অংশগুলি একসাথে রাখার পরে, এলআইবি এক্সের অংশ এবং এটি আপনার নিজের কোড থেকে পৃথক করা যায় না।
মক্স 11

17

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


7

একটি ডিএলএল হ'ল ফাংশনগুলির একটি গ্রন্থাগার যা অন্যান্য এক্সিকিউটেবল প্রোগ্রামগুলির মধ্যে ভাগ করা হয়। আপনার উইন্ডোজ / সিস্টেম 32 ডিরেক্টরিটি দেখুন এবং আপনি তাদের কয়েক ডজন দেখতে পাবেন। যখন আপনার প্রোগ্রামটি একটি ডিএলএল তৈরি করে তখন এটি সাধারণত একটি লিবিব ফাইলও তৈরি করে যাতে অ্যাপ্লিকেশন * .exe প্রোগ্রামটি ডিএলএলে ঘোষিত প্রতীকগুলি সমাধান করতে পারে।

একটি .lib হ'ল ফাংশনগুলির একটি গ্রন্থাগার যা কোনও প্রোগ্রামের সাথে স্থিরভাবে লিঙ্কযুক্ত - সেগুলি অন্যান্য প্রোগ্রাম দ্বারা ভাগ করা হয় না। প্রতিটি প্রোগ্রাম যা * .lib ফাইলের সাথে লিঙ্ক করে সে ফাইলে সমস্ত কোড রয়েছে। আপনার যদি দুটি প্রোগ্রাম A.exe এবং B.exe থাকে যা C.lib এর সাথে লিঙ্ক করে থাকে তবে প্রতিটি A এবং B উভয়ই C.lib এ কোডটি ধারণ করবে।

আপনি কীভাবে ডিএলএল এবং লিবস তৈরি করেন তা আপনার ব্যবহৃত সংকলকটির উপর নির্ভর করে। প্রতিটি সংকলক এটি আলাদাভাবে করে।


4

পারফরম্যান্সের মধ্যে আরও একটি পার্থক্য রয়েছে।

যেমন DLL .xe (গুলি) দ্বারা রানটাইম এ লোড হয়, .exe (গুলি) এবং ডিএলএল ভাগ করে নেওয়া মেমরি ধারণার সাথে কাজ করে এবং তাই পারফরম্যান্স তুলনামূলকভাবে স্থিতিশীল সংযোগের তুলনায় কম থাকে।

অন্যদিকে, একটি লিবিব এমন কোড যা অনুরোধ করে এমন প্রতিটি প্রক্রিয়াতে সংকলন সময়ে স্থিতিস্থলে সংযুক্ত থাকে। অতএব .exe (গুলি) এর একক মেমরি থাকবে, এইভাবে প্রক্রিয়াটির কার্যকারিতা বাড়বে।

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