গতিশীল সংযোগ - লিনাক্স বনাম। উইন্ডোজ


10

উইন্ডোজের অধীনে, যখন আমি এমএসভিসিতে একটি ডিএলএল প্রকল্পে সি / সি ++ কোড সংকলন করি আমি 2 টি ফাইল পাচ্ছি:

  1. MyDll.dll
  2. MyDll.lib

যেখানে আমি বুঝতে পেরেছি MyDll.libকিছুটা পয়েন্টার টেবিল রয়েছে যা ডিএল এর মধ্যে ফাংশনগুলির অবস্থান নির্দেশ করে। এই ডেলটি ব্যবহার করার সময়, এক্সিপ ফাইলটিতে বলুন, MyDll.libলিংকেশনের সময় এক্সি ফাইলটিতে এম্বেড করা থাকে তাই রানটাইমের সময় এটি "জানে" কোথায় ফাংশনগুলি অবস্থিত MyDll.dllএবং সেগুলি ব্যবহার করতে পারে।

তবে আমি যদি লিনাক্সের অধীনে একই কোডটি সংকলন করি তবে আমি লিনাক্সের মধ্যে একটি ফাইল ( লিনাক্সের সমান ফাইলের সমতুল্য ) MySo.soব্যতীত পাচ্ছি, তবে লিনাক্সের অধীনে একটি এক্সিকিউটেবল ফাইল কীভাবে জানবে যে লিঙ্কিংয়ের সময় যদি কিছু এম্বেড না থাকে তবে ফাংশনগুলি কোথায় অবস্থিত ?MySo.alibMySo.so

উত্তর:


1

লিনাক্সে, লিঙ্কারটি (ডাইনামিক লিঙ্কার নয়) লিংক সময়ে নির্দিষ্ট করা ভাগ করা লাইব্রেরিগুলি অনুসন্ধান করে এবং এক্সিকিউটেবলের অভ্যন্তরে তাদের জন্য রেফারেন্স তৈরি করে। ডায়নামিক লিঙ্কার যখন এই এক্সিকিউটেবলকে বোঝায় এটি তাদের ভাগ করা লাইব্রেরিগুলি মেমরির মধ্যে লোড করে এবং প্রতীকগুলি সমাধান করে, যা বাইনারিগুলি চালানোর অনুমতি দেয়।

MySo.a, যদি এটি তৈরি করা হয় তবে উইন্ডোজটিতে ব্যবহৃত "প্রতীক দেখার টেবিলগুলি" পরিবর্তে প্রতীকগুলি সরাসরি বাইনারিগুলির সাথে সরাসরি যুক্ত করতে অন্তর্ভুক্ত করবে।

রুস্টিক্সের উত্তরটি উইন্ডোজের প্রক্রিয়াটি আমার চেয়ে আরও ভালভাবে ব্যাখ্যা করে; উইন্ডোজ ব্যবহার করার পরে অনেক দিন হয়েছে।


1
"উইন্ডোজ আলাদা পদ্ধতি গ্রহণ করে ... অপারেটিং সিস্টেমটি নির্দিষ্ট করে যেখানে প্রতীকগুলি ডিএলএলতে রয়েছে" - এটি উইকির বিরোধিতা করে , যা বলে যে ফাংশনটির নামগুলি এখনও সমাধান করা হয় (শুরুতে বা লাইব্রেরি ফাংশনে প্রথম কলটিতে) এমনকি আপনি যখন অধ্যক্ষগুলি ব্যবহার করুন (যদি না সরাসরি ঠিকানা বাঁধাই ব্যবহার করা হয় যা কোন দুপুর দেয় না কারণ এটি গ্রন্থাগার ব্যবহারকারীদের যখনই লাইব্রেরি পরিবর্তন হয় তখন তাদের কোডটি পুনরায় সংকলন এবং পুনরায় প্রচার করতে বাধ্য করে)।
yugr

@ ইউগার সেই অংশটি সরিয়ে, আমি যাইহোক স্ট্রগুলিতে আঁকড়ে ধরছিলাম।
এসএস আন

4

এমএসভিসি লিংকার একটি .EXE বা একটি .DLL উত্পাদন করতে অবজেক্ট ফাইল (.obj) এবং অবজেক্ট লাইব্রেরি (.lib) এর সাথে লিঙ্ক করতে পারে।

