HOME Software Lotus Cars DWARF Kindle Solar
graphic with lotus elise and lotus elan

Older DWARF Information

Introduction

This contains information about old issues and old releases. Information that is not necessarily of interest any longer to most people. Kept here in case it may be of some value to someone. See the main libdwarf/dwarfdump/DWARF page for current releases and information.

Request for test objects

[top]

Request for .rela test objects

While I have a collection of various ELF object files containing DWARF information I have very few with .rela relocations (something libdwarf now supports). If you could create any such different from the following table entries (with rela relocations and DWARF2/3/4 debugging information, please) I would appreciate it. I don't need multiple relocatable objects with any given combination of characteristics (as listed in the following table). LE meaning little-endian, BE meaning big endian, of course. The following source and build script shows what I want. These exact files suffice (if your compiler generates rela sections).

quasar 1091: cat t1.c
extern  int foo();
int main()
{
    int x = 1;
    x = foo();
    return x;    
}
quasar 1092: cat t2.c
int foo()
{
     int y = 3;
     y = y + 8;
     return y;
}
quasar 1093: cat build.sh
cc -c -g t1.c
cc -c -g t2.c
ld -r t1.o t2.o -o tcombined.o
#The following shows if rela sections are generated.
readelf -S tcombined.o | grep rela.debug_info

The ones I already have as of March 18,2010 are:

32/64 CPU LE/BE
Elf32 SPU(cell) BE
Elf32 PPC BE
Elf64 AMD64 LE
Elf64 PPC BE
Elf64 SPARC BE
Elf32 SPARC V8+ BE
Elf64 MIPS LE
Elf64 MIPS BE

Note about distribution contents

All libdwarf distributions contain C source plus the DWARF2 specification plus libdwarf specifications. Implementors often extend DWARF by adding new attributes and other things. Those that we are aware of are defined in dwarf.h which is provided here for reference. If you have corrections or additions, please let me know! The file is in every distribution of libdwarf.

Incompatible Change June 2013

January 31, 2013: Announcing this incompatible change!

In June 2013 there will be an incompatible change to libdwarf.h which will mean those compiling against the producer code in libdwarf will encounter an error. The Callback function prototype will add 'const' to a char * argument in the Callback functions whose types are named below. This is not a binary incompatibility it is a source compile time incompatibility.

Generally the only people affected are those compiling a compiler that uses libdwarf to generate DWARF2. The function prototypes in libdwarf.h are named Dwarf_Callback_Func_c, Dwarf_Callback_Func_b, and Dwarf_Callback_Func.

It will not affect folks linking against libdwarf but not recompiling the code calling libdwarf.

The fix is simple: add 'const' to the char* argument to your libdwarf callback prototypes and implementation.

This change will let us eliminate several compiler warning messages from the build of libdwarf. It will not affect folks calling only the consumer interfaces of libdwarf. Only those who coded callback functions using the libdwarf producer callbacks are affected.

Producer Incompatibility May 2014

Code using the consumer (reader) calls need not change. Binary and source compatibility is retained for consumer code.

The dwarf_producer_init() function interface changed so existing calls will fail at caller compile time. The producer callback function name changed too. This returns the code to a single producer-init function and one with an easier to understand option list. It also results in the elimination of extremely messy producer configure-time options and code #ifdefs relating to relocation generation in favor of simple run-time choices. Though this change is a problem for a few users it seemed inevitable and waiting for some future date did not seem productive.

Go and DW_FORM_ref_addr, April 2014

A correspondent reports that a Go language implementation emitted DW_FORM_ref_addr according to DWARF V2 for the case of 64 bit addresses with 32 bit DWARF offsets. Libdwarf was assuming no one was going to do that in the odd way DWARF2 documented. Now libdwarf follows the standard (as it really should have all along). Thanks to Arnaud Diederen for pointing out this blunder and for providing a tiny Go test source.

Compiler/Release Issues

[top]

Clang Compiler Issues, January 2012

The new clang C/C++ compiler has some issues in the generated dwarf that dwarfdump notices. We make no claim that the issues list here is complete.

