ldd আমাকে বলে আমার অ্যাপটি "ডায়নামিক এক্সিকিউটেবল নয়"


17

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

কমান্ড লাইনে এটিই এক্সচেঞ্জ:

$ ./uclsyn_linux
Killed

$ ldd ./uclsyn_linux
not a dynamic executable

$ file ./uclsyn_linux
uclsyn_linux: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped

যে মেশিনটি চলছে, তাতে "ldd ./uclsyn_linux" নির্ভরতার পুরো তালিকাটি দেয়। আমি এই প্যাকেজগুলি পেয়েছি যা এই ভাগ করা লাইব্রেরি সরবরাহ করে এবং সেগুলি ইনস্টল করা উপস্থিত রয়েছে appear

প্রয়োজনীয় প্যাকেজগুলি

  • libSM-1.1.0-7.1.el6.i686
  • libX11-1.3-2.el6.i686
  • libgcc-4.4.6-3.el6.i386
  • glibc-2.12-1.47.el6_2.9.i686
  • libuuid-2.17.2-12.4.el6.i686
  • libXau-1.0.5-1.el6.i686
  • অ্যাপ্লিকেশনটিতে স্থানীয়ভাবে গ্রন্থাগারগুলির একটি গাদা রয়েছে যা আমি যাচাই করেছি এবং ইতিমধ্যে ইনস্টল করেছি।

আমার পরিবেশ

ভার্চুয়ালবক্সের অধীনে সেন্টোস চলছে

uname -a: লিনাক্স লোকালহোস্ট.লোকালডোমাইন 2.6.32-358.el6.i686 # 1 এসএমপি থু 21 ফেব্রুয়ারী 12:50:49 ইউটিসি 2013 i686 i686 i386 জিএনইউ / লিনাক্স


1
বন্য অনুমান: আপনি 32-বিট লাইব্রেরি ইনস্টল না করে 64৪-বিট ওএস-তে একটি 32-বিট বাইনারি চালানোর চেষ্টা করছেন।
মিচাস

এটি একটি 32-বিট বাইনারি, তবে আমি যে ওএস ইনস্টল করেছি সেটি হ'ল সেন্টোসের 32-বিট সংস্করণ। কমপক্ষে এটি কি uname- একটি কমান্ড আমাকে হ্যাঁ বলে?
কার্ল

3
@ কার্ল কৌতূহলের বাইরে, strace ./uclsynআউটপুট কী করে ? এটি আমাদের প্রথমে কী অনুপস্থিত তা সম্পর্কে একটি ইঙ্গিত দিতে পারে।
দীর্ঘমেয়াদে