একটি ডিএলএল সাথে লিঙ্ক করার জন্য, এমএসভিসিতে প্রক্রিয়াটি হ'ল তথাকথিত আমদানি গ্রন্থাগার (.LIB) ব্যবহার করে যা সি ফাংশন নাম এবং ডিএলএল এর রফতানি টেবিলের মধ্যে আঠালো হিসাবে কাজ করে (কোনও ডিএলএলে একটি ফাংশন নাম দ্বারা রফতানি করা যেতে পারে বা অর্ডিনাল দ্বারা - আধুনিকটি প্রায়শই অননুমোদিত API এর জন্য ব্যবহৃত হত)।

তবে বেশিরভাগ ক্ষেত্রে ডিএলএল রফতানি টেবিলটিতে সমস্ত ফাংশনের নাম রয়েছে এবং এইভাবে আমদানি গ্রন্থাগারটি (.LIB) মূলত অতিরিক্ত বাজে তথ্য (" আমদানি ফাংশন এবিসি -> এক্সপোর্টেড ফাংশন এবিসি " ইত্যাদি) ধারণ করে । একটি বিদ্যমান .DLL থেকে .LB তৈরি
করা এমনকি সম্ভব ।

অন্যান্য প্ল্যাটফর্মের লিঙ্কারে এই "বৈশিষ্ট্য" নেই এবং ডায়নামিক লাইব্রেরিগুলির সাথে সরাসরি লিঙ্ক করতে পারেন।


"অন্যান্য প্ল্যাটফর্মে লিঙ্কারগুলির এই বৈশিষ্ট্যটি নেই" - বিলম্বিত লোডিং এবং অন্যান্য গুডিজ অর্জনের জন্য যদিও (যেমন ইমপ্লিব.স লিনাক্সের জন্য এটি করে) কার্যকর করা সহজ ।
yugr

@ ইউগার: এজন্যই "বৈশিষ্ট্য" উদ্ধৃতিতে রয়েছে - এটি আপনি সাধারণত যা করতে চান তা নয় এবং উইন্ডোজে আপনাকে অবশ্যই অতিরিক্ত কাজ করতে হবে।
ক্রিস ডড

1

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

পার্থক্যটি হ'ল লিনাক্সে এই স্টাব ফাংশনগুলি (যাকে পিএলটি স্টাব বলা হয়) গতিশীলভাবে উত্পন্ন হয় যখন আপনি আপনার অ্যাপটিকে গতিশীল লাইব্রেরির সাথে সংযুক্ত করেন (গ্রন্থাগার এগুলি উত্পন্ন করার জন্য পর্যাপ্ত তথ্য ধারণ করে), অন্যদিকে লিনাক্সে সেগুলি পরিবর্তে উত্পন্ন হয় যখন ডিএলএল নিজেই থাকে পৃথক .libফাইলে তৈরি করা হয়েছে।

দুটি পন্থা এতই সমান যে লিনাক্সে উইন্ডোজ আমদানি গ্রন্থাগারগুলি নকল করা আসলে সম্ভব ( ইমপ্লিব.সো প্রকল্প দেখুন)।


0

লিনাক্সে, আপনি MySo.soলিঙ্কারে পৌঁছে যান এবং এটি লিঙ্ক পর্বের জন্য প্রয়োজনীয় যা কেবল রানক্রমে প্রয়োজনীয় রেফারেন্স রেখে তা বের করতে সক্ষম হয় MySo.so


-3

.dllবা .soভাগ করা libs (রানটাইমের সাথে সংযুক্ত) হয়, .aএবং .libএটি একটি স্থির লাইব্রেরি হয় (সংকলনের সময় সংযুক্ত)। উইন্ডোজ এবং লিনাক্সের মধ্যে এটি কোনও পার্থক্য নয়।

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

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

int example(int x) {
  ...do_something...
}

int ret = example(42);

তবে asm লেভেলে অনেক পার্থক্য থাকতে পারে। উদাহরণস্বরূপ, x86-এ, একটি callঅপকোড কার্যকর করা 42হয় এবং স্ট্যাকের উপর দেওয়া হয়। বা কিছু রেজিস্টারে। বা কোথাও। কেউ জানেন না যে dll লেখার আগে , এটি কীভাবে ব্যবহৃত হবে। বা প্রকল্পগুলি কীভাবে এটি ব্যবহার করতে চায়, একটি সংকলক (বা কোনও ভাষায়!) দিয়ে লিখিত সম্ভব যা বর্তমানে উপস্থিত নেই (বা এটি ডেল বিকাশকারীদের পক্ষে অজানা)।

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

