কেন সমস্ত কোড সংকলিত অবস্থান স্বাধীন নয়?


87

জিসিসিতে ভাগ করা লাইব্রেরিগুলি সংকলনের সময় -fPIC বিকল্পটি কোডটি স্বাধীন অবস্থান হিসাবে সংকলন করে। কোনও কোড (পারফরম্যান্স বা অন্যথায়) কেন আপনি সমস্ত কোড অবস্থানটি স্বাধীনভাবে সংকলন করবেন না?


4
তবে ওয়াওয়েস্ট পুরোপুরি সঠিক নয়। অনেক ফাংশন কল এবং জাম্পগুলি আপেক্ষিক জাম্প ব্যবহার করে যাতে প্রায় কাছাকাছি যাওয়ার পরে তাদের এমনকি কোনও জাম্প টেবিলের প্রয়োজন হয় না।
অজানা

উত্পন্ন সমাবেশ কোডটি দেখে মনে হচ্ছে যে ফাংশনটির ঠিকানাটি ভারে লোড করা হয়েছে নন এফপিক কোড এটি উপস্থিত হয় এটি কেবল একটি লাফ। আমি কি আপনার বক্তব্য ভুল বুঝছি?
ojblass

@ ইজব্লাস বলতে যা বোঝাতে চাইছি তা হল যে কিছু জাম্প "এখানে আগে লাফিয়ে 50 নির্দেশ" বা "লাফাতে 0x400000" এর পরিবর্তে "5 টি নির্দেশ পিছনে দিকে লাফানোর" মতো হয়। সুতরাং এটি বলার জন্য আপনাকে প্রতিবার -fPIC দিয়ে কোনও ঠিকানা লোড করতে হবে এটি সম্পূর্ণ সত্য নয়।
অজানা

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

উত্তর:


68

এটি একটি দিকনির্দেশ যুক্ত করে। অবস্থান স্বাধীন কোডের সাথে আপনাকে নিজের ফাংশনের ঠিকানাটি লোড করতে হবে এবং তারপরে এটিতে লাফাতে হবে। সাধারণত ফাংশনের ঠিকানা ইতিমধ্যে নির্দেশের স্ট্রিমে উপস্থিত থাকে।


33

এই নিবন্ধটি ব্যাখ্যা করে কীভাবে পিআইসি কাজ করে এবং এটি বিকল্পের সাথে তুলনা করে - লোড সময় স্থানান্তর । আমি মনে করি এটি আপনার প্রশ্নের সাথে প্রাসঙ্গিক।


16
@ নিক: আমি একমত নই যদি এটি প্রশ্নকারীকে সহায়তা করে তবে এটি একটি উত্তর। কোনও প্রাসঙ্গিক নিবন্ধের দিকে ইঙ্গিত করে তথ্য প্রচুর পরিমাণে সরবরাহ করতে পারে।
এলি বেন্ডারস্কি

4
এই পোস্টে কোন সিদ্ধান্তে নেই, কেবল একটি নিবন্ধের লিঙ্ক। পারফরম্যান্স সমস্যার কারণে পিআইসি ডিফল্টরূপে ব্যবহৃত হয় না এমন একটি ক্লুও নয়।
নিক

10
যদিও এই লিঙ্কটি প্রশ্নের উত্তর দিতে পারে, উত্তরের প্রয়োজনীয় অংশগুলি এখানে অন্তর্ভুক্ত করা এবং রেফারেন্সের জন্য লিঙ্কটি সরবরাহ করা ভাল। লিঙ্কযুক্ত পৃষ্ঠাগুলি পরিবর্তিত হলে লিঙ্ক-শুধুমাত্র উত্তরগুলি অবৈধ হতে পারে।
রব

4
@ রব: উত্পাদনশীল জিনিসটি হ'ল সম্পাদনার পরামর্শ দেওয়া এবং শ্বেত করার জন্য মন্তব্যগুলি ব্যবহার না করা। এই উত্তরটি 4 বছরের পুরানো। এরপরে তার উত্তর কীভাবে দেখা উচিত সে সম্পর্কে কম কড়া নিয়ম ছিল
এলি বেন্ডারস্কি

6
এই পোস্টটি "পর্যালোচনা" এর অধীনে প্রদর্শিত হয়েছিল যাতে আমি এটি করি এবং আমি তা করেছিলাম request অন্য কেউ এটি পতাকাঙ্কিত। "ঝকঝকে মন্তব্য" নিজেই এসও দ্বারা উত্পাদিত হয়, আমি নয় me
রব

27

