summaryrefslogtreecommitdiff
path: root/libdwarf/README
diff options
context:
space:
mode:
Diffstat (limited to 'libdwarf/README')
-rw-r--r--libdwarf/README199
1 files changed, 199 insertions, 0 deletions
diff --git a/libdwarf/README b/libdwarf/README
new file mode 100644
index 0000000..bf96a58
--- /dev/null
+++ b/libdwarf/README
@@ -0,0 +1,199 @@
+To build libdwarf.a, type
+ ./configure
+ make
+To build libdwarf.so, type
+ ./configure --enable-shared --disable-nonshared
+ make
+To build both, type
+ ./configure --enable-shared
+ make
+
+No real install target is provided here, so 'make install' does
+not do much. One can copy either or both of libdwarf.a libdwarf.so
+to somewhere fairly standard (but intended for software you build)
+like '/usr/local/lib'. Or anywhere else you want to copy it.
+
+To use dwarf or libdwarf, you may want to copy dwarf.h and
+libdwarf.h somewhere convenient (possibly /usr/local/include),
+and you may need to copy the libdwarf to a convenient spot
+(/usr/local/lib is a traditional place for libraries one builds
+oneself on Unix and Linux).
+This copying is not needed to build dwarfdump.
+
+
+Multi Threading, or using threads with libdwarf (Thread Safety):
+ Nothing in libdwarf does any locking. Every Dwarf_Debug
+ (such as returned by dwarf_init()) is fully independent
+ of all other Dwarf_Debug-s. However, calls to libdwarf can
+ change a Dwarf_Debug. So it is unsafe to have two different
+ threads accessing a single Dwarf_Debug simultaneously.
+ It is therefore sufficient to ensure than any one Dwarf_Debug
+ is only accessed from a single thread.
+
+Warnings like
+ "warning: cast from pointer to integer of different size"
+at compile time are to be expected in dwarf_frame.c and
+dwarf_frame2.c. Do not be alarmed.
+
+If your headers are not in the expected places,
+use the make command line to add flags and include directories.
+For example
+ ./configure
+ PREINCS="-I /usr/local/share/include" POSTINCS="-I /home/x/include" make
+PREINCS content is inserted before CFLAGS as make(1) is running.
+POSTINCS content is added after the CFLAGS value.
+
+To set LDFLAGS (which is used when building a .so and
+in building gennames to create some source here),
+do so at configure time, for example:
+ ./configure LDFLAGS="-L /var/tmp"
+Or use PRELIBS and/or POSTLIBS at 'make' time similar to the use
+of PREINCS and POSTINCS.
+
+If you are using the old frame interfaces and depend on
+the use of DW_FRAME_CFA_COL you must add --enable-oldframecol
+to the ./configure options to configure libdwarf.
+See NEWS and libdwarf2.1.mm/pdf .
+
+To generate SGI IRIX 64 bit offsets (in the producer code)
+configure with --enable-dwarf-format-sgi-irix.
+To configure with only 32bit offsets (aka DWARF2) configure
+with --enable-dwarf-format-strict-32bit.
+By default the producer now generates 32bit offsets by default
+but one can turn on DWARF3 64bit offset generation at runtime by ORing
+DW_DLC_OFFSET_SIZE_64 onto the flags in the call to
+dwarf_producer_init() (or dwarf_producer_init_b) [when the
+address size is specified as 64 bit].
+
+Mac OSX (June 2010): Since MacOSX does not use elf, there is no elf.h
+header in the headers provided on MacOSX.
+Use a search engine (like google) to find an elf.h you can use.
+http://www.rockbox.org/tracker/9006?getfile=16683
+might be useful.
+In addition, the archive (ar) program on MacOSX does not
+automatically generate some data so modify the generated
+Makefile to add -s to the options to ar.
+
+To enable dection of Windows pathnames as full paths
+add --enable-windowspath. Doing this does mean things like
+A:foo and \anything are treated as full paths (these are
+unlikely path names on a POSIX system but are legal
+POSIX partial paths).
+
+It is possible to request a shared library (libdwarf.so) build with
+ --enable-shared
+To turn off the build of the archive library (libdwarf.a) specify
+ --disable-nonshared
+but in this case you must specify --enable-shared or nothing will
+build!
+
+TARGET DEPENDENCIES of .debug_frame:
+dwarf.h
+ These should be revised if you have more than the defined
+ 63 'normal' registers. It's not harmful to have these too large!
+ Too small will lead to errors reading .debug_frame and .eh_frame.
+ DW_FRAME_HIGHEST_NORMAL_REGISTER
+ DW_FRAME_LAST_REG_NUM
+
+ These you might revise, but can safely ignore if simply
+ using dwarfdump. If using the producer code you will want
+ to get these exactly right for your architecture.
+ DW_FRAME_RA_COL
+ DW_FRAME_STATIC_LINK
+ DW_FRAME_CFA_COL
+
+libdwarf.h
+ The DW_FRAME_REG_INITIAL_VALUE #define should be set to
+ the value appropriate to your architecture. See libdwarf.h
+ for details.
+
+ If DW_REG_TABLE_SIZE is not set large enough attempts to
+ fill in the .debug_frame tables will get an error.
+ Should be at least as large as DW_FRAME_LAST_REG_NUM.
+ If it's too large nothing is harmed (but some extra space taken
+ at run time).
+
+If your printf does not support C standard %llx etc,
+(such as MSWindows with long long), configure
+option --enable-nonstandardprintf
+and defines like DW_PR_DUx etc in libdwarf.h
+provide a way to configure for that relatively easily.
+
+
+The .debug_frame is so very architecture dependent
+and because the host (where libdwarf/dwarfdump are executed)
+and target (the objects read) could be different.
+It's currently not supported to have dwarfdump/libdwarf determine
+the architecture on-the-fly and do-the-right-thing.
+Just setting DW_FRAME_LAST_REG_NUM and DW_FRAME_HIGHEST_NORMAL_REGISTER
+and DW_REG_TABLE_SIZE high enough will likely suffice for most
+purposes and most compilers/architectures..
+See comments in dwarf.h/libdwarf.h.
+
+It's perfectly safe to ignore the above suggestions as long
+as libdwarf does not get a DW_DLE_DF_REG_NUM_TOO_HIGH error.
+(which would only happen on reading .debug_frame or .eh_frame data).
+
+If you intend to use the libdwarf dwarf-producer code
+for .debug_frame information
+you must do a thorough analysys and revise dwarf.h
+substantially to match the output target architecture.
+
+In general, in the producer code, numbers are copied from and
+to integers with memcpy(). In case of endianness problems,
+constants set in dwarf_producer_init() can fix the problems.
+If one wants to produce a *different-endian* output the best
+solution is to change the integer memcpy calls to call thru a
+new dbg-based function pointer and have it 'do the right thing'
+to adjust endianness. Set the function pointer correctly in
+dwarf_producer_init() and the rest of the code will just call
+thru the function pointer. Tedious work to find and change the
+memcpy calls to be dbg->de_memcpy(), but once done the code is
+no longer endian dependent (right now there is no way to ask
+for cross-endian: a new flag needed or ?).
+
+leb128 numbers are endian-independent, so nothing need be
+done with those for cross-endian support (the storage
+of leb128 on disk is always little-endian).
+
+The .ps files are postscript. So those who cannot deal with mm
+format files but do have a postscript printer (or have
+ghostscript) can print the documents.
+This form was chosen before pdf format existed...
+
+libdwarf2.1.pdf documents a way for a debugger to read dwarf information.
+libdwarf2p.1.pdf documents a way for a compiler to generate dwarf information.
+dwarf.v2.pdf documents Dwarf Version 2.
+index.v2.pdf is an index to dwarf.v2.ps.
+indexDW.v2 is a plain text index of dwarf #defines to dwarf.v2.ps
+mips_extensions.ps documents the mips/sgi extensions to dwarf.
+
+See the Makefile for the commands used to build pdf files
+libdwarf.2.1.pdf and libdwarf1p.1.pdf.
+
+pic is a picture processing tool (ATT command).
+tbl is a table-processing tool.
+(part of Documentor's Work Bench on ATT-like systems).
+tbl and pic are available on linux.
+
+psroff is a name for a troff-like processor, part of
+Documentor's Work Bench on IRIX. Substitute a
+troff-like or nroff-like processor (GNU groff works fine).
+
+The index.v2.mm was generated by the dwarf-document writer
+using some local ATT/USL tools (which neither SGI
+nor the open-source community generally has, so
+there is no way I know of to regenerate this).
+
+To use dwarf or libdwarf, you may want to install dwarf.h and
+libdwarf.h somewhere convenient.
+
+You will also need libelf (libelf.a and/or libelf.so) and
+libelf.h installed. These are available from GNU repositories
+and from the normal Linux repositories for Linux releases.
+On Ubuntu 20/04 for example:
+ sudo apt-get install libelf-dev libelf1
+
+$Source: /home/davea/dwarf/dwarf-working/trunk/libdwarf/README,v $
+$Revision: 1.1 $
+$Date: 2009/11/23 17:15:37 $