programing

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

telebox 2023. 6. 1. 22:39
반응형

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 -sw/lib/lifftw3.a보관: /sw/lib/libfftw3.a/sw/lib/libfftw3.a(align.o):
마하 헤더Magic cputype CPU 하위 유형 캡스 파일 형식 ncmds 크기 cmds 플래그MH_MAGIC_64 X86_64 모든 0x00 객체3336 하위섹션_VIA_SYMBOLS/sw/lib/libfftw3.a(alloc.o):
마하 헤더Magic cputype CPU 하위 유형 캡스 파일 형식 ncmds 크기 cmds 플래그MH_MAGIC_64 X86_64 모든 0x00 객체 3416 하위 섹션_VIA_SYMBOLS...

라이브러리(또는 라이브러리에 있는 개체 파일)가 Mac Catalyst용인지 여부를 확인하는 방법에 대한 답변을 찾고 있는 사용자는 다음을 사용합니다.otool -l로드 명령을 덤프합니다.개체에 대한 LC_BUILD_VERSION 섹션을 찾습니다.Mac Catalyst는 다음과 같이 식별됩니다.platform 6보다는platform 1.

이 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

대안으로, 저는 발견했습니다.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;

이 예는 정확하지 않습니다. elf32-sparc-vxworks라고 표시되지 않는 일부 라인이 표시되기 때문입니다. 하지만 이를 적용하기에는 충분히 쉽습니다.

이것의 좋은 이점 중 하나는objdump대부분의 *nix 운영 체제에 설치되어 있는 유사한 이름의 변형 버전인 반면 다른 응답에서 제안된 도구는 설치되어 있지 않습니다.

edit 방금 OP가 OSX에서 질문하고 있다는 생각이 들었습니다.죄송합니다.

언급URL : https://stackoverflow.com/questions/1085137/how-do-i-determine-the-target-architecture-of-static-library-a-on-mac-os-x

반응형