আমি কীভাবে ম্যাক ওএস এক্সে স্ট্যাটিক লাইব্রেরির (.a) লক্ষ্য আর্কিটেকচারটি নির্ধারণ করব?


128

আমি প্রদত্ত আইফোন স্ট্যাটিক লাইব্রেরি এআরএম বা ইন্টেলের জন্য তৈরি করা হয়েছে কিনা তা যাচাই করতে আগ্রহী।

এটি যে কোনও কিছুর চেয়ে বেশি কৌতূহল। এটি করার জন্য কি কোনও ধরণের ম্যাক ওএস এক্স বা বিএসডি নির্দিষ্ট সরঞ্জাম রয়েছে? এই পোস্টটি লিনাক্সে একটি উদাহরণ দেয়।

উত্তর:


241

আরেকটি বিকল্প হ'ল lipo; এর আউটপুট সংক্ষিপ্ত এবং এর চেয়ে বেশি পঠনযোগ্যotool

একটি উদাহরণ:

% lipo -info /usr/lib/libiodbc.a 
Architectures in the fat file: /usr/lib/libiodbc.a are: x86_64 i386 ppc
% lipo -info libnonfatarchive.a
input file libnonfatarchive.a is not a fat file
Non-fat file: libnonfatarchive.a is architecture: i386
%

একটি পুরানো PJSIP .a ফাইল দিয়ে সবেমাত্র এটি যাচাই করা হয়েছে। armv7। ধন্যবাদ।
অ্যালেক্স জাভাটোন

69

fileসম্ভবত আপনাকে বলতে হবে। otoolঅবশ্যই সক্ষম হতে হবে। তবে আমি fileপ্রথমে চেষ্টা করতাম , যেমন

logan:/Users/logan% file d2
d2: Mach-O executable ppc

সংরক্ষণাগার সহ উদাহরণ:

logan:/Users/logan% file /usr/lib/libMallocDebug.a
/usr/lib/libMallocDebug.a: Mach-O universal binary with 2 architectures
/usr/lib/libMallocDebug.a (for architecture i386):      current ar archive random library
/usr/lib/libMallocDebug.a (for architecture ppc):       current ar archive

34
আমার অভিজ্ঞতা fileপ্রায়শই ব্যর্থ হয়।
স্টিফান শ্মিত

4
লিপো সম্পর্কে উত্তর আরও নীচে দেখুন, সর্বদা কাজ করে।
ম্যাকিয়েজ সুইচ

আমি লক্ষ করেছি যে .এটি যদি রানলিব না হয় তবে ফাইল কখনও কখনও কম তথ্যের খবর দেয়।
পল ডু বোইস

4
এখন 2015 এ আপনার লিপো ব্যবহার করা উচিত। নীচে উত্তর দেখুন।
derFunk

1
দুর্ভাগ্যক্রমে এটি বেশ কয়েকটি ওএস সংস্করণের জন্য কাজ করে নি।
rmcclellan

53

পূর্বে উল্লিখিত হিসাবে, fileসবসময় কাজ করে না।otool -hv -arch allসম্ভবত এটি সবচেয়ে কাছের জিনিস যা কাজের গ্যারান্টিযুক্ত - এটি লাইব্রেরির প্রতিটি একক ফাইলের জন্য আর্কিটেকচারের তথ্য দেয়।

উদাহরণ:

% otool -hv /sw/lib/libfftw3.a
সংরক্ষণাগার: / এসডাব্লু / লাইব / লিবিফটডব্লু.এ
/sw/lib/libfftw3.a(align.o):
মাচ শিরোনাম
      ম্যাজিক সিপুটাইপ সিপাসুবাইট টাইপ ক্যাপ ফাইল টাইপ এনসিএমডি সাইজফফ সিএমডিএস পতাকাস
MH_MAGIC_64 X86_64 সব 0x00 ওবিজেইসিটি 3 336 সাবস্কিপশন_ভিয়া_সাইএমবুলস
/sw/lib/libfftw3.a(alloc.o):
মাচ শিরোনাম
      ম্যাজিক সিপুটাইপ সিপাসুবাইট টাইপ ক্যাপ ফাইল টাইপ এনসিএমডি সাইজফফ সিএমডিএস পতাকাস
