একটি 64-বিট সিস্টেমে 32-বিট বাইনারি চালানোর সময় "পাওয়া যায় না" বার্তা পাওয়া


70

ডেবিয়ান (হুইজি / এএমডি 64) নিয়ে আমার বর্তমানে একটি অদ্ভুত সমস্যা রয়েছে।

আমি একটি সার্ভার ইনস্টল করার জন্য একটি ক্রোট তৈরি করেছি (আমি এ সম্পর্কে আরও বিস্তারিত জানাতে পারি না, দুঃখিত)। আসুন এর পথ কল /chr_path/। জিনিসগুলি সহজ করে তোলার জন্য, আমি এই ক্রুটটি একটি ডেবিউটস্ট্র্যাপ (এছাড়াও হুই / এমডি 64) দিয়ে শুরু করেছি।

সবার মনে হবে ক্রুটের অভ্যন্তরে ভাল কাজ করা হয়েছে তবে আমি যখন আমার সার্ভারটির ইনস্টলার স্ক্রিপ্টটি শুরু করেছি তখন পেয়েছিলাম: zsh: Not found /some_path/perl(কিছু কারণে ইনস্টলার একটি পার্ল বাইনারি অন্তর্ভুক্ত করে)

স্বাভাবিকভাবেই, আমি /some_path/অবস্থানটি যাচাই করেছিলাম এবং আমি "পার্ল" বাইনারি পেয়েছি। fileক্রুট পরিবেশে ফিরে:

/some_path/perl ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped

ফাইলটি বিদ্যমান, ঠিক আছে বলে মনে হচ্ছে, এর সঠিক অধিকার রয়েছে। আমি ব্যবহার করতে পারেন file, ls, vimএটা কিন্তু যত তাড়াতাড়ি আমি চেষ্টা এটি চালানো - ./perlউদাহরণস্বরূপ - আমি পাবেন: zsh: Not found ./perl

এই পরিস্থিতি আমার পক্ষে যথেষ্ট বোধগম্য। অধিকন্তু:

  • আমি ত্রুটি না পেয়ে ক্রোটে অন্যান্য বেসিক বাইনারি (/ বিন / এলএস, ...) সম্পাদন করতে পারি
  • এই প্রকল্পটি নিয়ে আসা অন্যান্য বাইনারিগুলির ক্ষেত্রে আমারও একই সমস্যা
  • আমি যখন মূল মূল ( /chr_path/some_path/perl) থেকে বাইনারি কার্যকর করার চেষ্টা করি তখন এটি কার্যকর হয় ।
  • আমি আমার একটি অনুলিপি বাইনারি রাখার চেষ্টা করেছি ls। আমি যাচাই করেছিলাম যে অ্যাক্সেসের অধিকারগুলি সমান ছিল তবে এতে কোনও পরিবর্তন হয়নি (এক কাজ করছিল, এবং অন্যটি ছিল না)

1
এটি অপটওয়্যার ইনস্টলড বাইনারিগুলিতে "এই জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই" হিসাবে একই সমস্যা । মনে রাখবেন যে আপনার পার্ল একটি 32-বিট এক্সিকিউটেবল। আপনি 32-বিট রানটাইম সিস্টেম ( libc6-i386প্যাকেজ, বা ia32-libsআপনি যদি অনেক লাইব্রেরি চান তবে) মিস করছেন ।
গিলস

@ গিলস: অনেক ধন্যবাদ! একটি প্রবণতা ইনস্টল করুন ia32-libs সমস্যার সমাধান করেছে !! আমি দেখেছিলাম যে পার্লটি 32 বিট ছিল তবে যেহেতু এটি মূল সিস্টেমে কাজ করছে (একই বিতরণ) আমি সবেমাত্র ধরে নিয়েছি এটি লিঙ্কযুক্ত নয়। আসলে, আমি অবশ্যই কোনও সময়ে প্রধান সিস্টেমে 32-বিট রানটাইম সিস্টেমটি ইনস্টল করে রেখেছি।
এলেনেহার

1
@ গিলস: আমার মনে হয় আমি এটিকে একটি সদৃশ প্রশ্ন হিসাবে চিহ্নিত করার পরিবর্তে একটি সংক্ষিপ্ত উত্তর হিসাবে যুক্ত করব। পরিবেশটি যথেষ্ট আলাদা যে সমস্যাটি একই হলেও সন্ধানকারী লোকেরা একে অপরকে আঘাত করার সম্ভাবনা বেশি থাকে।
কালেব

