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.
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).
-
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 fromdyldinfo
, and can print chained relocs, dependent librarys, opcodes, ... (and it doesn't needxcrun
) -
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 ofdsymutil -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 (seeman dyld
for more flags)
http://wiki.dwarfstd.org/index.php?title=Apple's_%22Lazy%22_DWARF_Scheme