| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332 |
- 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>
|