@ লার্জজেট, এটি ফিরে আসে: সম্পাদন করুন ("./ uclsyn_linux", ["" ./uclsyn_linux "], [/ * 56 বছর * /] <অসম্পূর্ণ ...> +++ সিক্কিল +++ দ্বারা নিহত
কার্ল

@ কার্ল ঠিক আছে, সুতরাং এটি এমন বিন্দুতেও যায় না যেখানে এটি কিছু লাইব্রেরি লোড করার চেষ্টা করে। আমি আগে কখনও চেষ্টা করেছি এমন straceকোনও প্রোগ্রামের সাথে যা সঠিকভাবে লিঙ্ক করা হয়নি।
দীর্ঘমেয়াদে

উত্তর:


13

আমার কেবলমাত্র 32-বিট বাইনারি নিয়ে সমস্যা ছিল, সমাধানটি ছিল:

apt-get install gcc-multilib

$ uname -a
Linux bla 2.6.32-028stab094.3 #1 SMP Thu Sep 22 12:47:37 MSD 2011 x86_64 GNU/Linux

3
আপনি কীভাবে খুঁজে পেলেন যে এই লিবটি অনুপস্থিত ছিল?
ইয়াহুদাহ

1
এই সমাধানটি আমার পক্ষে কাজ করেছিল। +1
ফ্র্যাক্টালস্পেস

@ ইহুদাহগুলি আমি লিনাক্সে বেশ কিছু সময়ের জন্য প্রচুর প্রাক্পম্পাইল্ড 32 বিট অ্যাপ্লিকেশন চালিয়েছি প্লাস বিপরীত প্রকৃতির, তাই আমি শুটিংয়ের কিছু অভিজ্ঞতা সংগ্রহ করেছি। : ডি
লামা 12345

1
এটি আমার পক্ষে ভাল কাজ করার পাশাপাশি আমি কী করছিলাম তা আমার মাথা
চুলকানো

1
আমার জন্যও কাজ করে: ldd এমন কিছু খুঁজে পায়নি যেখানে এটি কাজ করে ^^
jy95

8

ভার্চুয়ালম্যাচিনে পর্যাপ্ত র্যাম না থাকার কারণে এখানে ত্রুটি হয়েছিল। রানিং strace ./programnameইঙ্গিত দেয় যে প্রোগ্রামটি যে কোনও লাইব্রেরি লোড করার আগে চলমান শুরু হওয়ার সাথে সাথেই মারা যাচ্ছিল। উপলব্ধ র‌্যামের পরিমাণ বাড়ানো নিশ্চিত করেছে যে প্রোগ্রামটি কাজ করতে পারে।

দরকারী প্রতিক্রিয়া

@Slm নামে অন্যদের কাছ থেকে কিছু দরকারী প্রতিক্রিয়া ছিল যারা প্রতিটি লাইব্রেরি আছে কিনা তা যাচাই করার জন্য দরকারী কমান্ড সরবরাহ করেছিল এবং straceকমান্ডটি চেষ্টা করার পরামর্শ দিয়েছিলেন @Lgeorget ।


5

আপনি কিছু লাইব্রেরি পোস্ট করতে পারেন যা এর সাথে লিঙ্কযুক্ত (মূল সিস্টেম থেকে)? আপনার কেবল কিছু অনুপস্থিত লাইব্রেরি ইনস্টল করার প্রয়োজন হতে পারে।

সাধারণত সেন্টোস সিস্টেমে এটি এমন একটি ইয়াম কমান্ড চালানোর বিষয় মাত্র:

yum install <package name>

আপনি যেমন মূল সিস্টেম থেকে পিছনে কাজ করতে পারেন:

$ ldd /bin/ls
    linux-vdso.so.1 =>  (0x00007fff519ff000)
    libselinux.so.1 => /lib64/libselinux.so.1 (0x00000034e8e00000)
    librt.so.1 => /lib64/librt.so.1 (0x00000034e8a00000)
    libcap.so.2 => /lib64/libcap.so.2 (0x0000003d6fe00000)
    libacl.so.1 => /lib64/libacl.so.1 (0x00000034fae00000)
    libc.so.6 => /lib64/libc.so.6 (0x00000034e7200000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00000034e7a00000)
    /lib64/ld-linux-x86-64.so.2 (0x00000034e6e00000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00000034e7e00000)
    libattr.so.1 => /lib64/libattr.so.1 (0x00000034f7600000)

যে আউটপুটে আপনি দেখতে পারেন যেখানে আমার কপি /bin/lsবলে উদাহরণস্বরূপ .so শেয়ার করা লাইব্রেরির গোছগাছ করা হয়, librt.so.1যা এখানে অবস্থিত হওয়া ঘটবে: /lib64/librt.so.1

আসল সিস্টেমে এটি জানার পরে, আপনি এই কমান্ডটি চালিয়ে যেতে পারেন কী প্যাকেজটি এই লাইব্রেরিটি সরবরাহ করে তা নির্ধারণ করতে:

$ rpm -qf /lib64/librt.so.1
glibc-2.13-2.x86_64

সুতরাং প্যাকেজ বলা হয় glibc-2.13-2.x86_64। সুতরাং এটি ইনস্টল করতে আপনি এটি করতে চাই:

$ sudo yum install glibc-2.13-2.x86_64

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

আপনি কি আপনার yum install <package>প্যাকেজগুলি আপনার প্রশ্নে উল্লেখ করেছেন?
slm

হ্যা, আমি করেছিলাম. এগুলি এখন libuuid.i686 ব্যতীত ইনস্টল করা ছিল যা এখন রয়েছে তবে আমার এখনও একই সমস্যা রয়েছে।
কার্ল

2

উত্তরটি আপনার প্রশ্নের উত্তর: আপনি এমন একটি অ্যাপ্লিকেশন চালানোর চেষ্টা করেছেন যা এক বছর আগে জিএনইউ / লিনাক্সের জন্য সংকলিত হয়েছিল এবং আপনি এটি নতুন লাইব্রেরি দিয়ে চালানোর চেষ্টা করছেন যা সম্ভবত সামঞ্জস্যপূর্ণ বা উপলভ্য নয়।

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


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

1
এটি স্ট্যাটিকালি লিঙ্কযুক্ত নয়, আউটপুটটি দেখুন file। এবং বার্তাগুলির মতো No package xyz foundপরামর্শ দেয় যে প্রয়োজনীয় গ্রন্থাগারগুলি আর উপলব্ধ নেই (কমপক্ষে, একই প্যাকেজগুলিতে সেভাবে ছিল না)। এ কারণেই আমি প্রোগ্রামটি পুনর্নির্মাণের পরামর্শ দিচ্ছি, যদি এটি সম্ভব হয়, বা এটি এমন কোনও সিস্টেমে চালিত করা হবে যেখানে এটি কাজ করার জন্য পরিচিত ছিল, পুরাতন লাইব্রেরি সহ।
দীর্ঘ আট

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

এটা ভুল. ঠিকানাগুলি পরিবর্তন করা মোটেই গুরুত্বপূর্ণ নয়। ফাংশনগুলি সরিয়ে ফেলা বা অন্যান্য এবিআই বিরতি লাইব্রেরির বড় রিভিশনগুলিতে ঘটে (যা বিরল) যার ক্ষেত্রে, আপনি যদি লাইবফু 2 ইনস্টল না করেন, আপনি লিবফু 3 ইনস্টল করেছেন কি না, আপনি libfoo2 লোড করার সময় ত্রুটি পাবেন।
psusi

ওকে, জেনে ভালো লাগলো. আমি ভেবেছিলাম যে একটি লাইব্রেরিতে যে কোনও পরিবর্তন লিঙ্কটি ভেঙে দিতে পারে। আমি বর্তমানে একটি ভেন্টু চালাচ্ছি এবং আমি যখন কোনও লাইব্রেরি আপগ্রেড করি তখন প্রায়শই বিপরীত নির্ভরতাগুলি পুনরায় কম্পাইল করতে হয়, তাই আমি মনে করি না যে লিঙ্কিংটি লাইব্রেরি পরিবর্তনের সাথে এত প্রতিরোধী ছিল।
দীর্ঘ

0

readelf -l uclsyn_linux প্রোগ্রামের দোভাষীকে অনুরোধ করার চেষ্টা আপনাকে কী অনুপস্থিত তা বলবে।


1
আমি readelf -l <file>একই lddআচরণ ( not a dynamic executable) দিয়ে একটি ফাইলের বিরুদ্ধে দৌড়েছি , তবে আমি অবিলম্বে কোনও অনুপস্থিত লাইব্রেরি ইঙ্গিত করে কিছু দেখছি না। আমি দেখতে Elf file type is EXEC (Executable file), Entry point, Program Headersএবং Section to Segment mapping। আউটপুটটিতে আমার ঠিক কী সন্ধান করা উচিত?
স্টকবি

0

ইন আর্চ লিনাক্স , যদি ফাইল 32 বিট পরী হয়, তাহলে আপনি ইনস্টল করতে পারেন lib32-জিসিসি-লিব (multilib সংগ্রহস্থল থেকে) সমস্যা সমাধানের জন্য।

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