উত্তর:
এক্সিকিউটেবল কোডে (আপনি কী চালাচ্ছেন) উত্স কোড থেকে (আপনি কী লিখবেন) পাওয়ার দুটি ধাপ রয়েছে (বেশিরভাগ ক্ষেত্রে, ব্যাখ্যাযুক্ত কোড ছাড়) stages
প্রথমটি সংকলন যা উত্স কোডটি অবজেক্ট মডিউলগুলিতে রূপান্তরিত করে।
দ্বিতীয়টি, লিঙ্কিং, যা হ'ল বস্তু মডিউলগুলি একত্রিত করে একটি এক্সিকিউটেবল গঠন করে।
অন্যান্য বিষয়গুলির মধ্যে, তৃতীয় পক্ষের গ্রন্থাগারগুলি তাদের উত্স কোড (যেমন ডাটাবেস অ্যাক্সেসের জন্য লাইব্রেরি, নেটওয়ার্ক যোগাযোগ এবং গ্রাফিকাল ব্যবহারকারী ইন্টারফেস) না দেখে বা বিভিন্ন ভাষায় সংকলনের কোডের জন্য (যেমন আপনার ডাটাবেসের ক্ষেত্রে আপনার এক্সিকিউটেবলের মধ্যে অন্তর্ভুক্ত করার অনুমতি দেয়) জন্য আলাদা করা হয় ( উদাহরণস্বরূপ সি এবং অ্যাসেম্বলি কোড) এবং তারপরে তাদের সমস্তকে সংযুক্ত করে।
আপনি যখন কোনও ফাইলকে কার্যকরভাবে কার্যকর করার সাথে সংযুক্ত করেন, তখন সেই ফাইলটির বিষয়বস্তু লিংক সময় অন্তর্ভুক্ত থাকে। অন্য কথায়, ফাইলের বিষয়বস্তুগুলি শারীরিকভাবে এক্সিকিউটেবলের মধ্যে areোকানো হয় যা আপনি চালাবেন।
আপনি যখন গতিশীলভাবে লিঙ্ক করেন , তখন ফাইলটির সাথে একটি পয়েন্টার যুক্ত করা হয় (ফাইলটির ফাইলের নাম, উদাহরণস্বরূপ) এক্সিকিউটেবলের অন্তর্ভুক্ত থাকে এবং লিখিত সময়ে উল্লিখিত ফাইলের বিষয়বস্তু অন্তর্ভুক্ত থাকে না। কেবলমাত্র যখন আপনি পরবর্তীতে এক্সিকিউটেবল চালিত করেন যে এই গতিযুক্তভাবে সংযুক্ত ফাইলগুলি কিনেছিল এবং সেগুলি কেবলমাত্র এক্সিকিউটেবলের মেমরি অনুলিপিতে কিনেছিলেন, ডিস্কে থাকা নয় not
এটি মূলত স্থগিত লিঙ্কের একটি পদ্ধতি। সেখানে একটি এমনকি এর আরো বিলম্বিত পদ্ধতি (প্রয়াত কিছু সিস্টেমে বাঁধাই বলা হয়) যে পরিবর্তনশীল লিঙ্ক ফাইলে আনতে না থাকবে যতক্ষন না আপনি আসলে মধ্যে একটি ফাংশন কল করার চেষ্টা করুন।
স্ট্যাটিক্যালি লিঙ্কযুক্ত ফাইলগুলি লিংক সময়ে এক্সিকিউটেবলের কাছে 'লক' থাকে যাতে এগুলি কখনই পরিবর্তন হয় না। একটি এক্সিকিউটেবল দ্বারা রেফারেন্সযুক্ত গতিযুক্ত লিঙ্কযুক্ত ফাইলটি কেবল ডিস্কে ফাইলটি প্রতিস্থাপনের মাধ্যমে পরিবর্তন করতে পারে।
কোডটি পুনরায় লিঙ্ক না করেই কার্যকারিতাটিতে আপডেটের অনুমতি দেয়; যখনই আপনি চালনা করেন লোডার পুনরায় লিঙ্ক করে।
এটি উভয়ই ভাল এবং খারাপ - একদিকে এটি সহজ আপডেট এবং বাগ সংশোধন করার অনুমতি দেয়, অন্যদিকে এটি আপডেটগুলি বেমানান হলে প্রোগ্রামগুলি কাজ বন্ধ করে দিতে পারে - এটি কখনও কখনও ভয়ঙ্কর "ডিএলএল হেল্ক" এর জন্য দায়ী যে কিছু লোক উল্লেখ করুন যে অ্যাপ্লিকেশনগুলিকে ভেঙে দেওয়া যেতে পারে যদি আপনি গতিযুক্ত লিঙ্কযুক্ত লাইব্রেরিটি উপযুক্ত নয় যেটির সাথে প্রতিস্থাপন করেন (যা বিকাশকারীরা এটি করে তাদের শিকার এবং কঠোর শাস্তির প্রত্যাশা করা উচিত, যাইহোক)।
উদাহরণ হিসাবে , চলুন কোনও ব্যবহারকারীর main.c
স্থিতিশীল এবং গতিশীল সংযোগের জন্য তাদের ফাইল সংকলন করার ক্ষেত্রে দেখুন ।
Phase Static Dynamic
-------- ---------------------- ------------------------
+---------+ +---------+
| main.c | | main.c |
+---------+ +---------+
Compile........|.........................|...................
+---------+ +---------+ +---------+ +--------+
| main.o | | crtlib | | main.o | | crtimp |
+---------+ +---------+ +---------+ +--------+
Link...........|..........|..............|...........|.......
| | +-----------+
| | |
+---------+ | +---------+ +--------+
| main |-----+ | main | | crtdll |
+---------+ +---------+ +--------+
Load/Run.......|.........................|..........|........
+---------+ +---------+ |
| main in | | main in |-----+
| memory | | memory |
+---------+ +---------+
আপনি স্থির ক্ষেত্রে দেখতে পারেন যে মূল প্রোগ্রাম এবং সি রানটাইম লাইব্রেরি লিংক সময়ে (বিকাশকারীদের দ্বারা) একসাথে সংযুক্ত রয়েছে। যেহেতু ব্যবহারকারী সাধারণত কার্যকরভাবে এক্সিকিউটেবলকে আবার লিঙ্ক করতে পারে না, তারা গ্রন্থাগারের আচরণের সাথে আটকে রয়েছে।
গতিশীল ক্ষেত্রে, মূল প্রোগ্রামটি সি রানটাইম আমদানি লাইব্রেরির সাথে সংযুক্ত থাকে (যেটি ডায়নামিক লাইব্রেরিতে রয়েছে তা ঘোষণা করে তবে বাস্তবে এটি সংজ্ঞা দেয় না )। এটি লিঙ্কারটিকে লিঙ্ক করতে দেয় যদিও আসল কোডটি অনুপস্থিত।
তারপরে, রানটাইমে, অপারেটিং সিস্টেম লোডার সি রানটাইম ডিএলএল (ডায়নামিক লিংক লাইব্রেরি বা ভাগ করা লাইব্রেরি বা অন্যান্য নামকরণ) এর সাথে মূল প্রোগ্রামটির সাথে দেরিতে সংযোগ স্থাপন করে।
সি রানটাইমের মালিক আপডেট বা বাগ ফিক্সগুলি সরবরাহ করতে যে কোনও সময় একটি নতুন ডিএলএল ছেড়ে যেতে পারেন। যেমন আগেই বলা হয়েছে, এর উভয় সুবিধা এবং অসুবিধা রয়েছে।
.dll
বা .so
এক্সটেনশন থাকতে পারে ) - উত্তরটি একটি সঠিক বিবরণ না হয়ে ধারণাগুলির ব্যাখ্যা হিসাবে ব্যাখ্যা করুন । এবং, পাঠ্য অনুসারে, এটি কেবলমাত্র সি রানটাইম ফাইলগুলির জন্য স্থিতিশীল এবং গতিশীল সংযোগ দেখানোর একটি উদাহরণ যা হ্যাঁ, এগুলিই all সকলের মধ্যে ক্র্ট ইঙ্গিত করে।
আমি মনে করি এই প্রশ্নের একটি ভাল উত্তর ব্যাখ্যা করতে হবে তা লিঙ্ক কর্তব্য হল ।
আপনি যখন কিছু সি কোড সংকলন করেন (উদাহরণস্বরূপ), এটি মেশিন ভাষায় অনুবাদ করা হবে। বাইটগুলির কেবল একটি ক্রম যা প্রসেসর যুক্ত করে, বিয়োগ করে, তুলনা করে, "গোটো" করে, মেমরিটি পড়ে, স্মৃতি লিখবে, সেই ধরণের জিনিস causes এই স্টাফ বস্তু (.o) ফাইলে সংরক্ষণ করা হয়।
এখন, অনেক দিন আগে কম্পিউটার বিজ্ঞানীরা এই "সাবরুটাইন" জিনিসটি আবিষ্কার করেছিলেন। সম্পাদন-এই-খণ্ড অফ কোড-এবং-রিটার্ন-এখানে। তারা বুঝতে পেরে খুব বেশিদিন হয়নি যে সর্বাধিক দরকারী সাবরুটাইনগুলি একটি বিশেষ জায়গায় সংরক্ষণ করা যেতে পারে এবং যে কোনও প্রোগ্রাম যা তাদের প্রয়োজন তা ব্যবহার করে।
এখন প্রথম দিনগুলিতে প্রোগ্রামারদের এই সাবরুটাইনগুলি যে মেমরি ঠিকানার ছিল তা মুছতে হবে। কিছু একটা CALL 0x5A62
। Memory মেমরির ঠিকানাগুলি কখনও পরিবর্তন করার প্রয়োজন ছিল এটি ক্লান্তিকর এবং সমস্যাযুক্ত।
সুতরাং, প্রক্রিয়াটি স্বয়ংক্রিয় হয়েছিল। আপনি এমন একটি প্রোগ্রাম লিখেছেন যা কল করে printf()
এবং সংকলকটির মেমরি ঠিকানাটি জানে না printf
। তাই কম্পাইলার শুধু লিখেছেন CALL 0x0000
, এবং বস্তুর ফাইল বলছে একটি নোট যোগ করা "স্মৃতি অবস্থানের সঙ্গে এই 0x0000 প্রতিস্থাপন করতে হবে printf, "।
স্ট্যাটিক লিঙ্কেজের অর্থ হ'ল লিঙ্কার প্রোগ্রামটি (জিএনইউ একটিকে এলডি বলা হয় ) printf
সরাসরি আপনার এক্সিকিউটেবল ফাইলটিতে মেশিন কোড যুক্ত করে এবং 0x0000 এর ঠিকানায় পরিবর্তন করে printf
। আপনার এক্সিকিউটেবলটি তৈরি হওয়ার পরে এটি ঘটে।
গতিশীল সংযোগের অর্থ হল যে উপরের পদক্ষেপটি ঘটে না। এক্সিকিউটেবল ফাইলটিতে এখনও একটি নোট রয়েছে যা বলে যে "অবশ্যই প্রিন্টফের মেমরির অবস্থানের সাথে 0x000 প্রতিস্থাপন করতে হবে"। অপারেটিং সিস্টেমের লোডারটিকে প্রিন্টফ কোডটি সন্ধান করতে হবে, মেমরিতে লোড করতে হবে এবং প্রতিটি সময় প্রোগ্রামটি চালানোর সময় CALL ঠিকানাটি সংশোধন করতে হবে ।
প্রোগ্রামগুলির জন্য এমন কিছু ফাংশন কল করা সাধারণ যেগুলি স্ট্যাটিকালি লিঙ্কযুক্ত (স্ট্যান্ডার্ড লাইব্রেরি ফাংশনগুলি যেমন printf
সাধারণত স্থিতিযুক্তভাবে সংযুক্ত থাকে) এবং গতিশীলভাবে সংযুক্ত অন্যান্য ফাংশনগুলিতে কল করা সাধারণ । স্ট্যাটিকগুলি এক্সিকিউটেবলের "অংশ" হয়ে যায় এবং এক্সিকিউটেবল চালিত হলে গতিশীলগুলি "যোগদান" করে।
উভয় পদ্ধতির সুবিধা এবং অসুবিধা রয়েছে এবং অপারেটিং সিস্টেমের মধ্যে পার্থক্য রয়েছে। তবে যেহেতু আপনি জিজ্ঞাসা করেননি, আমি এটি এখানেই শেষ করব।
ld
ডকুমেন্টেশনটি দেখতে চাইতে পারেন ।
সংস্থার সময় স্ট্যাটিকালি লিঙ্কড লাইব্রেরিগুলি লিংকযুক্ত। গতিযুক্ত লিঙ্কযুক্ত লাইব্রেরি রান সময় লোড করা হয়। স্ট্যাটিক লিঙ্কিং আপনার কার্যকরকরণের মধ্যে লাইব্রেরিটিকে কিছুটা বেক করে। গতিশীল লিঙ্কিং শুধুমাত্র গ্রন্থাগারের একটি রেফারেন্সে বেকস; ডায়নামিক লাইব্রেরির জন্য বিটগুলি অন্য কোথাও বিদ্যমান এবং পরে তা সরিয়ে নেওয়া যেতে পারে।
কারণ উপরোক্ত পোস্টগুলির মধ্যে কোনওটি কীভাবে স্থিতিস্থাপকভাবে কোনও লিঙ্ক করবেন এবং দেখবেন না যে আপনি এটি সঠিকভাবে করেছেন তাই আমি এই সমস্যাটির সমাধান করব:
একটি সাধারণ সি প্রোগ্রাম
#include <stdio.h>
int main(void)
{
printf("This is a string\n");
return 0;
}
গতিশীলভাবে সি প্রোগ্রামটি লিঙ্ক করুন
gcc simpleprog.c -o simpleprog
এবং file
বাইনারি চালান :
file simpleprog
এবং এটি দেখিয়ে দেবে যে এটি এটিকে লাইনের সাথে গতিশীলভাবে কিছু যুক্ত করেছে:
"সিম্পলপ্রোগ: ইএনএফ / লিনাক্স ২.6.২6, বিল্ডআইডি [sha1] = 0xf715572611a8b04f686809d90d1c0d75c6028f0f, notx জন্য গতিশীলভাবে সংযুক্ত (শেয়ারড libs ব্যবহার করে), ELF 64-বিট এলএসবি এক্সিকিউটেবল, এক্স 86-64, সংস্করণ 1 (এসওয়াইএসভি)
পরিবর্তে আসুন এবার স্থিরভাবে প্রোগ্রামটি লিঙ্ক করুন:
gcc simpleprog.c -static -o simpleprog
স্ট্যাটিকালি লিঙ্কযুক্ত বাইনারি এ ফাইল চালানো দেখানো হবে:
file simpleprog
"সিম্পলপ্রোগ: ELF 64৪-বিট এলএসবি এক্সিকিউটেবল, x86-64, সংস্করণ 1 (জিএনইউ / লিনাক্স), জিএনইউ / লিনাক্স 2.6.26 এর জন্য স্থিরভাবে সংযুক্ত, বিল্ডআইডি [sha1] = 0x8c0b12250801c5a7c7434647b7dc65a644d6132 বি, ছাঁটা হয়নি"
এবং আপনি দেখতে পাচ্ছেন এটি আনন্দের সাথে স্থিরভাবে যুক্ত। দুঃখের বিষয় তবে সমস্ত লাইব্রেরি স্থিতিস্থাপকভাবে এইভাবে লিঙ্ক করার জন্য সহজ নয় libtool
এবং অবজেক্ট কোড এবং সি লাইব্রেরিগুলি হাতে হাতে ব্যবহার বা লিঙ্ক করার জন্য বর্ধিত প্রচেষ্টা প্রয়োজন হতে পারে ।
ভাগ্যক্রমে অনেক এমবেডেড সি লাইব্রেরি যেমন তাদের সমস্ত লাইব্রেরি না থাকলেmusl
প্রায় সকলের জন্য স্ট্যাটিক লিঙ্কিং বিকল্প সরবরাহ করে।
এখন আপনি strace
যে বাইনারি তৈরি করেছেন এবং আপনি দেখতে পাচ্ছেন যে প্রোগ্রামটি শুরুর আগে কোনও লাইব্রেরি অ্যাক্সেস করা হয়নি:
strace ./simpleprog
এখন strace
গতিশীলভাবে সংযুক্ত প্রোগ্রামের আউটপুটটির সাথে তুলনা করুন এবং আপনি দেখতে পাবেন যে স্ট্যাটিকালি লিঙ্কযুক্ত সংস্করণের স্ট্র্যাসটি আরও খাটো!
(আমি সি # জানি না তবে ভিএম ভাষার জন্য একটি স্থির সংযোগের ধারণাটি আকর্ষণীয়)
ডায়নামিক লিঙ্কিংয়ের সাথে প্রয়োজনীয় কার্যকারিতা কীভাবে সন্ধান করতে হয় তা জেনে রাখা জড়িত যা আপনার কাছে কেবল আপনার প্রোগ্রাম থেকে একটি রেফারেন্স রয়েছে। আপনি ফাইলটাইম, নেটওয়ার্ক বা সংকলিত কোড ক্যাশে রেফারেন্সের সাথে মিল রেখে কোডের টুকরোটির জন্য রানটাইম বা ওএস অনুসন্ধান করেন এবং তারপরে স্থানান্তরের মতো মেমোরিতে এটি আপনার প্রোগ্রামের চিত্রের সাথে সংহত করতে বেশ কয়েকটি ব্যবস্থা গ্রহণ করেন takes এগুলি সব রানটাইমে করা হয়। এটি ম্যানুয়ালি বা সংকলক দ্বারা করা যেতে পারে। গণ্ডগোলের ঝুঁকি নিয়ে আপডেট করার ক্ষমতা রয়েছে (যথা, ডিএলএল হেল্ক)।
স্থির লিঙ্কিংটি সংকলনের সময় সম্পন্ন করা হয়, আপনি সমস্ত কার্যকরী অংশ কোথায় রয়েছে তা সংকলককে বলুন এবং এগুলি সংহত করার জন্য নির্দেশ দিন। কোনও অনুসন্ধান, কোনও দ্ব্যর্থতা, পুনর্নির্মাণ ছাড়া আপডেট করার ক্ষমতা নেই। আপনার সমস্ত নির্ভরতা শারীরিকভাবে আপনার প্রোগ্রামের চিত্রের সাথে এক।