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

后端 未结 5 527
再見小時候
再見小時候 2020-12-04 05:33

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 o

相关标签:
5条回答
  • 2020-12-04 05:52

    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
    ...
    
    0 讨论(0)
  • 2020-12-04 05:53

    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
    
    0 讨论(0)
  • 2020-12-04 06:15

    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
    
    0 讨论(0)
  • 2020-12-04 06:17

    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
    %
    
    0 讨论(0)
  • 2020-12-04 06:17

    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.

    0 讨论(0)
提交回复
热议问题