MH_MAGIC_64 X86_64 সমস্ত 0x00 ওবিজেইসিটি 3 416 সাবস্কিপশন_ভিয়া_সাইএমবুলস
...

কেবল এই উত্তরে যুক্ত করতে আমি ফাইল বা লিপো ওভারের চেয়ে বেশি পছন্দ করি। আমি একটি আইওএস ফ্যাট লাইব্রেরির সাথে ফাইল, লিপো এবং ওটুল চেষ্টা করেছি এবং এটিই কেবলমাত্র আমাকে দেখিয়েছিল যে এতে i386 (আইফোন সিমুলেটর) এবং আর্মভি 6, আর্মভি 7 এবং আর্মভি 7 (আইফোন ওএস) এর জন্য ফাইল রয়েছে।
রবার্তো

1
দ্রষ্টব্য: আপনি যদি আপনার লাইব্রেরিটি চর্বিযুক্ত কিনা তা পরীক্ষা করতে চান, আপনি "ওটুল -আর্চ সব" ব্যবহার করতে চান; অন্যথায়, এটি .o ফাইলে প্রতি মাত্র একটি আর্কিটেকচারের প্রতিবেদন করবে। আপনার .a, "otool -f"
পল ডু বোইস

4

বিকল্প হিসাবে, আমি খুঁজে পেয়েছি objdumpভাল কাজ করতে পারে। উদাহরণস্বরূপ, আমার পরিবেশে আমি vxWorks সহ গ্রন্থাগার সংরক্ষণাগারগুলি তৈরি করি এবং সেগুলি অন্যান্য প্রকল্পের সাথে লিঙ্ক করা দরকার। সংরক্ষণাগারটি সঠিক আর্কিটেকচার কিনা তা পরীক্ষা করতে আমি নীচের মতো কিছু করতে পারি (বাশ সিনট্যাক্স):

if [ "$(objdumpsparc -a ${ARCHIVE_FILE} 2>&1 | ggrep -cvP 'elf32-sparc-vxworks')" -ne "0" ]; then
  echo "Cannot build with ${ARCHIVE_FILE}, it contains one or more non-sparc components"
fi;

এই উদাহরণটি যথাযথভাবে সঠিক নয়, কারণ কিছু লাইন দেখায় যে এলফ 32-স্পার্ক-ভিএক্সওয়ার্কস বলে না, তবে এটি খাপ খাইয়ে নেওয়া যথেষ্ট সহজ।

এর একটি দুর্দান্ত সুবিধা হ'ল objdump, বা অনুরূপ নামযুক্ত বৈকল্পিক বেশিরভাগ * নিক্স অপারেটিং সিস্টেমে ইনস্টল করা আছে, অন্যদিকে প্রতিক্রিয়াতে প্রস্তাবিত সরঞ্জামগুলি নয়।

সম্পাদনা এটি সবেমাত্র আমার কাছে ঘটেছিল ওপি ওএসএক্সের কাছে জিজ্ঞাসা করেছিল। আমার ক্ষমা।


ব্যবহার objdumpকরতে আপনি ম্যাকপোর্টের মাধ্যমে জিএনইউ বিন্টিল ইনস্টল করতে পারেন। সমস্ত উপলব্ধ আর্কিটেকচারের মাত্র চালানো দেখার জন্য port search binutils। দেশীয় বিকাশের সরঞ্জামগুলি সংঘাত এড়াতে উপস্থাপিত হয় (উদাহরণস্বরূপ gobjdumpপরিবর্তে objdump)। আপনি সুবিধার জন্য একটি উপাধি তৈরি করতে চাইতে পারেন।
স্টিফান শ্মিত

3

এই বাশ স্ক্রিপ্টটি আপনাকে প্রোগ্রামিয়ালি কোনও ভেরিয়েবলের জন্য আর্কিটেকচারের তালিকা পেতে সহায়তা করবে।

list_archs.sh:

#! /bin/bash
lipo -info $1 | sed -En -e 's/^(Non-|Architectures in the )fat file: .+( is architecture| are): (.*)$/\3/p'

ব্যবহারের উদাহরণ:

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