1
@ কালেব আমরা ঠিক সেই কারণেই সদৃশগুলি মুছব না; অনুসন্ধানকারীরা যা এটির সন্ধান করে তারা কেবলমাত্র অন্য পোস্টের নকল লিঙ্কটি অনুসরণ করবে। যদি এটি একই সমস্যা হয় তবে এটি সম্ভবত কেবল বন্ধ করা উচিত
মাইকেল মরোজেক

@ মিশেলমরোজেক আমি এই প্রশ্নে আমার মন পরিবর্তন করেছি: যদিও অন্তর্নিহিত সমস্যাটি একই, কংক্রিটের প্রতিকারটি কিছুটা আলাদা (এক ক্ষেত্রে এআরএম এবিআই মিশ্রণ নয়, অন্যটিতে একটি এমডি 64 লিনাক্স বিতরণে 32-বিট সমর্থন সক্ষম করে) । সুতরাং আমি অনুমান করি যে এই প্রশ্নটি সর্বোপরি উন্মুক্ত।
গিলস

উত্তর:


72

আপনি যখন কোনও "লোডার" এর উপর নির্ভর করে এমন একটি ফাইল নির্বাহ করতে ব্যর্থ হন, আপনি যে ত্রুটিটি পান সেটি আপনি চালাচ্ছেন এমন ফাইলের পরিবর্তে লোডারকে বোঝাতে পারে।

  • গতিশীলভাবে সংযুক্ত নেটিভ এক্সিকিউটেবলের লোডার সিস্টেমটির সেই অংশ যা গতিশীল লাইব্রেরিগুলি লোড করার জন্য দায়ী। এটি কিছু /lib/ld.soবা এর মতো /lib/ld-linux.so.2এবং এটি এক্সিকিউটেবল ফাইল হওয়া উচিত।
  • একটি স্ক্রিপ্টের লোডার হ'ল শিবাং লাইনে উল্লিখিত প্রোগ্রাম, যেমন /bin/shকোনও স্ক্রিপ্ট যা শুরু হয় #!/bin/sh। (বাশ এবং জ্যাশ এই ক্ষেত্রে "কমান্ড পাওয়া যায় নি" পরিবর্তে "খারাপ দোভাষী" একটি বার্তা দেয়))

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

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

আপনি যখন সঠিক সিস্টেমের (বা সিস্টেমের পরিবার) এবং আধিকারিকের জন্য ভুল বাইনারি চালানোর চেষ্টা করেন তবে ভুল subarchitecture ভুল হয় যখন এই অবস্থা প্রায়শই দেখা দেয়। এখানে আপনার কাছে ELF বাইনারি রয়েছে এমন একটি সিস্টেমে যা ELF বাইনারিগুলি প্রত্যাশা করে, তাই কার্নেল এগুলিকে ঠিক জরিমানা করে। তারা x38_64 প্রসেসরের উপর চলছে i386 বাইনারি, সুতরাং নির্দেশিকাগুলি বোধগম্য হয় এবং প্রোগ্রামটি এমন পর্যায়ে পৌঁছে দেয় যেখানে এটি তার লোডারটি সন্ধান করতে পারে। তবে প্রোগ্রামটি 32-বিট প্রোগ্রাম (যেমন fileআউটপুট নির্দেশ করে) 32 32-বিট লোডার খুঁজছে /lib/ld-linux.so.2এবং আপনি সম্ভবত সম্ভবত ক্রুটে 64-বিট লোডার ইনস্টল করেছেন /lib64/ld-linux-x86-64.so.2

