dwz - DWARF optimization and duplicate removal tool
dwz [OPTION...] [FILES]
is a program that attempts to optimize DWARF debugging information
contained in ELF shared libraries and ELF executables for size, by replacing
DWARF information representation with equivalent smaller representation where
possible and by reducing the amount of duplication using techniques from DWARF
standard appendix E - creating DW_TAG_partial_unit
(CUs) for duplicated information and using DW_TAG_imported_unit
import it into each CU that needs it.
The tool handles DWARF 32-bit format debugging sections of versions 2, 3 and 4
and GNU extensions on top of those, though using DWARF 4 or worst case DWARF 3
is strongly recommended.
The tool has two main modes of operation, without the -m
attempts to optimize DWARF debugging information in each given object
(executable or shared library) individually, with the -m
afterwards attempts to optimize even more by moving DWARF debugging
information entries (DIEs), strings and macro descriptions duplicated in more
than one object into a newly created ELF ET_REL object whose filename is given
option argument. The debug sections in the executables and shared
libraries specified on the command line are then modified again, referring to
the entities in the newly created object.
- -m FILE --multifile FILE
- Multifile mode. After processing all named executables and
shared libraries, attempt to create ELF object FILE and put
debugging information duplicated in more than one object there, afterwards
optimize each named executable or shared library even further if
- -h --hardlink
- Look for executables or shared libraries hardlinked
together, instead of rewriting them individually rewrite just one of them
and hardlink the rest to the first one again.
- -M NAME --multifile-name NAME
- Specify the name of the common file that should be put into
the .gnu_debugaltlink section alongside with its build ID. By
default dwz puts there the argument of the -m option.
- -r --relative
- Specify that the name of the common file to be put into the
.gnu_debugaltlink section is supposed to be relative path from the
directory containing the executable or shared library to the file named in
the argument of the -m option. Either -M or -r option
can be specified, but not both.
- -q --quiet
- Silence up some of the most common messages.
- -o FILE --output FILE
- This option instructs dwz not to overwrite the
specified file, but instead store the new content into FILE.
Nothing is written if dwz exits with non-zero exit code. Can be
used only with a single executable or shared library (if there are no
arguments at all, a.out is assumed).
- -l COUNT --low-mem-die-limit COUNT
- Handle executables or shared libraries containing more than
COUNT debugging information entries in their .debug_info
section using a slower and more memory usage friendly mode and don't
attempt to optimize that object in multifile mode. The default is 10
million DIEs. There is a risk that for very large amounts of debugging
information in a single shared library or executable there might not be
enough memory (especially when dwz tool is 32-bit binary, it might
run out of available virtual address space even sooner).
- -L COUNT --max-die-limit COUNT
- Don't attempt to optimize executables or shared libraries
containing more than COUNT DIEs at all. The default is 50 million
- -? --help
- Print short help and exit.
- -v --version
- Print version number and short licensing notice and
Command-line arguments should be the executables, shared libraries or their
stripped to file separate debug information objects.
$ dwz -m .dwz/foobar-1.2.debug -rh \
bin/foo.debug bin/foo2.debug foo/lib/libbar.so.debug
will attempt to optimize debugging information in bin/foo.debug
(by modifying the files
in place) and when beneficial also will create .dwz/foobar-1.2.debug
section in the first two files will refer to
and in the last file to
. If e.g. bin/foo.debug
were hardlinked together initially, they will be
hardlinked again and for multifile optimizations considered just as a single
file rather than two.
$ dwz -o foo.dwz foo
will not modify foo
but instead store the ELF object with optimized
debugging information if successful into foo.dwz
file it creates.
$ dwz *.debug foo/*.debug
will attempt to optimize debugging information in *.debug and foo/*.debug files,
optimizing each file individually in place.
is equivalent to dwz a.out
Jakub Jelinek <firstname.lastname@example.org>.