This is the public release of libelf-0.8.2, 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.2; ./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. 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 you can build and install a shared libelf library. To do this, pass ``--enable-shared'' to configure. Another configure option, ``--enable-debug'', adds debugging code to libelf; if you don't run into problems, you will probably not need it. If you build a shared library and want it to be installed as ``libelf-0.8.2.so'' rather than ``libelf.so.0.8.2'', please use ``./configure --enable-shared --enable-gnu-names''. Other files, e.g. ``libelf.so'' and ``libelf.so.0'' are NOT affected. 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. *** 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. *** 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.sco.com/developer/devspecs/gabi41.pdf and http://www.sco.com/developer/gabi/contents.html are probably good starting points. * The COFF file format is not understood. * 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 support Solaris' `Move' and `Syminfo' sections. 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://sunsite.unc.edu/pub/Linux/libs/ http://www.stud.uni-hannover.de/~michael/software/ Michael "Tired" Riepe <michael@stud.uni-hannover.de> <michael@han.de>