This is the public release of libelf-0.8.13, a free ELF object
file access library. If you have problems with applications
that use libelf and work with the commercial (SVR4, Solaris)
version but not with this one, please contact me.

IMPORTANT NOTE: If you have libelf-0.5.2 installed, you probably
have a file .../include/elf.h that contains the single line
``#include <libelf/elf.h>''. REMOVE THIS FILE BEFORE YOU RUN
configure.

Installation is straightforward - the package is autoconf'ed.  Just do
``cd libelf-0.8.13; ./configure; make; make install''.  Header files
will be installed in .../include/libelf/.  If your system does not
provide its own versions of libelf.h, nlist.h or gelf.h, ``make
install'' will add the missing headers.  If you prefer not to have
these files installed in /usr/include, use ``--disable-compat'' and
add ``-I /usr/include/libelf'' to your CFLAGS when compiling
libelf-based programs.

Note to distribution makers:  You can install libelf in a separate root
hierarchy by using the command ``make instroot=/my/root install''.
You should also use the ``--enable-compat'' configure option in that
case, or run ``make instroot=/my/root install-compat'' manually, to
install all the required header files.

If you are running Linux with libc 5.* as the default C library,
and you plan to use the 64-bit functions, you must either use
``-I.../include/libelf'', or remove /usr/include/libelf.h and use
``--enable-compat'' when running configure. Libc 6.* (aka glibc2)
doesn't have its own <libelf.h>, <nlist.h> or <gelf.h>.

You need an ANSI/ISO C compiler to build libelf. Gcc is optimal.

On some systems (in particular, Solaris and all variants of Linux),
``make'' will try to build a shared library. If you run into problems
on your system, please pass ``--disable-shared'' to configure.
If you build a shared library and want it to be installed as
``libelf-0.8.13.so'' rather than ``libelf.so.0.8.13'', please use
``./configure --enable-gnu-names''. Other files, e.g. ``libelf.so'' and
``libelf.so.0'' are NOT affected.

Another configure option, ``--enable-debug'', adds debugging code to
libelf; if you don't run into problems, you will probably not need it.

When creating an ELF shared library, it is possible to add references
to other shared libraries in the DYNAMIC section of the resulting
file. The make variable DEPSHLIBS contains a list of libraries to add.
It is set to ``-lc'' on Linux systems, and empty otherwise. To
override this setting, use something like ``make DEPSHLIBS="-la -lb"''.
For Linux, `-lc' is included automagically.

NLS is available and enabled by default.  To turn it off, pass the
``--disable-nls'' option to configure.

Libelf can use gettext or catgets for accessing message
catalogs.  If gettext is available AND is part of libc (i.e. not
in a separate library), it will be used. Otherwise, configure
will look for catgets.  If you have gettext in a separate
library and want to use it, you should pass the library's name
to configure, e.g. ``LIBS=-lintl ./configure''. Note that you
MUST link your libelf-based applications with -lintl then,
which is probably not what you want, or change the DEPSHLIBS variable
described above (in case you're building a shared library).

If you have GNU gettext 0.10 installed on your system, and if GNU gettext
runs on top of the catgets interface (rather old Linux systems, using
libc5), configure will refuse to use it and use catgets instead. If you
absolutely want to use GNU gettext, go ahead and rebuild it (which is
IMHO a good idea in general in this case):

	cd .../gettext-0.10
	ac_cv_func_catgets=no ac_cv_func_gettext=no ./configure
	make
	make install

After that, return to the libelf build directory, remove
config.cache, and start over.

*** Large File Support (LFS) applications ***

Some 32-bit systems support files that are larger than the address space
of the architecture.  On these, the `off_t' data type may have 32 or
64 bits, depending on the API you choose.  Since off_t is also part of
the libelf API, in particular the Elf_Data and Elf_Arhdr structures,
an application compiled with large file support will need a version of
libelf that has also been compiled with LFS; otherwise, it won't work
correctly.  Similarly, a program compiled without LFS needs a library
compiled without LFS.

Note that libelf is currently unable to process large files on 32-bit
architectures, whether you compile it for LFS or not, for the simple
reason that the files won't fit into the processes' address space.
Therefore, libelf is compiled without LFS by default.  It can of course
read and write ELF files for 64-bit architectures, but they will be
limited in length on a 32-bit system.