হ্যাঁ পারফরম্যান্সের কারণ রয়েছে। কিছু অ্যাক্সেস মেমোরিতে নিখুঁত অবস্থান পাওয়ার জন্য ইন্ডিয়ারেশনের অন্য স্তরের অধীনে কার্যকরভাবে থাকে।

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

http://en.wikedia.org/wiki/Position_ind dependent_code


23

স্বীকৃত উত্তর ছাড়াও। একটি জিনিস যা পিআইসি কোডের কার্য সম্পাদনকে অনেক ক্ষতি করে তা হ'ল x86 এ "আইপি আপেক্ষিক ঠিকানা" না থাকা। "আইপি আপেক্ষিক ঠিকানা" দিয়ে আপনি বর্তমান নির্দেশিকা নির্দেশকের কাছ থেকে এমন ডেটা চাইতে পারেন যা এক্স বাইট। এটি পিআইসি কোডকে অনেক সহজ করে তুলবে।

জাম্প এবং কলগুলি সাধারণত EIP আপেক্ষিক হয়, সুতরাং এটি সত্যিই কোনও সমস্যা তৈরি করে না। তবে ডেটা অ্যাক্সেস করতে কিছুটা বাড়তি কৌশল প্রয়োজন trick কখনও কখনও, কোনও রেজিস্টার কোডটির প্রয়োজন হয় এমন ডেটাতে অস্থায়ীভাবে "বেস পয়েন্টার" হিসাবে সংরক্ষণ করা হবে। উদাহরণস্বরূপ, একটি সাধারণ কৌশল হ'ল x86 এ কল করার যেভাবে কাজ করা হয় তা অপব্যবহার করা:

এই এবং অন্যান্য কৌশলগুলি ডেটা অ্যাক্সেসগুলিতে ইন্ডিয়ারেশনের একটি স্তর যুক্ত করে। উদাহরণস্বরূপ, জিসিটি (গ্লোবাল অফসেট টেবিল) জিসিসি সংকলক দ্বারা ব্যবহৃত।

x86-64 একটি "আরআইপি সম্পর্কিত" মোড যুক্ত করেছে যা জিনিসগুলিকে অনেক সহজ করে তোলে ।


4
আইআইআরসি এমআইপিএসের পিসি-আপেক্ষিক সম্বোধন খুব বেশি নেই, আপেক্ষিক লাফানো বাদে
ফুকলভ

4
এটি শেলকোডে ব্যবহার করা ঠিকানাটি পেতে এটি একটি সাধারণ প্রযুক্তি। আমি এটি কয়েকটি সিটিএফ সমাধানগুলিতে ব্যবহার করেছি।
sherrellbc

2

কারণ সম্পূর্ণ অবস্থানে স্বতন্ত্র কোড প্রয়োগ করা কোড জেনারেটরে একটি বাধা যুক্ত করে যা দ্রুত অপারেশনগুলির ব্যবহারকে বাধা দিতে পারে বা এই সীমাবদ্ধতা রক্ষায় অতিরিক্ত পদক্ষেপ যুক্ত করতে পারে।

ভার্চুয়াল মেমরি সিস্টেম ছাড়াই মাল্টিপ্রসেসিং পেতে এটি একটি গ্রহণযোগ্য বাণিজ্য হতে পারে, যেখানে আপনি একে অপরের স্মৃতিতে আক্রমণ না করার প্রক্রিয়াগুলিতে বিশ্বাস করেন এবং কোনও বেস ঠিকানাতে একটি নির্দিষ্ট অ্যাপ্লিকেশন লোড করতে হতে পারে।

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


1

এছাড়াও, বেশিরভাগ আধুনিক প্রসেসরের ভার্চুয়াল মেমরি হার্ডওয়্যার (বেশিরভাগ আধুনিক ওএসএস দ্বারা ব্যবহৃত) এর অর্থ হ'ল প্রচুর কোড (সমস্ত ব্যবহারকারীর স্পেস অ্যাপ্লিকেশন, এমএমএপি বা এর মতো বিপরীতমুখী ব্যবহার ব্যতীত) অবস্থান স্বাধীন হওয়ার দরকার নেই। প্রতিটি প্রোগ্রামের নিজস্ব ঠিকানা স্থান পায় যা এটি শূন্য থেকে শুরু বলে মনে করে।


4
এমনকি কোনও ভিএম-এমএমইউ পিআইসি কোড সহ এটিও নিশ্চিত করা দরকার যে একই .so গ্রন্থাগারটি একবারে একবারে মেমরিতে লোড করা হয় যখন এটি বিভিন্ন এক্সিকিউটেবল দ্বারা ব্যবহৃত হয়।
মিমি মিমি মিমি

1

