#!/usr/bin/env python
import os
import sys
from macholib.util import is_platform_file
from macholib.MachO import MachO
from mach_o import *
ARCH_MAP={
('<', '64-bit'): 'x86_64',
('<', '32-bit'): 'i386',
('>', '64-bit'): 'pp64',
('>', '32-bit'): 'ppc',
}
def dump_file(path):
print path
m = MachO(path)
for header in m.headers:
seen = set()
if header.MH_MAGIC == MH_MAGIC_64:
sz = '64-bit'
else:
sz = '32-bit'
print ' [%s endian=%r size=%r arch=%r]' % (header.__class__.__name__, header.endian, sz, ARCH_MAP[(header.endian, sz)])
for idx, name, other in header.walkRelocatables():
if other not in seen:
seen.add(other)
print '\t' + other
def check_file(path):
if not os.path.exists(path):
print >>sys.stderr, '%s: %s: No such file or directory' % (sys.argv[0], path)
return 1
try:
is_plat = is_platform_file(path)
except IOError:
print >>sys.stderr, '%s: %s: Permission denied' % (sys.argv[0], path)
return 1
else:
if is_plat:
dump_file(path)
return 0
def main():
args = sys.argv[1:]
name = os.path.basename(sys.argv[0])
err = 0
if not args:
raise SystemExit("usage: %s filename" % (name,))
for base in args:
if os.path.isdir(base):
for root, dirs, files in os.walk(base):
for fn in files:
err |= check_file(os.path.join(root, fn))
else:
err |= check_file(base)
if err:
raise SystemExit, 1
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
pass
|