You may compile libelf with large file support by setting CPPFLAGS at
configuration time:

	CPPFLAGS=`getconf LFS_CFLAGS` ./configure

But I really, really recommend you don't, because it breaks binary
compatibility with existing libelf based applications.

*** 64-bit support ***

Starting with libelf-0.7.0, libelf also supports 64-bit ELF files.
This is enabled by default unless your system (or your compiler) does
not support 64-bit integers, or lacks 64-bit declarations in <elf.h>.
If you have problems building with 64-bit support, please do

    ./configure --disable-elf64

for the moment, and contact me. Please note that I haven't tested 64-bit
support much.  There are still some unresolved problems, e.g. IRIX
uses different Elf64_Rel and Elf64_Rela structures (they replaced the
r_info member), and the enumeration values for Elf_Type differ from
the commercial (SVR4) implementation of libelf - they broke binary
compatibility for no good reason, and I'm not willing to follow their
footsteps. The result is that libelf-0.7.* ist upward compatible with
libelf-0.6.4 (as it should be) but INCOMPATIBLE WITH SVR4 LIBELF. If you
have both versions installed, you'd better make sure that you link with
the library that matches the <libelf.h> you're #include'ing.

*** Symbol Versioning ***

Libelf >= 0.8.0 supports the data structures and definitions used for
symbol versioning on Solaris and Linux, in particular, the Elfxx_Verdef,
Elfxx_Verdaux, Elfxx_Verneed, Elfxx_Vernaux and Elfxx_Versym structures
and the SHT_XXX_verdef, SHT_XXX_verneed and SHT_XXX_versym section types
(where `xx' is either `32' or `64', and `XXX' is either `SUNW' or `GNU').
Libelf now translates versioning sections to/from their external
representation properly (earlier versions left them in `raw' format,
with the data type set to ELF_T_BYTE).  This may cause problems on
systems which use the same (OS-specific) section types for different
purposes.  The configure program tries to figure out if your OS uses
versioning; if that check fails, you can use

    ./configure --disable-versioning

to turn off versioning translation support.

*** W32 Support ***

There is now some support for building on W32 systems (requires Microsoft
VC++).  In order to build a W32 DLL, cd into the `lib' subdirectory, edit
build.bat if necessary (it needs the path to your compiler binaries) and
run it.  If you're lucky, libelf.dll and the import/export libraries will
be built.  If not, please drop me a line.

I tested it on XP Pro (SP2), using VC++ 2005 Express Edition.
Apparently, Visual Studio .NET 2003 works fine as well.

Various notes regarding the W32 port:

    - When you open() an ELF file, remember to use the O_BINARY flag.
    - You may have to add /MD to the linker command line.

*** Missing things ***

	* There is no documentation.  You can use the Solaris
	  manpages instead (available at http://docs.sun.com/).
	  The ELF file format is described in several places;
	  among them Suns "Linker and Libraries Guide" and the
	  "System V Application Binary Interface" documents;
	  http://www.caldera.com/developer/devspecs/gabi41.pdf and
	  http://www.caldera.com/developer/gabi/ are probably good
	  starting points. Processor-specific documentation is spread
	  across a number of `Processor Supplement' documents, one
	  for each architecture; you'll have to use a search engine to
	  find them.

	* The COFF file format is not understood. This is so obsolete
	  that it will probably never be implemented.

	* nlist(3) is incomplete; the n_type and n_sclass
	  members of struct nl are set to zero even if type
	  (that is, debug) information is available.

	* Libelf does not translate Solaris' `Move' and `Syminfo'
	  sections. You can read them using elf_getdata(), but you'll
	  only get raw (untranslated) bytes.

Changes since 0.8.12:

	* New function elf_getaroff().

	* Build fixes.

Changes since 0.8.11:

	* Due to some unfortunate confusion, the elf_getphnum(),
	  elf_getshnum() and elf_getshstrndx() are not compatible
	  between libelf implementations. Therefore, the developers
	  decided to replace them with new functions: elf_getphdrnum(),
	  elf_getshdrnum() and elf_getshdrstrndx(), which will always
	  return -1 on failure and 0 on success. Code using the old
	  interface should be upgraded to increase portability.

Changes since 0.8.10:

	* Fixed a bug in elf_rawfile().
	* If you use ELF_F_LAYOUT together with ELF_F_LAYOUT_OVERLAP,
	  elf_update() will now tolerate overlapping sections.

Changes since 0.8.9:

	* Ported to QNX Neutrino.
	* Fixed Windows build errors.
	* Parallel (make -j) installation should work now.

	* It's now possible to enable and disable select sanity checks
	  libelf performs. Currently, this affects the "NUL terminated
	  string table entry" check performed in elf_strptr(). By
	  default, the function will return an error if the string
	  requested is not properly terminated - because some
	  applications might dump core otherwise. If you configure
	  libelf with `--disable-sanity-checks', however, the check
	  (and, in the future, probably others as well) is disabled
	  by default. You can still turn it on and off at runtime by
	  setting the LIBELF_SANITY_CHECKS environment variable to
	  an integer value:

	      # disable all sanity checks
	      export LIBELF_SANITY_CHECKS=0

	      # enable all sanity checks
	      export LIBELF_SANITY_CHECKS=-1

	  Each bit of the value corresponds to a particular check,
	  so you could use LIBELF_SANITY_CHECKS=1 to enable only
	  the elf_strptr() check. You may also use a value in hex
	  (0x...) or octal (0...) format.
 
Changes since 0.8.8:

	* Improved translator for symbol versioning sections.
	* The W32 library is now built in the `lib' subdirectory.
	* Windows DLLs should work now.

Changes since 0.8.6:

	* added elf_getphnum().
	* added elf_getshnum().
	* added elf_getshstrndx().
	* added elfx_update_shstrndx().
	* handle interrupted reads/writes more gracefully.
	* added (partial) support for unusual e_[ps]hentsize values.
	* fixed the bugs introduced in 0.8.7.

Changes since 0.8.5:

	* added W32 support.
	* added workaround for alignment errors in archive members.
	* my email address has changed again ;)

Changes since 0.8.4:

	* elf_strptr() should now work more safely with fragmented
	  or badly formatted string tables.

Changes since 0.8.3:

	* Fixed a bug in elf_update() that was introduced in 0.8.3.

Changes since 0.8.2:

	* Should compile on MacOSX now.

	* Can read and write files with more than 65280 sections

	* Tries to handle 64-bit ELF files that use 8-byte hash table
	  entries. In particular, libelf tries to guess the data type in
	  elf_getdata(), and doesn't override sh_entsize in elf_update()
	  any longer. If you want the library to pick the entry size,
	  you must set its value to 0 before you call elf_update().

	* No longer dumps core in elf_update() when a versioning section
	  has no data. Instead, it returns an error message. Note that
	  you're supposed to provide a valid d_buf for any section, unless
	  it's empty or has SHT_NOBITS type.

	* Building a shared library is now the default (if supported).

Changes since 0.8.0:

	* Corrected typo in lib/{32,64}.xlatetof.c that sometimes
	  caused a compilation failure.

	* Use open(name, O_RDONLY|O_BINARY) in lib/nlist.c.

Changes since 0.7.0:

	* I implemented the gelf_* interface, as found on Solaris.
	  I don't know whether it's compatible -- the Solaris manpage
	  isn't very specific, so I had to guess return values etc. in
	  some cases.

	* Added elf{32,64}_checksum (supposed to be compatible with
	  Solaris).

	* Added symbol versioning support.

Changes since 0.6.4:

	* Fixed configure for IRIX systems
	* Added check for truncated archive members
	* Added check for misaligned SHDR/PHDR tables
	* Support for building libelf together with GNU libc
	* Added elf_memory(3)
	* Added 64-bit support

Changes since 0.5.2:

	* some bug fixes
	* mmap support
	* new directory layout
	* There is a new function, elf_delscn(), that deletes
	  a section from an ELF file. It also adjusts the
	  sh_link and sh_info members in the section header
	  table, if (and ONLY if) the ELF standard indicates
	  that these values are section indices. References
	  to the deleted section will be cleared, so be careful.
	* my email address has changed ;)

Where to get libelf:

	ftp://ftp.ibiblio.org/pub/Linux/libs/
	http://www.mr511.de/software/

Michael "Tired" Riepe
<libelf@mr511.de>
