2013-07-04 4 views
4

저는 ARM7 용 정적 라이브러리를 cMake로 빌드했습니다. 일반적으로 .a 파일에 다음 명령을 사용하면 아키텍처를 보여줍니다."otool"및 "file"은 ".a"파일의 아키텍처를 표시 할 수 없습니다.

f.e.

mac:libs User$ file ./libcurl.a 
./libcurl.a: Mach-O universal binary with 3 architectures 
./libcurl.a (for architecture armv6): current ar archive random library 
./libcurl.a (for architecture armv7): current ar archive random library 
./libcurl.a (for architecture i386): current ar archive random library 

또는 f.e.

mac:libs User$ otool -vf ./libboost_regex.a 
Fat headers 
fat_magic FAT_MAGIC 
nfat_arch 3 
architecture armv6 
    cputype CPU_TYPE_ARM 
    cpusubtype CPU_SUBTYPE_ARM_V6 
    capabilities 0x0 
    offset 68 
    size 9550024 
    align 2^2 (4) 
architecture armv7 
    cputype CPU_TYPE_ARM 
    cpusubtype CPU_SUBTYPE_ARM_V7 
    capabilities 0x0 
    offset 9550092 
    size 9390544 
    align 2^2 (4) 
architecture i386 
    cputype CPU_TYPE_I386 
    cpusubtype CPU_SUBTYPE_I386_ALL 
    capabilities 0x0 
    offset 18940636 
    size 9595040 
    align 2^2 (4) 

그러나 이제는 라이브러리를 만들 때 "otool"과 "file"에서 아키텍처를 표시 할 수 없습니다.

mac:libs User$ otool -vf ./mylib_meta.a 
Archive : ./mylib_meta.a 

이게 무슨 의미입니까? 내 도서관을 짓기 위해 어떤 실수를 할 수 있습니까?

업데이트 : 이고르, 감사합니다!

나는 명령으로 오브젝트 파일을 추출 :

아칸소 -t mylib.a

아칸소 -xv mylib.a myobj.o

-t 바이너리의 목록을 보여줍니다

-xv는 구체적인 바이너리 파일을 추출합니다.

답변

4

Apple은 두 가지 형태의 AR 아카이브를 사용합니다.

"<!arch>\n" 

header 0 
SYMDEF entry 

header 1 
object 1 

header 2 
object 2 

... 

가에 대한 아키텍처를 확인하려면 : 기본적으로 .o 인 파일 만 잔뜩 앞에 심볼 인덱스와 함께 붙어 - 첫 번째는 기존의 유닉스 아카이브 ("a.out의 아카이브")와 매우 유사하다 이 보관소는 적어도 하나 이상의 오브젝트 파일을 추출하고 file 또는 otool을 사용해야합니다. 아카이브 헤더 자체에는이 정보가 없습니다. 실제로 오브젝트 파일은 모두 동일한 아치에 해당하는 것은 아니며 이론적으로 오브젝트뿐만 아니라 모든 종류의 파일을 가질 수 있지만 이는 거의 없습니다. ar utility을 사용하여 아카이브에서 개별 파일을 추출 할 수 있습니다.

다른 종류는 Apple 자신의 발명품입니다. 그들은 다중 아치 Mach-O 실행 파일에 사용 된 "Fat 바이너리/유니버설 바이너리"개념을 사용하여 아카이브에 사용했습니다. 그래서는 "지방"아카이브는 다음과 같습니다

Fat Mach-O header 
    Architecture 1 header --+ 
    Architecture 2 header --|--+ 
    Architecture 3 header --|--|--+ 
    [padding]    | | | 
    Archive 1 <-------------+ | | 
    Archive 2 <----------------+ | 
    Archive 3 <-------------------+ 
이 경우 file에서

otool를 아키텍처가 지원하는 지방 헤더와 목록을 볼 수 있습니다.

뚱뚱한 파일 (기록 보관소와 실행 파일 모두)을 만들거나 편집하려면 lipo tool을 사용할 수 있습니다.

관련 문제