লিনাক্সে নির্ধারিত হয়।। একটি গ্রন্থাগার / সংরক্ষণাগার 32-বিট বা 64-বিট?


87

আমরা লিনাক্সে 64৪-বিট এবং 32-বিট উভয় সংস্করণে একটি স্ট্যাটিক লিব বিতরণ করি। কোনও গ্রাহককে সমস্যা সমাধানের সময়, আমি আমার ডায়াগনস্টিক শেল স্ক্রিপ্টটি 32 বা 64 বিট কিনা তা সনাক্ত করার জন্য .a সংরক্ষণাগার ফাইলটি পরীক্ষা করে সমস্যাটি দ্রুত সরিয়ে দিতে চাই। আমার কাছে যে পদ্ধতিগুলি ঘটে সেগুলি মার্জিতের চেয়ে কম নয়:

  1. একটি .o সদস্য আহরণ করুন এবং "ফাইল" কমান্ড জিজ্ঞাসা করুন (যেমন, ELF 32-বিট ইত্যাদি)

  2. কোডটিযুক্ত ডামি সদস্য সহ সূচনা করুন, উদাহরণস্বরূপ 32bit.o / 64bit.o এবং চেক করতে "আর-টি" ব্যবহার করুন

আমি "স্ট্রিং xyz.a | গ্রেপ 32" চেষ্টা করেছি তবে সংস্করণে এটি ভাল কাজ করে না। হার্টব্রেকার সমস্যা নয়, তবে আপনি যদি একটি মার্জিত সমাধান সম্পর্কে জানেন তবে আমি জানতে চাই।


আমি সম্পর্কে জানতে stackoverflow.com/questions/184502/... , একটি ভাল soln খুঁজছেন।
সিভিএসডেভ

4
অন্য প্রশ্নের সমাধানটি বেশ ঝরঝরে সমস্যার সমাধান করছে বলে মনে হচ্ছে তবে একটি দ্রুত উপায় হল এনএম foo.a | গ্রেপ '^ 0' | মাথা -1 | ডাব্লুসিসি -সি - ফলাফল যদি 17 (16 + 1 == 8 লাইট ফেরতের জন্য + 1 চার্জ) হয় তবে এটি 64 বিট, যদি 9 হয় তবে এটি 32 বিট (8 + 1 == 4 বাইটস + 1 চার্ট লাইন ফেরতের জন্য)
পিটেশ

আমি যদি 14 পেতে পারি? o_0
Almo

উত্তর:


123

objdump সেরা উপায় মত মনে হচ্ছে:

objdump -f libfoo.a | grep ^architecture

4
fileপড়ার জন্য সহজ নীচে বিবৃত হয় stackoverflow.com/a/8909086/233906
Cerber

4
আমি পেয়েছি architecture: i386:x86-64, flags 0x00000039:.. এর মানে কি এই দুটোই ..? এটা অসম্ভব। দয়া করে সহায়তা করুন: ডি
গ্রেওল্ফ

10
@ প্যালাদিন: এটি bit৪ বিট - x86 আর্কিটেকচারগুলি অ্যাজডাম্প দ্বারা বর্ণনা করেছেন i386(সমতল পুরাতন আইএ 32 ), i386:x86-64(এএমডি 64) এবং i386:x64-32(এক্স 32 32-বিট-ঠিকানা-স্পেস-ইন-লং-মোড আর্কিটেকচার)।
ক্যাফে

4
'ইজজডাম্প' -র পতাকা '-f' লাইব্রেরির সামগ্রিক ফাইল শিরোনাম 'libfoo.a' বিষয়বস্তু প্রদর্শন করতে নির্দিষ্ট করে। 'অবজডাম্প' থেকে এই আউটপুটটি গ্রেপ কমান্ডে পাইপ করা হয় যা 'আর্কিটেকচার' শব্দের সন্ধান করে। '^' অক্ষরটি বোঝায় যে 'আর্কিটেকচার' লাইনটি শুরু করা উচিত।
লুক Purnell

