/lssym

Mach-O learning tool

Primary LanguageC

A toy program to teach myself more about the mach-o file format. Right now,
it roughly does what `dsymutil -s` does (which is a bit more than `nm`), but
worse.

Demo
----

But one can already see interesting things with this tool.

See symbols in `lssym` (like with `nm`, but with some `otool -l` thrown in): 

    clang -o lssym lssym.c -Wall 
    ./lssym lssym

See what's left after stripping:

    strip lssym
    ./lssym lssym

(Compare with the output of `nm lssym` and `dsymutil -s lssym` in both cases.
Note that `strip` adds a symbol that looks like

    radr://5614542    N_STAB 3c    n_sect 000 n_desc 0x0000    n_value 0x5614542

I wonder what that bug is. `nm` doesn't list it because `nm` only lists symbols,
and this is a stabs debug info entry which `nm` only shows if you pass `-a`.)

Now build with debug info:

    clang -o lssym lssym.c -Wall -gdwarf-2
    ./lssym lssym

Note that the file now includes stabs debug info, even though we asked for
dwarf. `dsymutil lssym` complains about a temporary `.o` file. Let's break up
compile and link step:

    clang -c lssym.c -Wall -gdwarf-2
    clang -o lssym lssym.o
    dsymutil lssym
    ./lssym lssym         # Still contains stabs entries.
    dwarfdump lssym.dSYM  # But this finds dwarf info now, too.
    dwarfdump lssym.o     # So does this.
    dwarfdump lssym       # This doesn't.

If you don't want `ld` to write stabs info (since you have a dSYM, it's
pointless, and might slow down the `ld` step), link like this:

    clang -o lssym lssym.o -Wl,-S

If you pass `-Wl,-s` instead, `ld` will claim that `-s` is obsolete and ignored,
but still still strip all symbols that can be stripped (after first writing them
as far as I understand -- so that probably doesn't help with linker
performance).


Related tools
-------------

* `dyldinfo` can show relocation info (`man dyldinfo` works, but dyldinfo isn't
  in my path for some reason -- `xcrun dyldinfo` finds it though)
  - e.g. -exports, -opcodes, ...
* `dyld_info` is apparently different from `dyldinfo`, and can print chained
  relocs, dependent librarys, opcodes, ... (and it doesn't need `xcrun`)
* `dwarfdump` shows dwarf debug data
* `dsymutil` can show symbol tables (`-s`) and link dwarf debug info from .o
  files into a single .dSYM file.
* `nm` shows references symbols; a subset of `dsymutil -s` output.
* `otool -l` all load commands in a mach-o file.
* `dwarfdump --file-stats lssym`
* `atos`
* `dwarfdump --lookup`
* run programs with `DYLD_PRINT_STATISTICS=1` set (see `man dyld` for more flags)

http://wiki.dwarfstd.org/index.php?title=Apple's_%22Lazy%22_DWARF_Scheme