ক্রুটে আপনাকে 32-বিট রানটাইম সিস্টেমটি ইনস্টল করতে হবে: প্রোগ্রামগুলি প্রয়োজনীয় লোডার এবং সমস্ত লাইব্রেরি। ডিবিয়ান হুইজি থেকে আপনি যদি i386 এবং x86_64 উভয় সমর্থন চান তবে একটি এমডি 64 ইনস্টলেশন শুরু করুন এবং মাল্টারার্ক সমর্থন সক্রিয় করুন : dpkg --add-architecture i386তখন চালান apt-get updateএবং apt-get install libc6:i386 zlib1g:i386 …(আপনি যদি দেবিয়ান পার্ল প্যাকেজের নির্ভরতার তালিকা তৈরি করতে চান তবে দেখুন যে লাইব্রেরিগুলি সম্ভবত রয়েছে প্রয়োজন হবে, আপনি ব্যবহার করতে পারেন aptitude search -F %p '~Rdepends:^perl$ ~ri386')। আপনি ia32-libsপ্যাকেজ ইনস্টল করে সাধারণ লাইব্রেরির একটি সংগ্রহ করতে পারেন (আপনাকে প্রথমে মাল্টিআরচ সমর্থন সক্ষম করতে হবে)। দেবিয়ান এমডি 64 তে হুইজি পর্যন্ত, 32-বিট লোডার libc6-i386প্যাকেজে রয়েছে। আপনি ইনস্টল করে 32-বিট লাইব্রেরির একটি বড় সেট ইনস্টল করতে পারেন ia32-libs


এটিই কি একমাত্র জিনিস যা ত্রুটি বার্তাকে ট্রিগার করতে পারে? আমি 32-বিট লাইব্রেরি ইনস্টল করেছি এবং এর ফলাফল এখানে এসেছেldd তবে আমি এখনও একই ত্রুটি পেয়েছি।
নাথান ওসমান


আমি ইনস্টল করার চেষ্টা করেছি lsb-coreকিন্তু এটি কোনওরকম সাহায্য করবে বলে মনে হচ্ছে না। আমি মনে করি এটির জন্য আমি আরও একটি নতুন প্রশ্ন খুলি।
নাথান ওসমান

এর জন্য আপনাকে ধন্যবাদ, আপনি মাত্র দু'দিনের মাথা চুলকানো শেষ করেছেন। আমি ভেবেছিলাম সব কিছু স্থিতিশীলভাবে সংকলিত হচ্ছে তবে তা হয়নি!
ফিন O'leary

5

ldd(1)আপনার perlবাইনারি চালান । প্রায়শই Not foundএকটি ফাইলটিতে আপাতদৃষ্টিতে বিভ্রান্তিকর ত্রুটি যা স্পষ্টভাবে উপস্থিত থাকে কারণ প্রোগ্রাম দ্বারা ব্যবহৃত ভাগ করা লাইব্রেরিগুলির একটি খুঁজে পাওয়া যায় নি।

সুতরাং এটি সম্ভব যে আপনার বাইনারিগুলির দ্বারা প্রয়োজনীয় ভাগ করা লাইব্রেরিগুলি সম্পর্কিত আপনার ক্রুট অসম্পূর্ণ।


আসলে আমি পাই: perl is not a dynamic executableযখন আমি ক্রুটে থাকি এবং বাইরে থেকে নির্ভরতার সঠিক তালিকা পাই। আমি বর্তমানে পরীক্ষা করছি যে এখানে কিছু অদ্ভুত আছে কিনা তবে আমি এই ধরণের অভাব এড়াতে একটি ডিবুস্ট্র্যাপ ব্যবহার করেছি এবং ইতিমধ্যে অনেকগুলি স্তূপ রয়েছে (ক্রোট সিস্টেমে একটি পার্ল কার্যকর রয়েছে যা ভালভাবে চলে তবে এটি একটি আলাদা সংস্করণ; সম্ভবত আমি কিছু করব প্রতীকী লিংক?)
এলেনেহার

সত্যি কথা বলতে কি আমি ডিবুটস্ট্র্যাপের কাছে একটি সম্পূর্ণ ক্রুট তৈরির প্রত্যাশা করতাম, তাই আমি আমার উত্তরটি সে ক্ষেত্রে সঠিকভাবে প্রত্যাশা করব না। তবে আমি হারিয়ে যাওয়া গ্রন্থাগারটি ক্রুট সমস্যার আগে চালিয়েছি তাই আমি ভেবেছিলাম আমার উত্তরটি উড়ে যায় কিনা।
ক্যাম

cf. গিলসকে মূল পোস্টে মন্তব্য: আপনারা ঠিক বলেছেন। কিছু libs অনুপস্থিত ছিল। ডিবুটস্ট্র্যাপের মূল সুবিধাটি হ'ল আমি একটি বেসিক অ্যাপটিটিউড ইনস্টল দিয়ে সমস্যাটি সমাধান করতে পারলাম :)
এলেনার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.