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


128

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

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

답변:


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. 감사.
Alex Zavatone

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종종 실패합니다.
Stefan Schmidt

4
lipo에 대한 답을 아래로 내려 가면 항상 작동합니다.
Maciej Swic

.a가 ranlib'd가 아닌 경우 파일에서 정보가 더 적은 것으로보고되는 경우가 있습니다.
Paul Du Bois

4
이제 2015 년에 lipo를 사용해야합니다. 아래 답변을 참조하십시오.
derFunk

1
불행히도 이것은 여러 OS 버전에서 작동하지 않았습니다.
rmcclellan

53

앞에서 언급했듯이 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
...

이 답변에 추가하기 위해 파일 또는 lipo보다 otool을 선호합니다. 나는 iOS 지방 라이브러리로 파일, lipo 및 otool을 시도했지만 otool은 i386 (iPhone Simulator) 및 armv6, armv7 및 armv7s (iPhone OS) 용 파일이 포함되어 있음을 보여준 유일한 도구였습니다.
Roberto

1
참고 : 라이브러리가 뚱뚱한 지 여부를 확인하려면 "otool -arch all"을 사용하십시오. 그렇지 않으면 .o 파일 당 하나의 아키텍처 만보고합니다. 당신의 .A의 아키텍처에 대한 개요, "otool -f"를
폴 뒤 부아

4

대안으로, 나는 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에 묻고있는 것이 나에게 일어났습니다. 사과드립니다.


사용하려면, objdump당신은 MacPorts를 통해 GNU Binutils의를 설치할 수 있습니다. 사용 가능한 모든 아키텍처를 보려면 그냥 실행하십시오 port search binutils. 네이티브 개발을위한 툴은 (예를 들어 gobjdump대신 objdump) 충돌을 피하기 위해 접두사가 붙습니다 . 편의를 위해 별명을 작성하려고 할 수 있습니다.
Stefan Schmidt

3

이 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.