জিসিসিতে ভাগ করা লাইব্রেরিগুলি সংকলনের সময় -fPIC বিকল্পটি কোডটি স্বাধীন অবস্থান হিসাবে সংকলন করে। কোনও কোড (পারফরম্যান্স বা অন্যথায়) কেন আপনি সমস্ত কোড অবস্থানটি স্বাধীনভাবে সংকলন করবেন না?
জিসিসিতে ভাগ করা লাইব্রেরিগুলি সংকলনের সময় -fPIC বিকল্পটি কোডটি স্বাধীন অবস্থান হিসাবে সংকলন করে। কোনও কোড (পারফরম্যান্স বা অন্যথায়) কেন আপনি সমস্ত কোড অবস্থানটি স্বাধীনভাবে সংকলন করবেন না?
উত্তর:
এটি একটি দিকনির্দেশ যুক্ত করে। অবস্থান স্বাধীন কোডের সাথে আপনাকে নিজের ফাংশনের ঠিকানাটি লোড করতে হবে এবং তারপরে এটিতে লাফাতে হবে। সাধারণত ফাংশনের ঠিকানা ইতিমধ্যে নির্দেশের স্ট্রিমে উপস্থিত থাকে।
এই নিবন্ধটি ব্যাখ্যা করে কীভাবে পিআইসি কাজ করে এবং এটি বিকল্পের সাথে তুলনা করে - লোড সময় স্থানান্তর । আমি মনে করি এটি আপনার প্রশ্নের সাথে প্রাসঙ্গিক।
হ্যাঁ পারফরম্যান্সের কারণ রয়েছে। কিছু অ্যাক্সেস মেমোরিতে নিখুঁত অবস্থান পাওয়ার জন্য ইন্ডিয়ারেশনের অন্য স্তরের অধীনে কার্যকরভাবে থাকে।
এছাড়াও জিওটি (গ্লোবাল অফসেট টেবিল) রয়েছে যা গ্লোবাল ভেরিয়েবলগুলির অফসেট সংরক্ষণ করে। আমার কাছে এটি কেবল আইএটি ফিক্সআপ টেবিলের মতো দেখাচ্ছে, যা উইকিপিডিয়া এবং অন্যান্য কয়েকটি উত্স দ্বারা অবস্থান নির্ভর হিসাবে শ্রেণিবদ্ধ করা হয়েছে।
স্বীকৃত উত্তর ছাড়াও। একটি জিনিস যা পিআইসি কোডের কার্য সম্পাদনকে অনেক ক্ষতি করে তা হ'ল x86 এ "আইপি আপেক্ষিক ঠিকানা" না থাকা। "আইপি আপেক্ষিক ঠিকানা" দিয়ে আপনি বর্তমান নির্দেশিকা নির্দেশকের কাছ থেকে এমন ডেটা চাইতে পারেন যা এক্স বাইট। এটি পিআইসি কোডকে অনেক সহজ করে তুলবে।
জাম্প এবং কলগুলি সাধারণত EIP আপেক্ষিক হয়, সুতরাং এটি সত্যিই কোনও সমস্যা তৈরি করে না। তবে ডেটা অ্যাক্সেস করতে কিছুটা বাড়তি কৌশল প্রয়োজন trick কখনও কখনও, কোনও রেজিস্টার কোডটির প্রয়োজন হয় এমন ডেটাতে অস্থায়ীভাবে "বেস পয়েন্টার" হিসাবে সংরক্ষণ করা হবে। উদাহরণস্বরূপ, একটি সাধারণ কৌশল হ'ল x86 এ কল করার যেভাবে কাজ করা হয় তা অপব্যবহার করা:
call label_1
.dd 0xdeadbeef
.dd 0xfeedf00d
.dd 0x11223344
label_1:
pop ebp ; now ebp holds the address of the first dataword
; this works because the call pushes the **next**
; instructions address
; real code follows
mov eax, [ebp + 4] ; for example i'm accessing the '0xfeedf00d' in a PIC way
এই এবং অন্যান্য কৌশলগুলি ডেটা অ্যাক্সেসগুলিতে ইন্ডিয়ারেশনের একটি স্তর যুক্ত করে। উদাহরণস্বরূপ, জিসিটি (গ্লোবাল অফসেট টেবিল) জিসিসি সংকলক দ্বারা ব্যবহৃত।
x86-64 একটি "আরআইপি সম্পর্কিত" মোড যুক্ত করেছে যা জিনিসগুলিকে অনেক সহজ করে তোলে ।
কারণ সম্পূর্ণ অবস্থানে স্বতন্ত্র কোড প্রয়োগ করা কোড জেনারেটরে একটি বাধা যুক্ত করে যা দ্রুত অপারেশনগুলির ব্যবহারকে বাধা দিতে পারে বা এই সীমাবদ্ধতা রক্ষায় অতিরিক্ত পদক্ষেপ যুক্ত করতে পারে।
ভার্চুয়াল মেমরি সিস্টেম ছাড়াই মাল্টিপ্রসেসিং পেতে এটি একটি গ্রহণযোগ্য বাণিজ্য হতে পারে, যেখানে আপনি একে অপরের স্মৃতিতে আক্রমণ না করার প্রক্রিয়াগুলিতে বিশ্বাস করেন এবং কোনও বেস ঠিকানাতে একটি নির্দিষ্ট অ্যাপ্লিকেশন লোড করতে হতে পারে।
অনেক আধুনিক সিস্টেমে পারফরম্যান্স ট্রেড-অফগুলি পৃথক হয় এবং একটি স্থান পরিবর্তনকারী লোডার প্রায়শই কম ব্যয়বহুল হয় (এটি কোনও সময় কোডের সাথে প্রথমে লোড করা হয়) এর চেয়ে নিখরচায় যদি কোন অপ্টিমাইজার করতে পারে তবে তার চেয়ে ভাল। এছাড়াও, ভার্চুয়াল অ্যাড্রেস স্পেসগুলির প্রাপ্যতা প্রথম স্থানে অবস্থানের স্বাধীনতার জন্য সবচেয়ে বেশি অনুপ্রেরণাকে গোপন করে।
এছাড়াও, বেশিরভাগ আধুনিক প্রসেসরের ভার্চুয়াল মেমরি হার্ডওয়্যার (বেশিরভাগ আধুনিক ওএসএস দ্বারা ব্যবহৃত) এর অর্থ হ'ল প্রচুর কোড (সমস্ত ব্যবহারকারীর স্পেস অ্যাপ্লিকেশন, এমএমএপি বা এর মতো বিপরীতমুখী ব্যবহার ব্যতীত) অবস্থান স্বাধীন হওয়ার দরকার নেই। প্রতিটি প্রোগ্রামের নিজস্ব ঠিকানা স্থান পায় যা এটি শূন্য থেকে শুরু বলে মনে করে।
position-independent code বেশিরভাগ আর্কিটেকচারে ওভারহেডের পারফরম্যান্স রয়েছে, কারণ এটির জন্য একটি অতিরিক্ত নিবন্ধক প্রয়োজন।
সুতরাং, এটি কার্য সম্পাদনের উদ্দেশ্যে purpose
আজকাল ডিফল্টরূপে অপারেটিং সিস্টেম এবং সংকলক সকল কোডকে অবস্থান স্বাধীন কোড হিসাবে তৈরি করে। -ফপিআইসি পতাকা ব্যতীত সংকলনের চেষ্টা করুন, কোডটি সূক্ষ্মভাবে সংকলন করবে তবে আপনি কেবল একটি সতর্কতা পাবেন। এটির জন্য উইন্ডোজ মেমরি ম্যাপিং নামে একটি কৌশল ব্যবহার করে।
প্রশ্নটি ২০০৯-এ স্থায়ী Ten এটি এখন অপারেটিং সিস্টেম এবং সংকলক দ্বারা প্রয়োগ করা হয়। অপ্ট-আউট করার কোনও উপায় নেই। সমস্ত কোড PIE এর সাথে জোর করে সংকলিত হয়েছে এবং এই ASLR অজুহাতে অংশ হিসাবে-কোনও-পিক / -না-পাই পতাকা উপেক্ষা করা হচ্ছে। এর কারণ হ'ল বর্ধিত সুরক্ষার আড়ালে পূর্বের দ্রুত অ্যাপ্লিকেশনগুলিকে কমিয়ে আনা এবং নতুন হার্ডওয়্যার বিক্রি করা। এটি সম্পূর্ণ অযৌক্তিক, কারণ এখন বড় মেমরির আকারগুলি আমাদের ডায়ামিক লিঙ্কিং থেকে একেবারে মুক্তি পেতে দেয় এবং সমস্ত অ্যাপ্লিকেশনকে স্থিতিশীলভাবে সংকলন করে।
এর আগেও একই ঘটনা ঘটেছিল, যখন লোকে চুপচাপ সত্যিকারের মোড এবং অন্যান্য স্বাধীনতা হরণ করায় গ্রহণ করেছিল। এবং আমি আপনাকে মনে করি, প্রসঙ্গের স্যুইচগুলি এবং ঠিকানার অনুবাদ ব্যবস্থার কারণে এমএমইউ ভারী ধীরগতির দিকে। বিজ্ঞানীরা পদার্থবিজ্ঞানের পরীক্ষাগুলির নমুনা নেওয়ার জন্য যেমন ব্যবহার করেছিলেন তেমন পারফরম্যান্স সমালোচনামূলক সিস্টেমে আপনি এমএমইউ পাবেন না।
আপনি অভিযোগ করবেন না, কারণ আপনি এমনকি জানেন না যে এই কোডগুলি এই সমস্ত প্রশিক্ষণের চাকার দ্বারা প্রতিবন্ধকতাযুক্ত। আমি কি বলতে পারি? তাদের পিআইসি দিয়ে এখন 2 গুণ ধীর সফ্টওয়্যার উপভোগ করুন! আরও বেশি, এলএলভিএম এর আবির্ভাবের সাথে সাথেই শিগগিরই জেআইটি (ম্যানেজড কোড) কার্যকর করা হবে, যার সাথে x86 ইনলাইন অ্যাসেমব্লিতে অ্যাক্সেস নেই, যা কোনও সি / সি ++ কোড আরও ধীর করে দেবে। "যারা সুরক্ষার জন্য স্বাধীনতা ত্যাগ করেন তারাও প্রাপ্য নয়।"