(সি) বিভিন্ন সংকলক বাইনারি-সামঞ্জস্যপূর্ণ সঙ্গে তৈরি বস্তু ফাইল?


11

আমি বুঝতে পারি যে সি ++ সংকলক একে অপরের সাথে সামঞ্জস্য নয়। তবে আমি বিশেষত সি এর জন্য এই বিষয়টিতে কিছুই খুঁজে পাচ্ছিলাম না। আমি জানি যে সি স্ট্যান্ডার্ড কমপ্লায়ারদের জিনিসগুলি যথাযথভাবে প্রয়োগ করার জন্য প্রচুর জায়গা ছেড়ে দেয়: উদাহরণস্বরূপ, বেশিরভাগ (সমস্ত?) ডেটা ধরণের আকার এবং প্রান্তিককরণ কিছু ন্যূনতম গ্যারান্টিগুলির জন্য প্রয়োগ-সংজ্ঞায়িত। অতএব, দুটি সংকলক (বা একই সংকলকের দুটি সংস্করণ) অসংখ্য বিবরণে দ্বিমত পোষণ করতে পারে।

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


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

2
libs সামঞ্জস্যপূর্ণ করা যেতে পারে, আমি মনে করি না যে আপত্তি হ'ল গ্যারান্টিযুক্ত
ratchet freak

@ জিয়েরগো "একই প্ল্যাটফর্ম" দ্বারা, আপনি কি সিপিইউ আর্কিটেকচার বা সিপিইউ আর্কিটেকচার + ওএস বলতে চাইছেন?
ডোভাল

@ratchetfreak আমি এই ছাপে ছিলাম যে একটি লিব বেশিরভাগ অংশের জন্য একাধিক অবজেক্ট ফাইলের একঝাঁক বক্তব্য। এটা কি ভুল?
ডোভাল

আমি আশা করি না যে বিভিন্ন সংকলকগুলিতে অবজেক্টগুলি সামঞ্জস্যপূর্ণ হবে।
old_timer

উত্তর:


10

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

আমি এটি যোগ্যতা অর্জন করতে হবে। সি কম্পাইলার দ্বারা নির্গত বস্তুগুলিকে এক্সিকিউটেবল বা রানটাইম লিঙ্কযোগ্য লাইব্রেরি উত্পাদন করতে রানটাইম লাইব্রেরির সাথে যুক্ত করতে হবে। যদিও সি রানটাইম লাইব্রেরি দ্বারা প্রদত্ত দৃশ্যমান ফাংশনগুলি সামঞ্জস্যপূর্ণ হওয়া উচিত, সেখানে অ-দৃশ্যমান ফাংশনগুলিও হবে যা বাস্তবায়নের জন্য স্বতন্ত্র এবং আন্তঃব্যবহার্যতা রোধ করে।

সামঞ্জস্যতার এই অভাব একই সংকলকটির বিভিন্ন সংস্করণেও প্রসারিত। সাধারণভাবে, সংকলকের পুরানো এবং নতুন সংস্করণগুলির সাথে সংকলিত প্রোগ্রাম এবং লাইব্রেরিগুলিকে একসাথে সংযুক্ত করা যায় না এবং এমএসভিসির সাথে সংকলিতগুলি জিসিসি সংকলিতগুলির সাথে সংযুক্ত হতে পারে না।

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

উইন্ডোজে অন্য দুটি এবিআই রয়েছে: সিওএম এবং। নেট সংস্থাগুলি এবং এগুলি বিভিন্ন বিস্তৃত ভাষায় বিস্তৃত। সুতরাং আন্তঃক্রিয়াশীলতা অবশ্যই সম্ভব, তবে তারা সামঞ্জস্যপূর্ণ নয়।


লিঙ্কারের মানচিত্রের তুলনা করে অসামঞ্জস্যতার ডিগ্রি সহজেই দেখা যায়। জিএনইউ ব্যবহারের ld -Mজন্য, এমএসভিসি ব্যবহারের জন্য link /map। দুটি উত্পন্ন ফাইল অধ্যয়ন করুন। উভয়টির মধ্যে আপনি নামগুলি সনাক্ত করতে পারবেন যেমন প্রিন্টফ এবং প্রধান, যদিও (বিকল্পগুলির উপর নির্ভর করে) নামগুলি বিভিন্ন উপায়ে ম্যাঙ্গাল করা হতে পারে। তাদের এমনও নাম থাকবে যা সম্পূর্ণ আলাদা, যার মধ্যে অনেকগুলি আপনি চিনতে পারবেন না। বিভিন্ন সংকলক দ্বারা উত্পাদিত অবজেক্ট ফাইলগুলির সামঞ্জস্যপূর্ণ হওয়ার জন্য তাদের সমস্ত নামের সাথে একমত হতে হবে, এবং তারা কখনও করেন না। এমনকি একই সংকলকটির বিভিন্ন সংস্করণও সর্বদা এটি করতে পারে না।


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

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

আমি মানচিত্রের তুলনা করার অর্থ কী তা আমি জানি না তাই আমি আরও কিছুটা সুনির্দিষ্ট হয়ে উঠব: অনুশীলনে অনুমান করা কি নিরাপদ যে প্রদত্ত সিপিইউ আর্কিটেকচার এবং ওএস সংমিশ্রনের জন্য সমস্ত সংকলক সামঞ্জস্যপূর্ণ? উদাহরণস্বরূপ আমার কাছে মেইন.সি রয়েছে, যা আমি জিসিসি এবং মাইলিবেরি.সি দিয়ে সংকলন করি যা আমি ঝনঝনির সাথে সংকলন করি, লিনাক্স x64 উভয়কেই লক্ষ্য করে। যুক্তিসঙ্গত মূলধারার ওএস (লিনাক্স, ম্যাক, উইন্ডোজ) ধরে নেওয়া, এটি কি নিরাপদে ধরে নেওয়া যায় যে দুটি সংকলক কী তা বিবেচনা না করেই কাজ করবে?
ডোভাল

1
অত্যন্ত সম্ভাবনা নেই, ঝাঁকুনির লিঙ্ক মানচিত্রটি দেখুন। সম্পাদনা দেখুন।
ডেভিড.পিএফএফএক্স

17

আপনি যা খুঁজছেন তাকে এবিআই (অ্যাপ্লিকেশন বাইনারি ইন্টারফেস) বলা হয়।

সি ভাষা কোনও এবিআইকে সংজ্ঞায়িত করে না, সুতরাং সেই অর্থে সত্যই কোনও গ্যারান্টি নেই যে বিভিন্ন সংকলক সংকলিত সি ফাইলগুলি একে অপরের সাথে কাজ করবে।

অন্যদিকে, বেশিরভাগ প্ল্যাটফর্মে ওএস একটি এবিআইকে এটির সাথে ইন্টারফেস করার জন্য সংজ্ঞা দেয় এবং সমস্ত সংকলককে লক্ষ্য করে যে ওএস ও প্রসেসর পরিবার নন-ওএস উপাদানগুলির সাথে ইন্টারফ্যাক্স করার জন্য একই অবিআই ব্যবহার করে। সুতরাং, অনুশীলনে, বিভিন্ন সংকলক দ্বারা তৈরি সি অবজেক্টগুলি একে অপরের সাথে কাজ করতে পারে।


এটা বোধগম্য. আমি কি শেয়ার্ড লাইব্রেরিগুলি ওএস এর এবিআই অনুসরণ করে?
ডোভাল

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