এসও (ভাগ করা অবজেক্ট) নম্বরগুলি কীভাবে কাজ করবে?


123

আমি জানি যে লিনাক্সের অধীনে ভাগ করা অবজেক্টগুলি "তাই সংখ্যা" ব্যবহার করে, অর্থাত্ একটি ভাগ করা অবজেক্টের বিভিন্ন সংস্করণকে বিভিন্ন এক্সটেনশন দেওয়া হয়, উদাহরণস্বরূপ:

  • example.so.1
  • example.so.2

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

আমি সন্দেহ করি এটি এর সাথে সম্পর্কিত ldconfigতবে আমি কীভাবে তা নিশ্চিত নই।

উত্তর:


87

বাইনারিরা নিজেই জানে যে তারা কোন ভাগ করা লাইব্রেরির কোন সংস্করণ নির্ভর করে এবং এটি বিশেষভাবে অনুরোধ করে। lddনির্ভরতা দেখাতে আপনি ব্যবহার করতে পারেন ; আমার জন্য ls:

$ ldd /bin/ls
    linux-gate.so.1 =>  (0xb784e000)
    librt.so.1 => /lib/librt.so.1 (0xb782c000)
    libacl.so.1 => /lib/libacl.so.1 (0xb7824000)
    libc.so.6 => /lib/libc.so.6 (0xb76dc000)
    libpthread.so.0 => /lib/libpthread.so.0 (0xb76c3000)
    /lib/ld-linux.so.2 (0xb784f000)
    libattr.so.1 => /lib/libattr.so.1 (0xb76bd000)

যেহেতু আপনি দেখতে পারেন, এটা যেমন স্থানটিকে libpthread.so.0শুধু না libpthread.so


প্রতীকী লিঙ্কটির কারণ লিঙ্কারের জন্য। আপনি libpthread.soসরাসরি বিরুদ্ধে লিঙ্ক করতে চাইলে , আপনি gccপতাকাটি দেন -lpthreadএবং এটি স্বয়ংক্রিয়ভাবে libউপসর্গ এবং .soপ্রত্যয়টি যুক্ত করে। আপনি এটিকে .so.0প্রত্যয় যুক্ত করতে বলতে পারবেন না , সুতরাং প্রতীকী লিঙ্কটি লাইবটির নতুন সংস্করণে নির্দেশ করে যাতে এটি সহজ হয়


সমান চিহ্ন "= ls" উপস্থিত থাকা উচিত নয়। কেবল "এলডিডি এলএস" ব্যবহার করুন
বামাকনফটন

1
@ বিম্যাকনফটন সম্ভবত এটি আপনাকে একটি ত্রুটি দেবে কারণ কার্যকর করার lddজন্য সম্পূর্ণ পথের প্রয়োজন। =ls
জেডএসে

মজাদার. আমি উবুন্টুতে বাশ চালাচ্ছি এবং মনে হচ্ছে এটি পুরো পথ ছাড়াই কাজ করবে। ব্যাখ্যার জন্য ধন্যবাদ - আমি zsh ব্যবহার করি না।
বমাকনফটন

60

ভাগ করা লাইব্রেরিতে নম্বরগুলি একটি লাইব্রেরির এপিআই সনাক্ত করতে লিনাক্সে ব্যবহৃত কনভেনশন হয়। সাধারণত বিন্যাসটি হ'ল:

libFOO.so.MAJOR.MINOR

এবং আপনি যেমন লক্ষ্য করেছেন সাধারণত libFOO.so থেকে libFOO.so.MAJOR.MINOR এর জন্য একটি প্রতীকী লিঙ্ক রয়েছে। ldconfig এই লিঙ্কটিকে নতুন সংস্করণে আপডেট করার জন্য দায়বদ্ধ।

মূলত এপিআই পরিবর্তিত হলে (নতুন প্রবেশের পয়েন্টগুলি সরানো হয় বা পরামিতি বা প্রকার পরিবর্তন করা হয়) সাধারণত বাড়ানো হয়। মাইনরটি সাধারণত বাগ ফিক্স রিলিজের জন্য বা নতুন এপিআই চালু করা হয় যখন বিদ্যমান এপিআইগুলি না ভাঙ্গিয়ে প্রবর্তন করা হয়।

আরও বিস্তৃত আলোচনা এখানে পাওয়া যাবে: ভাগ করা লাইব্রেরিগুলি বিচ্ছিন্ন করা


হাই মিগুয়েল, এর জন্য ধন্যবাদ, লজ্জা আমি দুটি উত্তর গ্রহণ করতে পারি না কারণ এটি উপরেরটিকে সুন্দরভাবে পরিপূরক করে। আমার কাছ থেকে +1, দুর্দান্ত লিঙ্কটিও আবার ধন্যবাদ!

4
এটি প্রায় সঠিক, তবে এটি আসলে libFOO.so.MAJOR.MINOR(শেষ পর্যন্ত নয়)
জনি জেডি

6
এই উত্তর তাই ভুল । প্রথমত, আপনি যে নম্বরগুলি দেখছেন সেগুলির এপিআইয়ের সাথে কোনও সম্পর্ক নেই, এগুলি নিখুঁতভাবে এবিআই। দ্বিতীয়ত, এখানে কনভেনশনটি আপনার পরামর্শ মতো উত্তর দেওয়ার মতো সমস্ত শব্দার্থক সংস্করণ নয়। বরং এটি একটি লাইবটোল কনভেনশন যার একটি একক লাইব্রেরি সংস্করণ সংখ্যার সাথে ম্যাপিংয়ের দুর্দান্ত সম্পত্তি রয়েছে যা ld.so তুলনা করতে পারে (আরও তথ্যের জন্য gnu.org/software/libtool/manual/html_node/… দেখুন)
নিউবিজেড

