লিনাক্স, গনুহ জিসিসি, LD, সংস্করণ স্ক্রিপ্ট এবং ELF বাইনারি ফর্ম্যাটে - কিভাবে এটা কাজ করে?


13

লিনাক্স মধ্যে গ্রন্থাগার সংস্করণ এবং কিভাবে এটি সমস্ত কাজে ব্যবহার করা সম্পর্কে আরও জানতে চেষ্টা করছি। এখানে প্রসঙ্গে:

-, আমি যা ইন্টারফেসগুলি একই সেট এক্সপোজ একটি গতিশীল লাইব্রেরি দুটি সংস্করণ আছে libsome1.soএবং libsome2.so

- একটি আবেদন বিরুদ্ধে লিঙ্ক করা হয় libsome1.so

- এই অ্যাপ্লিকেশনটি ব্যবহারের libdl.soপরিবর্তনশীল অন্য মডিউল লোড করতে বলে libmagic.so

- এখন libmagic.soবিরুদ্ধে লিঙ্ক করা হয়েছে libsome2.so। স্পষ্টতই, লিংক স্ক্রিপ্টগুলি ব্যবহার না করে প্রতীকগুলি লুকানোর জন্য libmagic.so, রান-টাইমে ইন্টারফেসের সমস্ত কলগুলি libsome2.soসমাধান হয়ে যায় libsome1.solibVersion()ম্যাক্রোর মানটির বিপরীতে ফিরিয়ে দেওয়া মানটি পরীক্ষা করে এটি নিশ্চিত করা যায় LIB_VERSION

- তাই আমি এবং কম্পাইল করার পরবর্তী লিঙ্কে চেষ্টা libmagic.soএকটি linker স্ক্রিপ্ট 3 ছাড়া সমস্ত চিহ্ন যা সংজ্ঞায়িত করা হয় লুকায় সঙ্গে libmagic.soএবং এটির রপ্তানি করা হয়। এই কাজ ... বা অন্তত libVersion()এবং LIB_VERSIONমান মেলে (এবং সংস্করণ 2 না 1 রিপোর্ট)।

- তবে, যখন কিছু ডেটা স্ট্রাকচার ডিস্কে ধারাবাহিকভাবে হয়, আমি কিছু দুর্নীতির লক্ষ্য। অ্যাপ্লিকেশানের ডিরেক্টরির মধ্যে যদি আমি মুছতে libsome1.soএবং বিন্দু তার জায়গায় একটি নরম লিঙ্ক তৈরি libsome2.so, সবকিছু যে কাজ করছে বলে আশা করা এবং একই দুর্নীতির ঘটে না।

আমি কিন্তু সাহায্য মনে করেন যে, এই চিহ্ন রান-টাইম linker এর রেজোলিউশনের কিছু বিবাদের কারণে কারণে হয়ে থাকতে পারে করতে পারবে না। আমি অনেক কিছু চেষ্টা করেছি লিংক বের করার চেষ্টা মত, libsome2.soযাতে সব চিহ্ন alised হয় symbol@@VER_2(যা আমি এখনও কারণ কমান্ড সম্পর্কে বিভ্রান্ত করছি nm -CD libsome2.soএখনো তালিকা প্রতীক symbolএবং symbol@@VER_2) ... কিছুই কাজ বলে মনে হয় !!! সাহায্য !!!!!!


আপনার শেষ পদ্ধতির একটাই আমি দিয়ে শুরু করেছিলাম। এবং আমি সম্মত হন যে দুর্নীতি সম্ভবত কিছু প্রতীক বিভ্রান্তি রয়েছে। দুঃখের বিষয় আমার কাছে আপনার কাছে কোনও উত্তর নেই।
RobotHumans

যদিও tbh আমি এটা যথেষ্ট বুঝতে পারছি না নিশ্চিত হয়ে বলতে এই তাই ভালো করতে পারে,। আপনি কি এটি সরাতে চান তাহলে এটা পতাকা।
xenoterracide

1
ব্যবহার করে দেখুন RTLD_LOCALএবং RTLD_DEEPBINDআপনি অ্যাপ্লিকেশন dlopen পতাকা। আমার এখনই এটি পরীক্ষা করার সময় নেই তবে এটি ম্যানপেজের ভিত্তিতে কাজ করা উচিত।
stribika

উত্তর:


13