আপনি সঠিকভাবে দেখতে পাচ্ছেন, উইন্ডোজ কাস্টমটি হ'ল একটি ডেল তৈরি করা, আমরা এটির সাথে একটি ন্যূনতম .a/ তৈরিও .libকরি। এই সর্বনিম্ন স্ট্যাটিক লাইব্রেরিটি কেবল একটি মোড়ক, এটির মাধ্যমে সেই ডেলের চিহ্নগুলি (ফাংশন) পৌঁছে যায় are এটি প্রয়োজনীয় asm- স্তরের কলিং রূপান্তরগুলি করে।

এর সুবিধাটি হ'ল সামঞ্জস্যতা। এর অসুবিধাটি হ'ল যদি আপনার কাছে মাত্র একটি। ডেল থাকে তবে আপনার ফাংশনগুলি কীভাবে কল করতে চান তা নির্ধারণের জন্য আপনার একটি কঠিন সময় থাকতে পারে। এটি যদি dll এর বিকাশকারী আপনাকে না দেয় তবে.a dlls এর ব্যবহার হ্যাকিংয়ের কাজ করে । সুতরাং, এটি মূলত বন্ধ হয়ে যাওয়ার উদ্দেশ্যে কাজ করে, উদাহরণস্বরূপ, এসডিকেগুলির জন্য অতিরিক্ত নগদ পাওয়া সহজ।

এর আরেকটি অসুবিধা হ'ল এমনকি আপনি ডায়নামিকাল লাইব্রেরি ব্যবহার করলেও আপনাকে এই ছোট্ট মোড়কে স্থিরভাবে সংকলন করতে হবে।

লিনাক্সে, ডলসের বাইনারি ইন্টারফেসটি স্ট্যান্ডার্ড এবং সি কনভেনশন অনুসরণ করে। সুতরাং, কোন .aপ্রয়োজন নেই এবং ভাগ করা libs মধ্যে বাইনারি সামঞ্জস্য আছে, বিনিময়ে আমাদের মাইক্রোসফ্ট কাস্টম এর সুবিধা নেই।


1
দয়া করে একটি প্রুফলিঙ্ক সরবরাহ করুন যা স্টাব ফাংশনগুলি যুক্তির ক্রম পরিবর্তন করতে পারে। আমি এর আগে কখনও শুনিনি এবং ওভারহেড কতটা বড় পারফরম্যান্স হবে তা দেওয়া বিশ্বাস করা শক্ত।
yugr

@ ইউগার একটি সাধারণ রেজিস্টার / স্ট্যাক পুনরায় অর্ডারিং কোনও ওভারহেডের কাজ নয়। আপনি যদি এমএসভিসি-সংকলিত বাইনারিগুলি থেকে এমএসভিসি-সংকলিত dlls ব্যবহার করেন তবে স্পষ্টতই খুব বেশি কিছু ঘটবে না, তবে এটি হতে পারে।
পিটারহ - মনিকা পুনরায় ইনস্টল করুন

1
আমরা এ নিয়ে তর্ক করতে পারি তবে আপনি যদি ঠিক থাকেন তবে প্রুফ লিঙ্কগুলি সরবরাহ করা সহজ হওয়া উচিত যে স্টাব ফাংশনগুলি তর্ক করার ক্ষুদ্রতর তুচ্ছ প্রক্রিয়াজাতকরণ (এবং কেবল ডামি ট্রাম্পোলিনের চেয়ে বেশি হওয়া)।
yugr

@ ইউগার স্টলগুলির ডিএল এর ফাংশন স্বাক্ষরগুলিতে অ্যাক্সেস রয়েছে যা অ-গা tri় প্রসেসিংকে তুচ্ছ করে তোলে।
পিটারহ - মনিকা পুনরায় ইনস্টল করুন

1
আমি কেবলমাত্র আপনাকে আমদানি গ্রন্থাগারটি সম্পর্কিত কিছু প্রুফলিঙ্কগুলি দিয়ে আপনার উত্তরটি সম্পূর্ণ করার পরামর্শ দিই (কারণ কিছু দাবি প্রশ্নবিদ্ধ)।
yugr
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.