4
এটি পরিষ্কার করুন এবং objdump -f lib.a | grep ^architecture | cut -d' ' -f-2 | sort -u
দ্বিধাগুলি

33

সবচেয়ে সহজ উপায় হ'ল ফাইল কমান্ড ব্যবহার করা।

$file <.so file or .a file>

31
এমএসএস পরিবেশে এটি কেবল প্রতিধ্বনি <ফাইল>: বর্তমান আর আর্কাইভ , লক্ষ্য স্থাপত্য নয় architect
scones

11
একইভাবে আমার বর্তমান লিনাক্স (উবুন্টু) পরিবেশে in
আশেরাহ

4
একইভাবে সেন্টোস 7
চেইম গেরেটজ

এটি উবুন্টু 16.04 এ সূক্ষ্মভাবে কাজ করে। (1) file armeabi/libpique.so-> libpique.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /system/bin/linker, stripped। (2) file x86/libpique.so->libpique.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped
rpattabi

4
একটি .so ফাইল এবং একটি .a ফাইল একই জিনিস নয়। এটি একটি ভাগ করা লাইব্রেরির জন্য কাজ করে তা দেখানো একই নয় যে এটি স্থির লাইব্রেরির সাথে কাজ করে। মূল প্রশ্নটি একটি স্ট্যাটিক লাইব্রেরি (.a ফাইল) সম্পর্কে। আমার ক্ষেত্রে (এমএসওয়াইএস ব্যবহার করে) ক্যাফে দ্বারা পোস্ট করা অজডডাম্প সলিউশন যেখানে ফাইল ব্যবহার করে কেবল 'আর আর্কাইভ' স্কোনগুলি যেমন একইভাবে প্রিন্ট করে।
সান বার্টন

17

শুধু ফাইল কমান্ড ব্যবহার করুন; অর্থাত্file library.so


প্রশ্নটি বিশেষত স্ট্যাটিক লাইব্রেরির জন্য।
pooya13

3

ওহো, যে অনুপস্থিত সেডটির অর্থ এটি অনেকগুলি আইটেমকে প্রদর্শিত হচ্ছে।

শুধু একটি উত্তরে:

count=$(nm foo.a | grep '^0' | head -1 | sed 's/ .*//' | wc -c)
((count == 17)) && echo 64bit
((count == 9)) && echo 32bit
((count == 0)) && echo '??bit'

এটি কীভাবে কাজ করার কথা:

  • এনএম - গ্রন্থাগার থেকে প্রতীক পেতে
  • গ্রেপ - একটি হেক্স স্ট্রিং দিয়ে শুরু লাইনগুলি পান (ফাইলটিতে প্রতীকের ঠিকানা)
  • মাথা - প্রথম লাইন পেতে
  • সেড - হোয়াইটস্পেস সহ সমস্ত সাদা অংশকে সরিয়ে ফেলুন
  • ডাব্লুসি - অক্ষরের সংখ্যা গণনা করুন।

একটি 32 বিট পরিবেশে, আপনি 8 হেক্স ডিজিটের সমন্বিত ঠিকানাগুলি পান, নতুন লাইন যুক্ত করে আপনাকে দেয় 9,৪ বিট পরিবেশে, আপনি ১ 16 হেক্স অঙ্কের সমন্বিত ঠিকানাগুলি পাবেন, নতুন লাইনটি আপনাকে যুক্ত করে 17


4
সেখানে একটি
সেড

আমি যাইহোক 73 পাই। কেন এটি কাজ করা উচিত তা ব্যাখ্যা করার যত্ন?
ফ্রান্সেস্কো দন্ডি

উফ, উধাও সেডটি গুরুত্বপূর্ণ ছিল। এটি কীভাবে কাজ করবে বলে একটি ব্যাখ্যা সহ উত্তর আপডেট হয়েছে
পিটেশ

1

যদি কোনও নির্দিষ্ট সংস্করণে সুনির্দিষ্ট ফাংশন থাকে তবে আপনি এনএম চেষ্টা করতে পারেন তবে ফাংশনটির জন্য গ্রেপ করুন।


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

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