23

ভাগ করা গ্রন্থাগারগুলি নিম্নলিখিত স্কিম অনুযায়ী সংস্করণ করা উচিত:

blah.so.X.Y.Z

কোথায়

  • এক্স = পিছনের দিকে অসম্পূর্ণ এবিআই প্রকাশ
  • Y = পিছনের দিকে সামঞ্জস্যপূর্ণ এবিআই রিলিজ
  • জেড = কেবলমাত্র অভ্যন্তরীণ পরিবর্তন - এবিআই-তে কোনও পরিবর্তন নেই

সাধারণত আপনি কেবল প্রথম অঙ্কটি দেখতে পান hello.so.1কারণ অন্যান্য অঙ্কগুলি পিছনের দিকে সামঞ্জস্যপূর্ণ হওয়ায় প্রথম সংখ্যাটি লাইব্রেরির "সংস্করণ" চিহ্নিত করার জন্য প্রয়োজনীয় জিনিস।

ldconfigকোনও সিস্টেমে কী ভাগ করা গ্রন্থাগার পাওয়া যায় তার একটি টেবিল বজায় রাখে এবং যেখানে সেই লাইব্রেরির পাথ বিদ্যমান। আপনি এটি চালিয়ে যাচাই করতে পারেন:

ldconfig -p

রেড হ্যাটের মতো কোনও প্যাকেজ তৈরি করা হলে, বাইনারিতে ডেকে আনা অংশীদারি লাইব্রেরিগুলি অনুসন্ধান করা হবে এবং আরপিএম তৈরির সময় প্যাকেজের নির্ভরতা হিসাবে যুক্ত করা হবে। অতএব, আপনি যখন প্যাকেজ ইনস্টল করতে যান, ইনস্টলারটি hello.so.1পরীক্ষা করে সিস্টেমে ইনস্টল করা আছে কি না তা অনুসন্ধান করবে ldconfig

আপনি এই জাতীয় কিছু করে কোনও প্যাকেজের নির্ভরতা দেখতে পাচ্ছেন:

rpm -qpR hello.rpm

এই সিস্টেমটি (উইন্ডোজের বিপরীতে) hello.soকোনও সিস্টেমে একাধিক সংস্করণ ইনস্টল করার অনুমতি দেয় এবং একই সাথে বিভিন্ন অ্যাপ্লিকেশন দ্বারা ব্যবহৃত হতে পারে।


আমি মনে করি এটি সেরা উত্তর।
কেমিন চাউ

1
ভাগ করা গ্রন্থাগারগুলি নিম্নলিখিত স্কিম অনুযায়ী সংস্করণ করা উচিত (…) - আপনি এই বিবৃতি জন্য রেফারেন্স প্রদান করতে পারেন?
পিয়োটার ডব্রোগোস্ট

19

libNAME.so হ'ল ফাইল-নাম সংকলক / লিঙ্কার দ্বারা ব্যবহৃত হয় যখন প্রথমে -lNAME দ্বারা নির্দিষ্ট কোনও লাইব্রেরি সন্ধান করার সময়। একটি ভাগ করা লাইব্রেরি ফাইলের অভ্যন্তরে সোনাম নামক একটি ক্ষেত্র। এই ক্ষেত্রটি সেট করা হয় যখন বিল্ডিং প্রক্রিয়া দ্বারা লাইব্রেরি নিজেই প্রথম কোনও ভাগ করা বস্তুর (তাই) সাথে লিঙ্ক হয়। এই সোনাম আসলে এটিই যা ভাগ করা বস্তুর উপর নির্ভর করে একটি এক্সিকিউটেবলের মধ্যে কোনও লিঙ্কার সঞ্চয় করে। সাধারণত সোনামটি libNAME.so.MAJOR আকারে থাকে এবং যেকোন সময় পরিবর্তিত হয় যে কোনও সময় গ্রন্থাগার এটির সাথে যুক্ত থাকা এক্সিকিউটেবলের সাথে বেমানান হয়ে যায় এবং লাইব্রেরির দুটি বড় সংস্করণ প্রয়োজন অনুসারে ইনস্টল করা যেতে পারে (যদিও শুধুমাত্র একটিটিকে বিকাশের দিকে নির্দেশ করা হবে) এছাড়াও লাইব্রেরির ছোটখাট সংস্করণগুলির মধ্যে সহজেই আপগ্রেড করার পক্ষে, libNAME.so.MAJOR সাধারণত libNAME.so.MAJOR.MINOR এর মতো কোনও ফাইলে একটি লিঙ্ক। একটি নতুন গৌণ সংস্করণ ইনস্টল করা যায় এবং একবার সম্পূর্ণ হয়ে গেলে, পুরানো গৌণ সংস্করণটির লিঙ্কটি আপলোডকৃত লাইব্রেরিটি ব্যবহার করার জন্য সমস্ত নতুন মৃত্যুদণ্ড কার্যকর করার জন্য অবিলম্বে নতুন গৌণ সংস্করণটির দিকে ইঙ্গিত করতে পারে। এছাড়াও, আমার উত্তর দেখুনলিনাক্স, জিএনইউ জিসিসি, এলডি, সংস্করণ স্ক্রিপ্ট এবং ইএলএফ বাইনারি ফর্ম্যাট - এটি কীভাবে কাজ করে?

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