views:

231

answers:

5

Is there a tool for reading Mac OS X binaries that would print information about relocation tables and symbol offsets similar to this readelf output?

readelf -r app

Relocation section '.rel.dyn' at offset 0x5ec contains 2 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
08049d58  00001706 R_386_GLOB_DAT    00000000   __gmon_start__
08049d60  00000305 R_386_COPY        08049d60   _ZSt4cout

Relocation section '.rel.plt' at offset 0x5fc contains 13 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
08049d24  00000107 R_386_JUMP_SLOT   0804868c   print
08049d28  00000207 R_386_JUMP_SLOT   0804869c   _ZNSt8ios_base4InitC1E
08049d2c  00000507 R_386_JUMP_SLOT   080486ac   _ZStlsISt11char_traits
08049d30  00000607 R_386_JUMP_SLOT   080486bc   _ZNSolsEPFRSoS_E
08049d34  00000707 R_386_JUMP_SLOT   08048664   _init
08049d38  00000807 R_386_JUMP_SLOT   080486dc   sleep
08049d3c  00000907 R_386_JUMP_SLOT   080486ec   _ZNKSsixEj
08049d40  00000b07 R_386_JUMP_SLOT   080486fc   _ZNKSs4sizeEv
08049d44  00000c07 R_386_JUMP_SLOT   0804870c   __libc_start_main
08049d48  00000d07 R_386_JUMP_SLOT   08048ae4   _fini
08049d4c  00001307 R_386_JUMP_SLOT   0804872c   _ZSt4endlIcSt11char_tr
08049d50  00001507 R_386_JUMP_SLOT   0804873c   __gxx_personality_v0
08049d54  00001607 R_386_JUMP_SLOT   0804874c   _ZNSt8ios_base4InitD1E

In this example, print is a function loaded from a shared library (I wrote) at runtime. readelf is able to display information about its location inside the app binary.

Thank you.

+1  A: 

otool -l test.o

ergosys
Nope, it also doesn't do the trick.
karlphillip
You can do this with otool, you just need to pass additional options. man otool for details.
Chris Hanson
A: 

Find any open source elfdump. Grab the sources and compile it on your platform.

Chris
Thank you, but I clearly mentioned Mac OS X, which compiles DWARF binaries. ELF is for Linux.
karlphillip
Oh, then do the same for dwarf!
Chris
Mac OS X does not use DWARF binaries. DWARF is a debugging symbol format. Mac OS X uses Mach-O binaries.
Chris Hanson
+2  A: 
  1. Install macports.
  2. Using macports "port install binutils"
  3. gobjdump -p /path/to/app

There are, of course, many other command-line options. Note that the binutils port cautions that installing it may cause other ports to fail to build. Having it around to port install/look at something/port uninstall can still be handy.

It's rather amazing that there isn't already some native tool to do this.

cbehanna
Thank you. This is the best answer so far. If no one is able to provide a better answer the bounty is yours.
karlphillip
+3  A: 

Have you tried ObjConv? http://agner.org/optimize/#objconv

This utility can be used for converting object files between COFF/PE, OMF, ELF and Mach-O (used by Mac OS) formats for all 32-bit and 64-bit x86 platforms. Can modify symbol names in object files. Can build, modify and convert function libraries across platforms. Can dump object files and executable files. Also includes a very good disassembler supporting the SSE4, AVX, FMA and XOP instruction sets.

Ps.: The source code is included (GPL).

carlfilips
Nice to meet you carlfilips, and thank you.
karlphillip
Nice to meet you too. Also, have a look at this http://developer.apple.com/mac/library/documentation/DeveloperTools/Conceptual/MachORuntime/Reference/reference.html
carlfilips
+1  A: 

You might try dwarfdump.

Peter Hosey