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