Known DWARF issues with clang 2.9: The "dwarf_srclines: DW_DLE_BAD_REF_FORM" error arises due to a bug in the FORM of the DW_AT_stmt_list attribute. This rather severe error causes dwarfdump to stop executing. ( http://llvm.org/bugs/show_bug.cgi?id=9995). The DW_TAG_friend does not have a correct list of attributes. ( http://llvm.org/bugs/show_bug.cgi?id=11695). The DW_AT_containing_type does not appear in the right place. ( http://llvm.org/bugs/show_bug.cgi?id=11700).

Known DWARF issues with clang 3.0: Bug 9995 is fixed. Bugs 11695 and 11700 are not fixed.

Known DWARF issues with clang HEAD January 2012: Bugs 11695 and 11700 are not fixed.

Arm issues, March 2010

ARM C/C++ Compiler, RVCT4.0 [Build 650] can emit DWARF3 with a .debug_frame cie length of 46, which is not a multiple of the address_size (which is 4) and thus violates the rules of DWARF (libdwarf generates an error). That compiler also generates a .debug_frame augmentation string of "armcc+" which libdwarf does not understand and so libdwarf generates an error for that too. http://sourceware.org/ml/gdb-patches/2006-12/msg00249.html has information about interpreting Arm .debug_frame information. Update 17 March 2010 The sourceware.org web page is more complete than I initially grasped and has been confirmed by a compiler-maintainer at Arm. Basically the augmentation string of "armcc+" means the CFA has the standard meaning, whereas the empty augmentation string means the CFA has a non-standard definition. See the sourceware.org page for details. The cie_length bug has been reported to an Arm compiler-maintainer. Update 04 April 2010 The 20100404 release lets libdwarf work properly on Arm.

Compilation and off64_t

Beginning in 2007 libelf.h may be distributed with a use of off64_t as a data type. In 32bit Linux with some distributions either _GNU_SOURCE or __USE_LARGEFILE64 must be defined before including either sys/types.h or libelf.h: a plain include of libelf.h will not compile. The configure scripts and some coding in libdwarf/dwarfdump headers attempt to deal with this as of December 2007 so that older and newer libelf.h will work transparently (allowing libdwarf/dwarfump to build). As a result of the 2007 libelf.h off64_t type you may see a warning from configure when plain libelf.h does not compile: ignore that configure warning.

Line table header length bug in a gcc distribution

This issue was discovered 29 September 2008. A gcc version (GNU C 4.1.2 (Gentoo 4.1.2) -g) when generating 64-bit-offset-dwarf targeting a MIPS64 little-endian platform (and perhaps other targets), generates line table prologue header_length field with a value which is exactly 12 too large. A dwarfdump/libdwarf error of DW_DLE_LINE_PROLOG_LENGTH_BAD (most libdwarf releases) or a Warning from dwarfdump -l -v -v -v -v (libdwarf 20080929) indicates this error was encountered. Almost all gcc DWARF2 generation involves 32-bit-offset DWARF2 (even if the target machine has 64 bit pointers) so it's very unlikely this bug will affect you. As of the 20081012 release libdwarf works around this bug. Looking at gcc source of 4.1.2 I don't see how that bug is possible (gcc source looks correct in this regard).

Dwarfdump2 vs dwarfdump

I created dwarfdump2 in C++ (first released in March 2009). dwarfdump2 operates the same as the dwarfdump but dwarfdump2 is easier to read (I hope). Dwarfdump as of 20100404 has the same features as dwarfdump2, but dwarfdump uses a GNU C library routine (tdestroy()) (if present) that may not exist on all systems. I hope all can use dwarfdump2 instead of dwarfdump. I would love to hear why you have to stay with dwarfdump (if you do).

Dwarfdump Performance issue

There is an issue with dwarfdump performance due to the number of function-instances when the number of registers (frame rules) is set higher than necessary.

dwarfdump -R  -f libpt_linux_x86_r.so.1 

can take more than an hour to run. The -R defaults to 1200 registers, but x86 has only a few registers. There are 48382 subprogram instances in this shared object (with just 9191 FDEs (multiples of them have the same low_pc addresses,which is a g++ bug, see below)).

With

 
dwarfdump -x abi=x86 -f 

the dump takes just 1 minute.

So use -R only when you need it. The 10 May 2009 release has additional abi dwarfdump.conf entries named generic500 and generic100 so cpus with register counts well under 1000 (and no specific correct abi in dwarfdump.conf) have better choices than -R. Update: As of the 10 May 2009 release dwarfdump2 has a new implementation of -f (and -F) which avoids the -R multiplier effect. It uses a different libdwarf interface function. This reduces run time of -R -f on this test case to under 2 minutes and the code is a bit easier to understand (I hope). Libdwarf has a couple tiny new functions that make possible fully correct reporting of frame information to libdwarf (there was a dependency on DW_FRAME_CFA_COL3 as a constant which could break down for an ABI with over 1034 registers, and the new functions enable libdwarf to behave correctly).

Gcc 4.3.0 frame information bug

There is also an apparent g++ bug because with g++ version 4.3.0 20080428 (Red Hat 4.3.0-8) (GCC) emits many fdes with identical low_pc addresses (often low_pc of zero) --- which makes no sense to me. I noticed this building dwarfdump2 with that g++. Dwarfdump warns about the situation of duplicate-low-pc fdes. The same problem occurs with earlier gcc: GNU C++ 4.1.1 20070105 (Red Hat 4.1. 1-51). Some of these duplicate FDE reports were erroneous (a bug in libdwarf which fixed in 20100808). A .debug_loc oddity with that same version of g++ is some bytes in .debug_loc that do not seem to be referenced from .debug_info. This is not a bug in g++ because the DWARF specification does not forbid such, but it does mean printing the .debug_loc section (dwarfdump -c or dwarfdump -a) fails with a "dwarf_get_loclist_from_expr: DW_DLE_LOC_EXPR_BAD (128)" error. Update: The 20100930 release removes the implied -c from -a so this .debug_loc oddity won't interfere with -a use now.

Gcc 4.5.1 .debug_pubtypes section bug

g++ generated bad .debug_pubtypes data in an example executable (a build of dwarfdump2 using "GNU C++ 4.5.1") I was sent. The error message "dwarfdump NO ENTRY: pubtype dwarf_offdie : die offset does not reference valid DIE." is indicating a real error in the section data. Some of the DIE offsets are nonsense. A workaround is to avoid attempting to print .debug_pubtypes.

Redhat 9 compilation and libelf.h

Compilation will fail if libelf.h is missing (it's missing from RedHat 9.0, for example, though libelf.a/.so is present). In that case find a libelf distribution to get libelf.h.

Releases

[top]

filename, download-link Bytes Reason for release
libdwarf-20130125.tar.gz 0

WITHDRAWN: this release is fine for personal use if you picked it up while it was available, but a change in libdwarf.h introduced a binary incompatibility which we realized (the next day) was an unnecessary incompatibility. Client code using that structure must be recompiled to use the new libdwarf, but see 20130126 for a new release that has the same fixes but removes the recompilation requirement vis-a-vis releases prior to 2013-01-25.

libdwarf-20121130.tar.gz 1489530

New checking options to dwarfdump can help find wasted space in DWARF's .debug_info section (useful to compiler writers). Thanks to Carlos Alberto Enciso for designing, coding, and documenting the new options. Added a refinement to handling a new GNU/gcc expression operator which prevents a 64-bit-pointer object from causing libdwarf difficulty. Thanks to Akos Pasztory for providing a concise testcase.

md5sum: 83ab49c58439254729f543be6977692b

sha512sum (remove spaces following colon): 986bb4cfb92b32da5eab8ae6fde24c5ac9f8b9503feec3 f28e855d9aaf9ad54ab4e3de19d3fc99912ef5b3b2d61d 993c1ca4e62629a41afc764bc4c931685ce5

libdwarf-20121127.tar.gz 0

Withdrawn due to a bug in the release.

libdwarf-20120410.tar.gz 1465839

Ken W. and J. Spencer reported a few C99 dependency issues and commentary mistakes in libdwarf and dwarfgen, and those are now fixed. Thanks for bringing these to my attention. The md5sum for this release is "77c8b351f11738bc9fa50474a69d5b36".

libdwarf-20111214.tar.gz 1479396

dwarfdump[2]: Added support for DW_OP_GNU operators. Enhanced the extended-extensions table so known GNU tag-attr dependencies get no warning. Added support for DWARF3/4 line table values. libdwarf: Added support for DW_OP_GNU operators. Added dwarf_lineoff_b() function making dwarf_lineoff() obsolete (but still present). Added dwarf_add_lineentry_b() as part of preparation for creating DWARF3/4 line output (including isa and discriminator fields). Added dwarf_prologue_end_etc() function to access line entry new fields. The consumer documentation is now at version 2.02 and producer doc at version 1.32 . dwarfgen: Added example code generating line tables. The md5sum for this release is "573b49b94e38a0e65ff337768f003d33".

libdwarf-20111030.tar.gz 1467164

Now libdwarf and dwarfdump/dwarfdump2 support reading and printing the DWARF4 .debug_types section. The md5sum for this release is "c4eee0c099d19c84f24e0d1634f0d8e7"

libdwarf-20111009.tar.gz 1446042

dwarfdump2: Major change! Now works just like dwarfdump -- with the same options and capabilities as dwarfdump but by taking advantage of C++ features it is simpler to read and a bit faster than C dwarfdump. dwarfdump: Fixed some (minor) problems in detecting compilation units and showing errors. libdwarf: Now a bit more robust in detecting errors in object files. md5sum on this gzip file yields "f1064abf7bea6a0ad8ec74d7d4218ec6". Thanks to Paul Marinescu and Carlos Alberto Enciso and Sharma Shailesh and Gerald Rigdon for their help and comments.

libdwarf-20110908.tar.gz 1405391

Some minor changes. libdwarf: added -fPIC to enable-shared builds, and implemented the ability to declare (in dwarfdump.conf) that address-size is 4 or 8. dwarfdump: Fixed tsearch related call with a memory leak, added a dwarfdump.conf example showing new includeabi: and address_size: command lines, configure now sets HAVE_STDAFX_H if that header (non-Linux) exists, verify checking is on before doing a duplicate-fde check. dwarfdump2: verify checking is on before doing a duplicate-fde check. md5sum on this gzip file yields "833a9ad58367d817db1c704d468acbee".

libdwarf-20110612.tar.gz 1399564

A function is in the producer: dwarf_producer_init_c(). This provides a user-defined void* pointer passed through from dwarf_producer_init_c() to the callback so the user code can provide whatever data it wishes to itself (in the callback). The library does not inspect the value in any way. md5sum on this gzip file yields "4bcebf3b9876eaec0916769f8a6864f3"

libdwarf-20110607.tar.gz 1456749

Issues addressed, libdwarf: Now DW_FORM_sdata/udata allowed for DW_AT_data_member_location. A very old bug (looking past the end of .debug_abbrev) fixed. Added a new function making it easier to get the 'class' of an attribute. Issues addressed, dwarfdump: Corrected some line-table error checking and made the options work more like they are described in a few cases. md5sum on this gzip file yields "7d3f6921dfe1c47007f55a60cf89ea53"

libdwarf-20110605.tar.gz 1450661

Issues addressed: libdwarf was missing a % in line printing and the producer code and had several indentation errors and omitted checks for empty sections in several places. dwarfdump had unused local variables and critical missing () in two tests made if statements incorrect. One place = was used in a test erroneously. The dwarfdump.1 man page is more informative about the -k options now. md5sum on this gzip file yields "0d2718414c3be33b8f19317c979ac5f4" .

libdwarf-20110113.tar.gz 1392725

The dwarfdump reader now handles DWARF4, at least in the areas I have test cases. gcc-4.5 -gdwarf-4 generates DWARF2 line tables (for example) so there are some untested areas of DWARF4 handling.

libdwarf-20100930.tar.gz 1386039

dwarfdump -a no longer implies -c so the DW_DLE_LOC_EXPR_BAD won't appear for valid DWARF any longer. The make install targets are pretty useless, the various README files now explain installation (if you want to install) in more detail. This has an initial release of dwarfgen, which generates DWARF using the libdwarf producer code. Be aware dwarfgen is seriously incomplete and has serious bugs.

libdwarf-20100808.tar.gz 1313115

With -f and -F dwarfdump was counting eh_frame low-pc as a duplicate of .debug_frame low-pc. This was a bug and lead to many DWARF_CHECK error messages. Now duplicate fdes in .eh_frame are checked separately from those in .debug_frame.

libdwarf-20100629.tar.gz 1313016

Fixes some CFA_expression handling in libdwarf and allows some compiler mistakes a bit more leeway in dwarfdump (so the dump continues in the face of certain errors). Thanks to Todd Allen for noticing the libdwarf bug and providing a test case.

libdwarf-20100404.tar.gz 1310772

Fixes Arm handling. Fixes MIPS 64 BigEndian .rela handling. Improves dwarfdump fde function name handling and error detection. Fixes aranges handling. Fixes some counts from -k error checking reports. Adds example code to one example source file. Thanks to Peter Lloyd and shihhuangti for providing non-proprietary test objects.

libdwarf-20100328.tar.gz 1304516

Recent Arm compiler frames were not understood by libdwarf, now they may be successfully read. A new class of 'harmless errors' is now created by libdwarf, but clients may freely ignore this new error class. Dwarfdump now has an abi 'arm' so that frames may print register names for Arm objects.

libdwarf-20100214.tar.gz 1292355

libdwarf and dwarfdump were not handling all DW_OP operators correctly. When the elf object type (elf64) did not match the compilation unit type (32bit) libdwarf and dwarfdump failed to work correctly (gave an error and quit). The dwarfdump -M option was not actually printing all FORMs, now it does. Thanks to Carlos Alberto Enciso for providing a test case.

libdwarf-20100204.tar.gz 1286741

Added a new libdwarf configure option --enable-oldframecol. See libdwarf/NEWS and libdwarf/libdwarf2.1.pdf for details. Dwarfdump now prints generic register names in frame printing instead of using MIPS register names as the default. Thanks to Younghyung Cho for pointing out a bug in dwarf_frame.c.

libdwarf-20091230.tar.gz 1164606

Fixed a bug in the --disable-nonshared libdwarf configure option. Removed config.guess and config.sub from the release (they never really belonged in the release). Removed debug printf from libdwarf/pro_reloc_symbolic.c Regenerated configure with autoconf 2.64 for libdwarf, dwarfdump, and dwarfdump2. A printf in gennames.c needed a cast for portability. Thanks to Zeev Tarantov for pointing out the libdwarf configure problem and the portability problem.

libdwarf-20091226.tar.gz withdrawn

Fixed the special test for a Windows root path (when configure --enable-windowspath) to do case-independent checking. Added dwarf_get_form_class() so client code can easily know how the DWARF standard classifies a form regardless of which DWARF version was used to create a compilation-unit. Added support for DW_FORM_exprloc and corrected DW_FORM_sec_offset (these new in as-yet-unreleased DWARF4 standard). Withdrawn, use libdwarf-20091230.tar.gz instead, it incorporates the fixes here.

libdwarf-20091118.tar.gz 1334298

Dwarfdump -u now works again, and -u is now tested in my regression tests. Thanks to Carlos Alberto Enciso for pointing out it was broken.

libdwarf-20091012.tar.gz 1331524

Updates some of the documentation (mm, pdf) to make it clearer. Fixes a bug in simplereader.c example code. Adds DWARF4 dwarf.h values (but no real support yet) and corrected a typo: DW_CFA_cfa_offset_extended_sf was never a correct spelling, DW_CFA_offset_extended_sf is correct. Fixed an omission in the libdwarf aranges reading code that could lead to a coredump. Those needing to recognize Windows 'root paths' like C: will want to build libdwarf with the new --enable-windowspath configure option (this lets the line table code build full paths correctly for Windows).

libdwarf-20090716.tar.gz 1318894

Small bugs in .rela handling have been fixed. In addition, when a section is relocated it is first copied to malloc space because some versions of libelf may return read-only data to the user (so applying relocations would generate a segmentation violation). Thanks to Maxim Kartashev for his help.

libdwarf-20090710.tar.gz 1317712

A new directory, dwarfexample, has a code example of how to use libdwarf to read dwarf information. Added two new functions added to libdwarf:the important one makes it easy for a consumer application to derive the applicable CU level die given any die derived in the object being read (an example of use is in libdwarf2.1.mm and libdwarf2.1.pdf. The libdwarf consumer interface now does .rela relocations automatically so more .o files are easily readable. The libdwarf consumer document has more examples. Anyone supporting reading DWARF from non-elf objects will find libdwarf.h changes require them to add a null pointer as a new member of the Dwarf_Obj_Access_Methods_s instance they create. Thanks to Daniel Gollub for his help with relocation information. One problem: If your libelf results in .debug_info (or other such dwarf section) being marked read-only in memory (and has rela relocations applicable) the attempt to apply the relocations will fail with a segv error. Oops. On the other hand, if rela relocations apply then not doing the relocations will result in dwarf data which is not correct, so you will get other errors or bad data from dwarfdump/libdwarf. We are considering possible solutions. A few cases in libdwarf/dwarf_elf_access.c say return type = whereas return type == is needed.

libdwarf-20090622.tar.gz 1304571

Libdwarf has new generated-at-libdwarf-build functions so consumer apps can print a tag-name given a tag number: dwarf_get_TAG_name(). Similarly for all the various dwarf defines. dwarfdump and dwarfdump2 now use those functions. dwarfdump and dwarfdump2 have a new -S option selecting which die(s) to print by string comparisons to attributes of each die. And when a die selected its parents print also so the context of the selected die is clear. Thanks to Carlos Alberto Enciso for proposing and helping-create -S. Removed libdwarf code that erroneously put data in the DW_FRAME_CFA_COL row (in the preferred new form that row is separate, not part of the main table) and fixed dwarfdump to handle the properly setup data. Thanks to Stoyan Shopov for providing a simple test case showing the libdwarf botch.

libdwarf-20090510.tar.gz 1291993

Dwarfdump now uses new c/c++ applications rather than awk to build some source files. Added new functions to libdwarf to allow correct handling of objects with address_size that varies by compilation unit. Added new functions to libdwarf to allow correct handling of the 'same value' and 'undefined value' pseudo-registers. See libdwarf2.1.pdf for the details (the new functions are listed in the Changes section). Thanks to Carlos Alberto Enciso for his help.

libdwarf-20090330.tar.gz 1290743

Made minor corrections to dwarfdump. Used C++ destructors to clarify lifetimes of some data with simpler code in dwarfdump2. No changes to libdwarf.

libdwarf-20090324.tar.gz 1289278

Added a new source directory to this release: dwarfdump2. It contains a revamped (to C++) dwarfdump. Existing dwarfdump remains part of the distribution! Use either dwarfdump or dwarfdump2, though I hope you can use dwarfdump2. libdwarf: fixed indentation in a few places. dwarfdump: Various formatting botches were fixed and the main section print routines moved to individual source files (moved out of print_sections.c). dwarfdump2: New, with improved error-detection and output in frame printing (a better dwarfdump). Fixed the install of dwarfdump so dwarfdump.1 will actually install. One bug in this release: about line 710 in dwarfdump.cc of dwarfdump2 should have a continue that was unfortunately omitted :

             if(should_skip_this_cu(dbg,cu_die,err)) {
                   dwarf_dealloc(dbg, cu_die, DW_DLA_DIE);
+                  continue;
             }
libdwarf-20090217.tar.gz 1132942

A small number of C99 // comments and in-line declarations are in 20090216. This removes those C99-isms (and a comment or two that did not belong). If your compiler does not care about such, 20090216 is fine to use. Thanks to Remko Troncon for informing me this happened. Thanks to gcc -pedantic for pinpointing the instances.

libdwarf-20090216.tar.gz 1132878

Added dwarfdump -C option. With -C dwarfdump reports some common extensions in warnings. Without it these common extensions are silently accepted. In addition, a couple generated dwarfdump .c .h files are now in the release, completely eliminating the need for anyone to use awk (though the Makefile can regenerate these files). Thanks to Carlos Alberto Enciso for his help.

libdwarf-20090214.tar.gz 1119572

Now works around some line-table-header compiler mistakes, and dwarfdump checking reports them. The dwarf-checking tables have been improved. It's now possible to port dwarfdump a bit more easily, as printf for Dwarf_Unsigned and the like are handled via easily modified macros in libdwarf.h (as opposed to lots of fiddling with printf lines directly). Configure was regenerated with the latest config.guess and config.sub. Thanks to Remko Troncon, Carlos Alberto Enciso, and shihhuangti for helpful comments and test cases.

libdwarf-20081231.tar.gz 1108723

The .debug_ranges section was not handled by libdwarf. Now there are libdwarf interfaces and dwarfdump prints the section data. Thanks to shihhuangti for pointing out the omission.

libdwarf-20081119.tar.gz 1102362

A compiler was using DW_FORM_ref_addr form with a DW_AT_sibling attribute, which was a surprise. Now we handle it and with dwarfdump-ka we check the offset for correctness. Added the -M option to dwarfdump which adds the name of each attribute's form to the existing output. Thanks to Davide Parodi for mentioning the DW_AT_sibling problem and providing a non-proprietary test case.

libdwarf-20081013.tar.gz 1099626

Libdwarf gave DW_DLE_CIE_RET_ADDR_REG_ERROR when it should not have gotten an error at all. Thanks to shihhuangti for providing an executable that showed the libdwarf error.

libdwarf-20081012.tar.gz 1099664

Now a dwarf-64 bug in gcc is worked-around properly in libdwarf and the warning from dwarfdump is more correctly phrased. A new dwarfdump configuration '-x abi=ppc' provides specific sizing and names for power pc registers. Thanks to Phil Mucci for providing a test case.

libdwarf-20080929.tar.gz 1097528

Fixed: Mixing eh and non-eh frame sections access could result in a bogus error-return. Documented that dwarf_get_fde_n() and dwarf_get_fde_at_pc() require a real (non-empty) fde table. That was (sort of) always true, but was not documented. Fixed bogus error code in reading line tables. Added a warning (removing error return) when there are bytes of 'unused data' after a line table prolog (it's strange but legal when done properly in DWARF).

libdwarf-20080818.tar.gz 1091066

Minor improvements: dwarfdump print_reloc.c referred to sym_data_entry_count in one place where sym_data_64_entry_count should have been tested. DW_DLA_PUBTYPE_CONTEXT was a typo, DW_DLE_PUBTYPE_CONTEXT was intended. Fixed indentation and removed some tabs in favor of spaces (in five files). A couple files had a couple lines with CR-LF line endings, the CR is now gone. Corrected minor typographical errors in libdwarf2p.1.mm and libdwarf2.1.mm and regenerated the pdfs.

libdwarf-20080615.tar.gz 1092542

Removed __SGI_FAST_LIBELF code, no one could use it anyway. Fixed an off-by-one in dwarfdump which could reference off the end of an array in a specific circumstance and verify string table index refers to inside the table when printing relocations. Corrected return code from libdwarf when there is no dwarf information. Thanks to Carlos Alberto Enciso for noticing the bugs. Fixed indentation and removed some tabs in favor of spaces (in a few files).

libdwarf-20080613.tar.gz ---

Withdrawn. A typo meant the main directory extracted from the tarball had the wrong name (it had 2006 in the name, not 2008). See libdwarf-20080615.tar.gz for the corrected tarfile.

libdwarf-20080409.tar.gz 1091778

A giant a.out exposed an inflexible (slow) handling of abbreviations in libdwarf as well as showing that one (internal) field was too small to accommodate over 64K abbreviations in one compilation unit. The relevant hash table adapts now and the field is 'large enough'. Added -H and -n options to dwarfdump. Added a dwarfdump -ka new check for correctness.

libdwarf-20080228.tar.gz 1086598

This changes the libdwarf-internal implementation of reading libelf so that the reader is not directly tied to libelf or even elf. Meaning a libdwarf can be built that reads other object file types or that uses some library other than libelf to do the reading (subject only to simple constraints, see libdwarf.h). Thanks to Josh Fuhs for designing and implementing the object-file-reader revisions.

libdwarf-20080208.tar.gz 1079230

Due to a typo, calling _dwarf_fde_section_offset() (a interface which is still supported) would lead to an infinite loop in libdwarf-20071209 and libdwarf-20080125. The libdwarf producer forms code now allows more of the newer attributes (so is more complete). Alloca is no longer used anywhere (it was really only used one place). The libdwarf producer code controlling the offset-size is more sensible: standard DWARF (32 bit offsets) is the default, use configure --enable-dwarf-format-sgi-irix to get IRIX 64bit offsets. See the libdwarf README and libdwarf2p.1.pdf for details. Thanks to Carlos Alberto Enciso and Melanie Zumwalde for noticing some of these errors.

libdwarf-20080125.tar.gz 1074859

In the producer library code dwarf_die_link() is now O(1) where it was O(N) before. Thanks to Daniel Gollub for finding this performance improvement. dwarf_die_link() now back-links siblings (in its internal lists) correctly. The back link bug had no (known) effect on dwarf generated by libdwarf.

libdwarf-20071209.tar.gz 1073568

Renamed 4 functions so they are now exported by libdwarf as dwarf_*. dwarf_fde_section_offset(), dwarf_cie_section_offset(), dwarf_print_lines(), and dwarf_ld_sort_lines() are the new names. The old _dwarf_* names are still supported in libdwarf.h but anyone building a shared library could choose to export only dwarf_* names and dwarfdump will now compile and link successfully with that shared library. The changes in libdwarf-20071208.tar.gz are incorporated in this release.

libdwarf-20071208.tar.gz withdrawn

Added acceptance of .eh_frame S augmentation. Updated config.guess config.sub to latest (2006-11-15). Added configure tests and some code in dwarf_incl.h and globals.h to define _GNU_SOURCE so that it will all compile with recent libelf.h use of off64_t (yet still compile with earlier libelf.h). Regenerated configure. Withdrawn in favor of the December 9 version above. Two nearly identical releases a single day apart seemed silly.

libdwarf-20071016.tar.gz 1069958

Two fixes. dwarf_siblingof() could try to access a byte past the end of an Elf section leading to a coredump. The dwarf macro reading code could (in the DWARF_SIMPLE_MALLOC case only) allocate and free memory inconsistently leading to malloc arena corruption. Thanks to Cristi Vlasceanu for providing a tiny testcase showing the problems.

libdwarf-20071015.tar.gz 1069600

The special build macro DWARF_SIMPLE_MALLOC was incorrectly implemented (now fixed): it could lead builds employing that macro to coredump in libdwarf. Now (just before exit) dwarfdump free()s some space it previously left mallocd.

libdwarf-20070904.tar.gz 1068927

Updated FSF address everywhere. Added qualifier for DWARF4 DW_AT_high_pc where applicable in dwarfdump output. Deleted 2 files which were never used. Added documentation of new producer functions in libdwarf.

libdwarf-20070703.tar.gz 1064669

Adding new libdwarf function dwarf_get_loclist_entry() to extract CFA val_expression bytes usefully. dwarfdump now uses that info to print those expression bytes with -v. Corrected incorrect output new in 20070702.

libdwarf-20070702.tar.gz withdrawn

Withdrawn: see newer release. Adding -R option to dwarfdump: a 'generic' register set for frames which prints registers as r<n> ('r35' for example) and allows register numbers up to 1000.

libdwarf-20070701.tar.gz 1060269

DW_CFA_val_expression was handled wrong in libdwarf leading eventually to an invalid register number reading a GNU .eh_frame section (dwarfdump reported an error). Once again thanks to Cristian Vlasceanu for noticing libdwarf was broken and for providing a test case.

libdwarf-20070525.tar.gz 1059960

Now the documentation is in pdf form (instead of postscript) as most people expect documents to be pdf. Corrected libdwarf and dwarfdump bugs that prevented dumping GNU eh_frame built with gcc 4.1.2. Thanks to Cristian Vlasceanu for noticing libdwarf was broken and for providing a test case.

libdwarf-20070508.tar.gz 934034

Incorporates Sun Microsystems additions including cleanups of the producer code so it no longer leaks memory and the -G option to dwarfdump. Thanks to Chris Quenelle for his help. Minor cleanups to the producer library document and the copyright documents (no change in terms is intended).

libdwarf-20070412.tar.gz 907541

Lists Sun Microsystems extensions (dwarf.h), so dwarfdump on Sun executables shows readable output. Thanks to Chris Quenelle for his help. The old sgi-specific -mm-to-ps document build now uses groff instead (regenerated documents with groff). Increased the static size of the dwarfdump die-stack (dwarfdump now exits with an error if the stack overflows).

libdwarf-20070223.tar.gz 902453

Some formatting was a bit off because of macros without terminating semicolons. Changed all the libdwarf/dwarf_util.h macros so now all uses require terminating semicolons and re-indented libdwarf. Fixed an output bug in dwarfdump frame output (was missing a newline in some cases).

libdwarf-20070220.tar.gz 902042

dwarf_get_macro_details() was leaking memory and had thread-unfriendly static data. libdwarf/README has words about thread safety now. The dwarf_frame printing code was off-by-one so it printed some bytes wrong in val-expressions.

libdwarf-20070209.tar.gz 886341

dwarf_srclines() was leaking memory.

libdwarf-20061206.tar.gz 886388

dwarf_frame.c _dwarf_exec_frame_instr() was still using fixed register table sizes. Now uses run-time sizing. Thanks to Peter Lloyd for noticing a <= where a < was wanted in that routine.

libdwarf-20061108.tar.gz 885908

Previously, producer code would coredump if dwarf_add_expr_gen() called with DW_OP_deref_size, DW_OP_xderef_size, or DW_OP_pick as the operator.

libdwarf-20060925.tar.gz 893251

An unusual sequence of dwarf_next_cu_header() calls could result in dwarf_offdie() returning the wrong die. The problem is not visible in dwarfdump output as dwarfdump does not use a call sequence that could show the problem.

libdwarf-20060614.tar.gz 892429

dwarfdump: Minor cleanup of gnu eh_frame augmentation data output. libdwarf: Correct the handling of DW_EH_PE_pcrel flag in code dealing with gnu eh_frame z augmentation (errors were noticed in .eh_frame output by libdwarf/dwarfdump for x86_64). The 'clean' rule of the Makefile now removes libdwarf.so if libdwarf.so is present in the build directory.

libdwarf-20060612.tar.gz 878865

dwarfdump: When (as for DW_FORM_data1) the form does not indicate signedness and dwarfdump does not keep track of enough context to determine signedness and the value is such the signedness is unclear, print the value as unsigned followed by signed. An example is "182(as signed = -74)".

libdwarf-20060421.tar.gz 877722

libdwarf: fixed bad initialization in dwarf_get_fde_info_for_all_regs(). Thanks to Cristi Vlasceanu for noticing it was broken.

libdwarf-20060419.tar.gz 877465

dwarfdump: added fclose() on configuration file. dwarfdump and libdwarf: all .c files now formatted with GNU indent default formatting.

libdwarf-20060418.tar.gz 878784

dwarfdump (and libdwarf frame reader) are now configurable at run time to print frame data appropriately. So -f and -F will print register names appropriate for the ABI, and handle large or small register sets sensibly. (A single dwarfdump executable can print any number of different ABIs frame data appropriately without recompiling libdwarf or dwarfdump -- and you can add your favorite ABI/instruction set into a configuration file.) See -x abi=<name> and the dwarfdump.conf file to get started. New frame interfaces are in libdwarf. See libdwarf2.1.ps (postscript) for details on the new DWARF3 libdwarf frame interfaces.

libdwarf-20060327.tar.gz 844193

Initializes file_entry_count in dwarf_line.c now.

libdwarf-20060324.tar.gz 844113

Corrects line table problems handling gcc3/gcc4 output. Refactored line-table-header reading into a single routine. Fixed typo that made access to .eh_frame impossible. 844110 byte version of this file was missing dwarf.h fixes (nothing substantive, just moving things for human readers). 844149 byte version is correct but rcs version strings not all updated. 844113 byte version is the 'final' version. file_entry_count in dwarf_line.c is uninitialized (BUG!). Initialize it to 0 for correct operation. Thanks to Mikael Vidstedt for noticing. WITHDRAWN.

libdwarf-20060317.tar.gz 841545

Now handles gcc's DWARF3 and eh_frame sensibly. Parts are untested as I have no test cases for various DWARF3 constructs.

libdwarf-20060308.tar.gz 834474

The crucial dwarf_child() code could dereference a byte off the end of a CU. Fixed. Refactored .debug_frame code for clarity, performance, elimination of duplicate code, and preparing to handle GNU eh_frame (support for latest eh_frame not yet present). Moved some sgi/irix only functions to separate source files so most apps will get fewer bytes of libdwarf linked in. If you have 834453 byte version, it is broken, delete it: revised to 834474 byte version.

libdwarf-20060224.tar.gz 827906

Added dwarf_line_srcfileno() function and documented it.

libdwarf-20051201.tar.gz 826422

Corrected validity-checking tables and made creation of internal tables more robust for dwarfdump -k.

libdwarf-20051128.tar.gz 824714

Corrected dwarf.h (per public review document). Added DWARF3 tags, attrs to validity-checking tables in dwarfdump (-k? options). WITHDRAWN. Bugs in -k output.

libdwarf-20051108.tar.gz 822758

Removed non-standard malloc.h includes (stdlib.h suffices). Corrected a couple dwarf3 omissions in dwarf.h.

libdwarf-20051024.tar.gz 822665

Added in the new DWARF3 codes specified in the DWARF3 public review document (now a finished standard) published on the DWARF committee website.

libdwarf-20051003.tar.gz 821184

Fixed an incompatibility: the July/August versions did not support exactly the same dealloc code as earlier versions for SGI-only dwarf sections like .debug_weaks. Full compatibility is restored, and the new more-complete-dealloc interfaces from July are kept.

libdwarf-20050801.tar.gz 820895

dwarfdump could coredump due to fixed length buffer overrun for location list printing. Buffer now expands as needed. And dwarfdump sprintf calls changed to snprintf for further safety.

libdwarf-20050722.tar.gz 819084

New deallocation routines for dwarf_srclines() and all the pubnames-like sections. New (optional at library-compile) full checking of dealloc calls. New support for .debug_pubtypes section (DWARF 3 section). All deallocation code verified, so all libdwarf memory leaks plugged (but client code must change to get full dealloc properly). dwarf_formstring() documentation was wrong: no dealloc required or allowed (documentation fixed).

libdwarf-20050714.tar.gz 807304

[This release not recommended. Certain memory leaks have been fixed. Use 20050722 instead]

libdwarf-20050503.tar.gz 801031

Moved common code into subroutine (for .debug_pubnames and like sections). Added checks for new gcc z* .eh_frame augmentation strings (which we don't yet handle, but do recognize now). Added -F flag for .eh_frame (making its handling a distinct flag (from -f)).

libdwarf-20050318.tar.gz 794541

Corrected handling of .eh_frame and .debug_macro. Radically changed the formatting of .debug_macro to make it more complete. Still lacking support for dwarf3 frame operations.

libdwarf-20050216.tar.gz 792579

Beginning of support for dwarf3 reading. Added #elif in pro_incl.h so another platform builds out-of-the-box, even missing elf.h. (The library remains firmly Elf specific though. In this specific added allowance libelf.h fills in the types.)

libdwarf-20041122.tar.gz 792298

Updated configury for debian/mips.

libdwarf20041027.tar.gz 791001

Updated dwarf.h, adding #define for HP and GNU attributes/tags.

libdwarf20041026.tar.gz 790070

Regenerate configure config.h.in (using autoconf 2.58). Update config.guess config.sub.

libdwarf20041011.tar.gz 785822

Sets ru_offset (libdwarf) now when it was overlooked before. Avoids recursion in favor of iteration (dwarfdump) on siblings.

libdwarf20040507.tar.gz 785289

dwarfdump -k a would coredump dwarfdump: getopt arg list was wrong.

libdwarf20040315.tar.gz 785268

For DW_CFA_def_cfa_register, the dwarf reader was setting more than just the register: was zeroing offset. Now it just sets the register value.

libdwarf20040203.tar.gz 785224

If compiled with Dwarf_Word 64 bits, upper bits of values from two 'optimization' macros were erroneous. Revised the macros to call already existing routines.

libdwarf20040115.tar.gz 785181

Changed from bzero() to memset() calls for portability. Removed #include of bstring.h, no longer needed. Added check for alloca.h in configure. Temporarily unavailable.

libdwarf20040102.tar.gz 784278

Updated configure scripts and added README hints. Recent RedHat and Debian don't ship with libelf.h giving folks trouble. And anyway the configure stuff was really old/obsolete.

libdwarf20031230.tar.gz 733009

Corrected typo in comment, fixed botch in .eh_frame section recognition.

libdwarf20031006.tar.gz 732757

Applied indent(1) to recently changed files.

libdwarf20031002.tar.gz 733758

Adds support for the .debug_loc section. DW_FORM_indirect support fixed. Allows padding at the end of .debug_pubnames .debug_aranges and the like (the data has a 'terminator' and the header has a length, and if the length allows a bit of padding after the terminator that's ok).

libdwarf2003Apr06.tar.gz 717884

Now delays loading sections till really required. Supporting the DWARF2 Debugging Information Format produced by a variety of compilers, with some limited support for some aspects of DWARF3.

libdwarf2002Nov22.tar.gz 722257 Adds support for printing macro sections. Corrects spellings of a couple TAGs. Adds UPC (Universal Parallel C) user-space defines. The awk scripts in dwarfdump now allow multiple TAG names with the same value to be handled: the first such encountered is taken as the name dwarfdump uses. For example, DW_TAG_template_type_parameter and DW_TAG_template_type_param were both used in the DWARF2 spec, and now dwarf.h allows both spellings by having two #defines with the same value (DWARF3 specifies that DW_TAG_template_type_parameter is the correct spelling).
libdwarf2002Oct23.tar.gz 721083 Bug fixes (to consumer and producer libraries) plus making dwarf_get_str() in the library work sensibly (revision of the functional interface).
libdwarf2002April28.tar.gz 717884 Many bug fixes...
libdwarf2001Aug29.tar.gz 721452 Early release with dwarfdump.
libdwarf2000Jun12.tar.gz 713543 Early release with dwarfdump.
libdwarf2001Jun07.tar.gz 716508 Early release with dwarfdump.
libdwarf2001May23.tar.gz 716027 Early release with dwarfdump.
libdwarf2000Jul25.tar.gz 712694 The source changed from original SGI release terms to LGPL terms (standard GPL/LGPL but naming SGI as copyright holder) in April 2000, so this is the first public release (that I know of/have a copy of) with the new terms.
libdwarf1999Dec14.tar.gz 712252 Early release with dwarfdump.
1999 ? First libdwarf with configure script, late June 1999.
1999 ? First release including dwarfdump sometime after March 1999.
1994 ? Initial release of libdwarf (no dwarfdump, no configure script), likely was in June 1994. The original copyright terms were unique to SGI and required certain acknowledgements in documentation by organizations shipping libdwarf.

For a few obsolete releases of libdwarf see ftp://ftp.sgi.com/sgi/dev/davea. Copies of the libdwarf releases on ftp.sgi.com are available in the list above.

Another Document

A comparison of DWARF3 with DWARF2 updated December 1, 2005, titled "DWARF3: Better than DWARF2" (pdf, 81736 bytes) might be of historical interest. The source code is available here written in lyx ( using lyx as an experiment in evaluating the lyx document preparation system).

[top]

Creative Commons License
This work is licensed under a Creative Commons Attribution 4.0 International License.