How do I determine the target architecture of static library (.a) on Mac OS X?

Viewed 109906

I'm interested in verifying if a given iPhone static library has been built for ARM or Intel.

It's more curiosity than anything. Is there some kind of Mac OS X or BSD specific tool to do this? This post gives an example in Linux.

6 Answers

file will probably tell you. otool certainly should be able to. But I'd try file first, e.g.

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

Example with archive:

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

As mentioned earlier, file does not always work. otool -hv -arch all is probably the closest thing that is guaranteed to work - it gives architecture information for every single object file in the library.

Example:

% otool -hv /sw/lib/libfftw3.a
Archive : /sw/lib/libfftw3.a
/sw/lib/libfftw3.a(align.o):
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64  X86_64        ALL  0x00      OBJECT     3        336 SUBSECTIONS_VIA_SYMBOLS
/sw/lib/libfftw3.a(alloc.o):
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64  X86_64        ALL  0x00      OBJECT     3        416 SUBSECTIONS_VIA_SYMBOLS
...

If anyone comes here looking for answers about how to tell whether a library (or the object files in it) are intended for Mac Catalyst, use otool -l to dump the load commands. Find the LC_BUILD_VERSION section for any object. Mac Catalyst is identified by platform 6 rather than platform 1.

Related