এটি ঠিক আপনার প্রশ্নের উত্তর দিতে না, কিন্তু ...

প্রথম সব, ELF এক্সিকিউটেবল ফাইল (প্রোগ্রাম), ভাগ লাইব্রেরি, এবং অবজেক্ট ফাইলগুলি যা মধ্যবর্তী ফাইল যখন সফ্টওয়্যার সংকলন পাওয়া তাদের জন্য লিনাক্স দ্বারা স্পেসিফিকেশন ব্যবহার। অবজেক্ট ফাইলগুলি ণ শেষ, ভাগ লাইব্রেরি সঙ্গে .so শূন্য বা তার বেশি সংখ্যার দ্বারা অনুসরণ সময়সীমার দ্বারা পৃথক শেষ, এবং এক্সিকিউটেবল ফাইলের যেকোনো এক্সটেনশন স্বাভাবিকভাবে হবে না।

সেখানে সাধারণত তিনটি ধরন একটি ভাগ লাইব্রেরি নাম হয়, প্রথম ফর্ম কেবল .so শেষ হয়ে যাবে। উদাহরণস্বরূপ, একটি গ্রন্থাগার readline নামক, / usr / local / lib স্বাভাবিকভাবে libreadline.so নামক একটি ফাইলে সংরক্ষণ করা হয় এবং / liberal এর সংক্ষিপ্ত রূপ, / usr / lib এক অধীনে অবস্থিত, বা। ল্যাডলাইন লাইনের মতো বিকল্পের সাহায্যে সফ্টওয়্যার সংকলন করার সময় এই ফাইলটি অবস্থিত। -l নিম্নলিখিত লাইব্রেরির সাথে লিঙ্ক কম্পাইলার বলে। লাইব্রেরি সময়ে সময়ে পরিবর্তন কারণ, এটা অচল হয়ে করতে পারে, তাই লাইব্রেরি কিছু SONAME নামক এম্বেড করুন। readline জন্য SONAME libreadline দ্বিতীয় সংস্করণ প্রধান সংস্করণ জন্য libreadline.so.2 মত চেহারা হতে পারে। এছাড়া যে সামঞ্জস্যপূর্ণ এবং সফটওয়্যার প্রয়োজন হয় না recompiled করা readline অনেক ছোটখাট সংস্করণ হতে পারে। readline একটি গৌণ সংস্করণে libreadline.so.2.14 নামে হতে পারে। সাধারণত libreadline। তাই এই ক্ষেত্রে readline সাম্প্রতিকতম প্রধান সংস্করণ, libreadline.so.2 মাত্র একটি সিম্বলিক লিঙ্ক। libreadline.so.2 এছাড়াও libreadline.so.2.14 করার জন্য একটি সিম্বলিক লিঙ্ক যা আসলে ফাইল ব্যবহার করা হচ্ছে না।

একটি লাইব্রেরির SONAME গ্রন্থাগার ফাইল নিজে এর ভিতরে এমবেড করা হয়। ফাইল libreadline.so.2.14 ভিতরে কোথাও স্ট্রিং libreadline.so.2 হয়। যখন একটি প্রোগ্রাম কম্পাইল এবং readline সাথে সংযুক্ত করা হয়, এটা ফাইল libreadline.so জন্য চেহারা এবং SONAME এটা এমবেড পড়বে। পরবর্তীতে, যখন প্রোগ্রাম আসলে মৃত্যুদন্ড কার্যকর করা হয়, এটা libreadline.so.2 লোড করা হবে, শুধু libreadline.so, যেহেতু যে SONAME যে যখন এটি প্রথম লিঙ্ক সেই ভাবেই পড়ে শোনালেন হয়েছিল। এটি একটি সিস্টেম readline ইনস্টল একাধিক বেমানান সংস্করণ করতে পারবেন, এবং প্রতিটি প্রোগ্রাম উপযুক্ত প্রধান সংস্করণ এটির সাথে লিঙ্ক করা হয় লোড করা হবে। এছাড়াও, যখন আপগ্রেড readline, বলো, 2.17, আমি শুধু libreadline.so.2.17 বিদ্যমান গ্রন্থাগার পাশাপাশি ইনস্টল করতে পারেন, এবং একবার আমি libreadline.so.2.17 করার libreadline.so.2.13 থেকে সিম্বলিক লিঙ্ক libreadline.so.2 সরানো,

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