157

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.

Paulo Mattos
  • 18,845
  • 10
  • 77
  • 85
Justicle
  • 14,761
  • 17
  • 70
  • 94

6 Answers6

284

Another option is lipo; its output is brief and more readable than otool's.

An example:

% 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
%
Paul Du Bois
  • 2,097
  • 1
  • 20
  • 31
Václav Slavík
  • 6,445
  • 2
  • 28
  • 25
73

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
Logan Capaldo
  • 39,555
  • 5
  • 63
  • 78
63

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
...
Paul Du Bois
  • 2,097
  • 1
  • 20
  • 31
Jiahao Chen
  • 896
  • 7
  • 14
  • Just to add to this answer, I prefer otool over file or lipo. I tried file, lipo and otool with an iOS fat library and otool was the only one that showed me that it contained files for i386 (iPhone Simulator) and for armv6, armv7 and armv7s (iPhone OS). – Roberto Apr 08 '13 at 01:10
  • 1
    NOTE: if you want to check whether your library is fat or not, you want to use "otool -arch all"; otherwise, it will report only one architecture per .o file. For a quick overview of the architectures in your .a, "otool -f" – Paul Du Bois May 02 '14 at 02:11
7

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.

shaheen
  • 411
  • 4
  • 12
6

This bash script will help you programmatically get a list of architectures into a variable.

list_archs.sh:

#! /bin/bash
lipo -info $1 | sed -En -e 's/^(Non-|Architectures in the )fat file: .+( is architecture| are): (.*)$/\3/p'

Usage example:

./list_archs.sh /usr/lib/libc.dylib
x86_64 i386
bleater
  • 5,098
  • 50
  • 48
4

As an alternative, I've found objdump can work well. As an example, in my environment I build library archives with vxWorks and need to link those into other projects. To test whether the archive is the correct architecture, I could do something like the following (bash syntax):

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;

This example isn't precisely correct, because some lines DO show up that don't say elf32-sparc-vxworks, but it's easy enough to adapt this.

One nice benefit of this is that objdump, or a similarly named variant, is installed on most *nix operating systems, whereas tools suggested in other responses aren't.

edit It just occurred to me the OP was asking on OSX. My apologies.

Brian Vandenberg
  • 4,011
  • 2
  • 37
  • 53
  • To use `objdump` you can install the GNU Binutils via MacPorts. To see all available architectures just execute `port search binutils`. The tools for native development are prefixed to avoid conflicts (e.g. `gobjdump` instead of `objdump`). You might want to create an alias for convenience. – Stefan Schmidt Feb 13 '12 at 15:37