position-independent code বেশিরভাগ আর্কিটেকচারে ওভারহেডের পারফরম্যান্স রয়েছে, কারণ এটির জন্য একটি অতিরিক্ত নিবন্ধক প্রয়োজন।

সুতরাং, এটি কার্য সম্পাদনের উদ্দেশ্যে purpose


0

আজকাল ডিফল্টরূপে অপারেটিং সিস্টেম এবং সংকলক সকল কোডকে অবস্থান স্বাধীন কোড হিসাবে তৈরি করে। -ফপিআইসি পতাকা ব্যতীত সংকলনের চেষ্টা করুন, কোডটি সূক্ষ্মভাবে সংকলন করবে তবে আপনি কেবল একটি সতর্কতা পাবেন। এটির জন্য উইন্ডোজ মেমরি ম্যাপিং নামে একটি কৌশল ব্যবহার করে।


-5

প্রশ্নটি ২০০৯-এ স্থায়ী Ten এটি এখন অপারেটিং সিস্টেম এবং সংকলক দ্বারা প্রয়োগ করা হয়। অপ্ট-আউট করার কোনও উপায় নেই। সমস্ত কোড PIE এর সাথে জোর করে সংকলিত হয়েছে এবং এই ASLR অজুহাতে অংশ হিসাবে-কোনও-পিক / -না-পাই পতাকা উপেক্ষা করা হচ্ছে। এর কারণ হ'ল বর্ধিত সুরক্ষার আড়ালে পূর্বের দ্রুত অ্যাপ্লিকেশনগুলিকে কমিয়ে আনা এবং নতুন হার্ডওয়্যার বিক্রি করা। এটি সম্পূর্ণ অযৌক্তিক, কারণ এখন বড় মেমরির আকারগুলি আমাদের ডায়ামিক লিঙ্কিং থেকে একেবারে মুক্তি পেতে দেয় এবং সমস্ত অ্যাপ্লিকেশনকে স্থিতিশীলভাবে সংকলন করে।

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

আপনি অভিযোগ করবেন না, কারণ আপনি এমনকি জানেন না যে এই কোডগুলি এই সমস্ত প্রশিক্ষণের চাকার দ্বারা প্রতিবন্ধকতাযুক্ত। আমি কি বলতে পারি? তাদের পিআইসি দিয়ে এখন 2 গুণ ধীর সফ্টওয়্যার উপভোগ করুন! আরও বেশি, এলএলভিএম এর আবির্ভাবের সাথে সাথেই শিগগিরই জেআইটি (ম্যানেজড কোড) কার্যকর করা হবে, যার সাথে x86 ইনলাইন অ্যাসেমব্লিতে অ্যাক্সেস নেই, যা কোনও সি / সি ++ কোড আরও ধীর করে দেবে। "যারা সুরক্ষার জন্য স্বাধীনতা ত্যাগ করেন তারাও প্রাপ্য নয়।"


এটি কেবলমাত্র তথ্যের বিবৃতি: 10 বছর আগে পিকটি alচ্ছিক ছিল, তবে আজ এটি ডিফল্ট এবং বাধ্যতামূলক। আমি সন্দেহ করি যে নন-পিআইই কোডটি আরও ওএস রিলিজে সমর্থিত হবে। ঠিক যেমন উইন্ডোজ 9x এর পরে বাস্তব মোড সমর্থন বাদ দেওয়া হয়েছিল। সুতরাং পিআইসি ব্যবহার করার বা ব্যবহার না করার প্রশ্নটি তাত্ত্বিক কম্পিউটার বিজ্ঞানের বিষয় হয়ে ওঠে, যদি না আপনি কোনওভাবে নিজের ওএসটিকে আনলক করেন এবং এর জন্য সমর্থনটি সক্ষম না করেন। পিআইসি সম্পর্কে লোকেদের জানা সবচেয়ে গুরুত্বপূর্ণ বিষয়টি হ'ল এটি যথেষ্ট ধীর যে সংকলকরা এখন পর্যন্ত স্থির সংকলন সমর্থন করে না এবং বেশিরভাগ ডিএলএল এর স্থির সংস্করণ ছিল।
স্মাগলিসপুইনি 18

4
আপনার প্রথম দম্পতি বাক্যগুলি কেবলমাত্র সত্যের একটি বিবৃতি। বাকি মতামত, ষড়যন্ত্রের সীমানা।
মিচ লিন্ডগ্রেন

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

4
আমরা কি কোনও প্রোগ্রামিং ওয়েবসাইটে রাজনৈতিক অনুদান রাখতে পারি না দয়া করে আপনাকে ধন্যবাদ
রায়ান ম্যাক ক্যাম্পবেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.