আমি অন্য একটি উত্তর যুক্ত করব, সংঘটিত কিছু স্পর্শকাতর আলোচনার উদ্দেশ্যে।
সি এবিআই (অ্যাপ্লিকেশন বাইনারি ইন্টারফেস) মূলত বিপরীত ক্রমে স্ট্যাকের উপর যুক্তিগুলি পাস করার জন্য ডাকা হয়েছিল (যেমন - ডান থেকে বাম দিকে ঠেলা), যেখানে কলার স্ট্যাকের সঞ্চয়স্থানও মুক্ত করে। আধুনিক এবিআই প্রকৃত পক্ষে যুক্তিগুলি পাস করার জন্য রেজিস্টারগুলি ব্যবহার করে, তবে অনেকগুলি ম্যাংলিং বিবেচনা সেই মূল স্ট্যাক আর্গুমেন্ট পাসিংয়ে ফিরে যায়।
আসল পাস্কাল এবিআই, বিপরীতে, যুক্তিগুলি বাম থেকে ডানে ঠেলে দিয়েছে এবং কলিটিকে যুক্তিগুলি পপ করতে হয়েছিল। মূল সি এবিআই দুটি গুরুত্বপূর্ণ পয়েন্টে মূল পাস্কাল এবিআইয়ের চেয়ে উচ্চতর। আর্গুমেন্ট পুশ অর্ডারটির অর্থ হ'ল প্রথম আর্গুমেন্টের স্ট্যাক অফসেটটি সর্বদা জানা থাকে, ফাংশনগুলিতে মঞ্জুরি দেয় যার অজানা সংখ্যক যুক্তি রয়েছে, যেখানে প্রাথমিক আর্গুমেন্টগুলি নিয়ন্ত্রণ করে যে আরও কতগুলি আর্গুমেন্ট রয়েছে (আলা printf
)।
দ্বিতীয় উপায় যেভাবে সি এবিআই উচ্চতর, হ'ল কলার এবং কলি কয়টি যুক্তি নিয়ে একমত না হওয়ার ক্ষেত্রে আচরণ behavior সি ক্ষেত্রে, যতক্ষণ না আপনি আসলে শেষটির অতীতের তর্কগুলি অ্যাক্সেস করেন না, খারাপ কিছুই হয় না। পাস্কলে, ভুল সংখ্যাটি যুক্তিগুলি স্ট্যাক থেকে পপ করা হয়েছে এবং পুরো স্ট্যাকটি নষ্ট হয়ে গেছে।
আসল উইন্ডোজ ৩.১ এবিআই প্যাস্কেলের উপর ভিত্তি করে ছিল। যেমন, এটি প্যাসকেল এবিআই ব্যবহার করেছে (বাম থেকে ডান ক্রমে যুক্তি, কলি পপস)। যেহেতু আর্গুমেন্ট সংখ্যার কোনও অমিলের ফলে স্ট্যাক দুর্নীতির দিকে পরিচালিত হতে পারে, তাই ম্যাংলিং স্কিম তৈরি হয়েছিল। প্রতিটি ফাংশনের নামটি তার আর্গুমেন্টের আকার, বাইটে, নির্দেশ করে একটি সংখ্যার সাথে ম্যাঙ্গেল করা হয়েছিল। সুতরাং, 16 বিট মেশিনে, নিম্নলিখিত ফাংশন (সি সিনট্যাক্স):
int function(int a)
ম্যাঙ্গেলড ছিল function@2
, কারণ int
দুটি বাইট প্রশস্ত। এটি করা হয়েছিল যাতে ঘোষণা এবং সংজ্ঞাটি মেলে না, লিঙ্কার রান সময়ে স্ট্যাকটিকে দূষিত করার পরিবর্তে ফাংশনটি খুঁজে পেতে ব্যর্থ হবে। বিপরীতে, যদি প্রোগ্রামটি লিঙ্ক হয়, তবে আপনি নিশ্চিত হতে পারেন যে কলের শেষে স্ট্যাক থেকে সঠিক বাইটগুলি পপ করা হয়েছে।
32 বিট উইন্ডোজ এবং এর stdcall
পরিবর্তে এবিআই ব্যবহার করুন। এটি পাস্কাল এবিআইয়ের মতো, ধাক্কা ক্রমান ডান থেকে বামে সি এর মতোই। পাস্কাল এবিআইয়ের মতো, ম্যাকলিং নামটি স্ট্যাক দুর্নীতি এড়াতে ফাংশনটির নামের সাথে যুক্তিগুলি বাইট আকারকে মঙ্গল করে।
এখানে অন্য কোথাও করা দাবিগুলির বিপরীতে, সি এবিআই ভিজ্যুয়াল স্টুডিওতে এমনকি ফাংশনটির নামগুলি ম্যাঙ্গেল করে না। বিপরীতে, stdcall
এবিআই স্পেসিফিকেশন দিয়ে সজ্জিত ম্যাংলিং ফাংশনগুলি ভিএস-এর পক্ষে অনন্য নয় isn't লিনাক্সের জন্য সংকলন করার পরেও জিসিসি এই এবিআইকে সমর্থন করে। এটি ওয়াইন দ্বারা ব্যাপকভাবে ব্যবহৃত হয় , এটি লিনাক্স সংকলিত বাইনারিগুলির উইন্ডোজ সংকলিত ডিএলএলগুলির সাথে রান টাইম লিঙ্ক করার অনুমতি দেওয়ার জন্য তার নিজস্ব লোডার ব্যবহার করে।