[iphone] Mac OS X에서 정적 라이브러리 (.a)의 대상 아키텍처를 어떻게 확인합니까?

주어진 iPhone 정적 라이브러리가 ARM 또는 Intel 용으로 빌드되었는지 확인하고 싶습니다.

무엇보다 호기심이 많습니다. 이를 위해 Mac OS X 또는 BSD 관련 도구가 있습니까? 이 게시물 은 Linux에서 예를 제공합니다.



답변

다른 옵션은 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
%


답변

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


답변

앞에서 언급했듯이 file항상 작동하지는 않습니다. otool -hv -arch all아마도 가장 가까운 작동이 보장 될 것입니다. 라이브러리의 모든 단일 객체 파일에 대한 아키텍처 정보를 제공합니다.

예:

% otool -hv /sw/lib/libfftw3.a
아카이브 : /sw/lib/libfftw3.a
/sw/lib/libfftw3.a(align.o) :
마하 헤더
      magic cputype cpusubtype caps 파일 유형 ncmds sizeofcmds 플래그
MH_MAGIC_64 X86_64 ALL 0x00 OBJECT 3 336 SUBSECTIONS_VIA_SYMBOLS
/sw/lib/libfftw3.a(alloc.o) :
마하 헤더
      magic cputype cpusubtype caps 파일 유형 ncmds sizeofcmds 플래그
MH_MAGIC_64 X86_64 ALL 0x00 OBJECT 3 416 SUBSECTIONS_VIA_SYMBOLS
...


답변

대안으로, 나는 objdump잘 작동 한다는 것을 알았 습니다. 예를 들어, 내 환경에서 vxWorks를 사용하여 라이브러리 아카이브를 빌드하고이를 다른 프로젝트에 링크해야합니다. 아카이브가 올바른 아키텍처인지 테스트하기 위해 다음과 같은 작업을 수행 할 수 있습니다 (bash 구문).

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;

elf32-sparc-vxworks라고 말하지 않는 일부 라인이 표시되기 때문에이 예제는 정확하지 않습니다.

이것의 좋은 장점 중 하나 objdump는 비슷한 이름의 변형이 대부분의 * nix 운영 체제에 설치되는 반면 다른 응답에서 제안 된 도구는 그렇지 않다는 것입니다.

편집 방금 OP가 OSX에 묻고있는 것이 나에게 일어났습니다. 사과드립니다.


답변

이 bash 스크립트는 프로그래밍 방식으로 아키텍처 목록을 변수로 가져 오는 데 도움이됩니다.

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


답변