summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Pashev <pashev.igor@gmail.com>2012-09-04 18:09:07 +0400
committerIgor Pashev <pashev.igor@gmail.com>2012-09-04 18:09:07 +0400
commitea8b1f90d46279d7814a0c7f6b6742d3fab034f7 (patch)
treed626f0ab0d0016423d9ac76473ec928c231b91a5
downloadlibelf-ea8b1f90d46279d7814a0c7f6b6742d3fab034f7.tar.gz
Imported Upstream version 0.8.13upstream
-rw-r--r--COPYING.LIB481
-rw-r--r--ChangeLog1435
-rw-r--r--INSTALL176
-rw-r--r--MANIFEST96
-rw-r--r--Makefile.in198
-rw-r--r--README332
-rw-r--r--VERSION1
-rw-r--r--acconfig.h89
-rw-r--r--aclocal.m4336
-rwxr-xr-xconfig.guess1459
-rw-r--r--config.h.in151
-rwxr-xr-xconfig.sub1549
-rwxr-xr-xconfigure3910
-rw-r--r--configure.in379
-rwxr-xr-xinstall-sh119
-rw-r--r--lib/32.fsize.c155
-rw-r--r--lib/32.getehdr.c56
-rw-r--r--lib/32.getphdr.c56
-rw-r--r--lib/32.getshdr.c58
-rw-r--r--lib/32.newehdr.c80
-rw-r--r--lib/32.newphdr.c118
-rw-r--r--lib/32.xlatetof.c438
-rw-r--r--lib/64.xlatetof.c512
-rw-r--r--lib/Makefile.in278
-rw-r--r--lib/Makefile.w32166
-rw-r--r--lib/assert.c33
-rw-r--r--lib/begin.c429
-rw-r--r--lib/build.bat36
-rw-r--r--lib/byteswap.h95
-rw-r--r--lib/checksum.c178
-rw-r--r--lib/cntl.c71
-rw-r--r--lib/config.h.w32161
-rw-r--r--lib/cook.c501
-rw-r--r--lib/data.c36
-rw-r--r--lib/elf_repl.h996
-rw-r--r--lib/end.c118
-rw-r--r--lib/errmsg.c77
-rw-r--r--lib/errno.c32
-rw-r--r--lib/errors.h100
-rw-r--r--lib/ext_types.h334
-rw-r--r--lib/fill.c29
-rw-r--r--lib/flag.c92
-rw-r--r--lib/gelf.h155
-rw-r--r--lib/gelfehdr.c140
-rw-r--r--lib/gelfphdr.c148
-rw-r--r--lib/gelfshdr.c125
-rw-r--r--lib/gelftrans.c407
-rw-r--r--lib/getarhdr.c37
-rw-r--r--lib/getaroff.c40
-rw-r--r--lib/getarsym.c87
-rw-r--r--lib/getbase.c33
-rw-r--r--lib/getdata.c157
-rw-r--r--lib/getident.c48
-rw-r--r--lib/getscn.c48
-rw-r--r--lib/hash.c38
-rw-r--r--lib/input.c106
-rw-r--r--lib/kind.c33
-rw-r--r--lib/libelf.def82
-rw-r--r--lib/libelf.h305
-rw-r--r--lib/memset.c53
-rw-r--r--lib/ndxscn.c33
-rw-r--r--lib/newdata.c56
-rw-r--r--lib/newscn.c145
-rw-r--r--lib/next.c42
-rw-r--r--lib/nextscn.c54
-rw-r--r--lib/nlist.c253
-rw-r--r--lib/nlist.h48
-rw-r--r--lib/opt.delscn.c205
-rw-r--r--lib/private.h446
-rw-r--r--lib/rand.c43
-rw-r--r--lib/rawdata.c89
-rw-r--r--lib/rawfile.c54
-rw-r--r--lib/strptr.c150
-rw-r--r--lib/swap64.c81
-rw-r--r--lib/sys_elf.h.in130
-rw-r--r--lib/sys_elf.h.w32130
-rw-r--r--lib/update.c1021
-rw-r--r--lib/verdef.h241
-rw-r--r--lib/verdef_32_tof.c53
-rw-r--r--lib/verdef_32_tom.c53
-rw-r--r--lib/verdef_64_tof.c53
-rw-r--r--lib/verdef_64_tom.c53
-rw-r--r--lib/verneed.h245
-rw-r--r--lib/version.c44
-rw-r--r--lib/x.elfext.c190
-rw-r--r--lib/x.movscn.c112
-rw-r--r--lib/x.remscn.c119
-rw-r--r--libelf.pc.in12
-rwxr-xr-xmkinstalldirs35
-rw-r--r--po/Makefile.in184
-rw-r--r--po/de.gmobin0 -> 8748 bytes
-rw-r--r--po/de.msg1
-rw-r--r--po/de.po345
-rw-r--r--po/gmo2msg.c121
-rw-r--r--po/libelf.pot321
-rw-r--r--po/stamp-po1
-rw-r--r--stamp-h.in1
97 files changed, 23152 insertions, 0 deletions
diff --git a/COPYING.LIB b/COPYING.LIB
new file mode 100644
index 0000000..92b8903
--- /dev/null
+++ b/COPYING.LIB
@@ -0,0 +1,481 @@
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL. It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it. You can use it for
+your libraries, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library. If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software. To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+ Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs. This
+license, the GNU Library General Public License, applies to certain
+designated libraries. This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+ The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it. Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program. However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+ Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries. We
+concluded that weaker conditions might promote sharing better.
+
+ However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves. This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them. (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.) The hope is that this
+will lead to faster development of free libraries.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+ Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License"). Each licensee is
+addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ c) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ d) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the Free
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..e9b5621
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,1435 @@
+Sun Nov 1 14:08:47 CET 2009, Michael Riepe <libelf@mr511.de>
+
+ * README:
+ * VERSION:
+ update for 0.8.13 release.
+ * libelf.pc.in:
+ add -I${includedir}.
+ * lib/begin.c:
+ * lib/private.h:
+ move archive related declarations.
+ * lib/elf_repl.h:
+ disable Elf64_Cap for 32-bit build.
+ * lib/getaroff.c:
+ new file.
+ * lib/Makefile.in:
+ * lib/Makefile.w32:
+ add getaroff.c.
+
+Tue Jul 7 19:45:12 CEST 2009, Michael Riepe <libelf@mr511.de>
+
+ * README:
+ * VERSION:
+ update for 0.8.12 release.
+
+ * lib/libelf.h:
+ * lib/x.elfext.c:
+ add new and deprecate old functions.
+
+Fri May 22 19:17:14 CEST 2009, Michael Riepe <libelf@mr511.de>
+
+ * README:
+ * VERSION:
+ update for 0.8.11 release.
+
+ * lib/libelf.h:
+ add ELF_F_LAYOUT_OVERLAP flag.
+
+ * lib/rawfile.c:
+ fix re-read zero size bug.
+
+ * lib/update.c:
+ honor ELF_F_LAYOUT_OVERLAP flag.
+
+Fri Sep 7 14:04:20 CEST 2007, Michael Riepe <libelf@mr511.de>
+
+ * acconfig.h:
+ add ENABLE_SANITY_CHECKS.
+
+ * aclocal.m4:
+ fix --enable-gnu-names.
+
+ * configure.in:
+ add --enable-sanity-checks.
+ fix --enable-extended-format.
+
+ * lib/data.c:
+ add _elf_sanity_checks variable.
+
+ * lib/private.h:
+ declare _elf_sanity_checks and constants.
+
+ * lib/strptr.c:
+ enable/disable sanity check.
+
+ * lib/version.c:
+ set _elf_sanity_checks from $LIBELF_SANITY_CHECKS.
+
+Fri Jun 29 23:27:15 CEST 2007, Michael Riepe <libelf@mr511.de>
+
+ * lib/Makefile.in:
+ improved make -jX patch.
+
+Wed Jun 20 08:04:30 CEST 2007, Michael Riepe <libelf@mr511.de>
+
+ * lib/Makefile.in:
+ add "make -jX install" patch by Joel Martin.
+
+Tue Nov 21 21:21:12 CET 2006, Michael Riepe <libelf@mr511.de>
+
+ * lib/Makefile.w32:
+ fix Windows compilation bug.
+
+Thu Sep 7 17:55:42 CEST 2006, Michael Riepe <libelf@mr511.de>
+
+ * acconfig.h:
+ * aclocal.m4:
+ * configure.in:
+ * lib/config.h.w32:
+ * lib/gelf.h:
+ * lib/private.h:
+ * lib/sys_elf.h.in:
+ * lib/sys_elf.h.w32:
+ port to QNX Neutrino, thanks to darkelf.
+
+Fri Aug 25 14:46:34 CEST 2006, Michael Riepe <libelf@mr511.de>
+
+ * Makefile.in:
+ add trackinstall target.
+
+Mon Aug 21 20:26:47 CEST 2006, Michael Riepe <libelf@mr511.de>
+
+ * Makefile.in:
+ drop w32 from DISTSUBDIRS.
+ * lib/Makefile.in:
+ add new files to DISTFILES.
+ * lib/Makefile.w32:
+ * lib/build.bat:
+ * lib/config.h.w32:
+ * lib/libelf.def:
+ * lib/sys_elf.h.w32:
+ adopted from w32 subdirectory.
+
+Fri Aug 18 02:04:58 CEST 2006, Michael Riepe <libelf@mr511.de>
+
+ * lib/begin.c:
+ let getnum return a size_t.
+ * lib/libelf.h:
+ replace __value because it's a reserved word in VC++ 2005.
+ * lib/nlist.c:
+ don't declare open() on W32.
+ * lib/private.h:
+ use <io.h> on W32.
+ * w32/Makefile.w32:
+ fix W32 DLL build.
+ * w32/build.bat:
+ add more examples for vcvars32.bat location.
+
+Fri Jul 28 00:56:00 CEST 2006, Michael Riepe <libelf@mr511.de>
+
+ * lib/32.xlatetof.c:
+ * lib/64.xlatetof.c:
+ check for dsize == -1.
+ * lib/verdef.h:
+ * lib/verneed.h:
+ improve section translators.
+
+Tue Jul 11 18:53:00 CEST 2006, Michael Riepe <libelf@mr511.de>
+
+ * w32/libelf.def:
+ add missing functions.
+
+Sat Jul 8 00:50:00 CEST 2006, Michael Riepe <libelf@mr511.de>
+
+ * VERSION:
+ bump up to 0.8.9.
+
+Sat Jul 8 00:17:00 CEST 2006, Michael Riepe <libelf@mr511.de>
+
+ * lib/32.newehdr.c:
+ make return value compatible with Solaris.
+ * lib/32.newphdr.c:
+ handle 65535+ segments.
+ make return value compatible with Solaris.
+ * lib/cook.c:
+ handle 65535+ segments.
+ * lib/elf_repl.h:
+ add new definitions.
+ * lib/libelf.h:
+ add/rename functions.
+ * lib/newscn.c:
+ fix section creation (was broken in 0.8.7).
+ * lib/private.h:
+ add SHN_XINDEX and PN_XNUM in case they're missing.
+ centrally define LIBELF_SUCCESS and LIBELF_FAILURE.
+ * lib/update.c:
+ handle 65535+ segments.
+ use elf->e_phnum internally.
+ * lib/x.elfext.c:
+ add elf_getphnum().
+ rename elfx_get_shnum() and elfx_get_shstrndx().
+ make return values compatible with Solaris.
+
+Fri Jul 7 19:01:04 CEST 2006, Michael Riepe <libelf@mr511.de>
+
+ * VERSION:
+ bump up to 0.8.8.
+
+Fri Jul 7 18:27:25 CEST 2006, Michael Riepe <libelf@mr511.de>
+
+ * lib/Makefile.in:
+ add lib/x.elfext.c.
+ * lib/libelf.h:
+ add functions from lib/x.elfext.c.
+ * lib/newscn.c:
+ simplify _elf_update_shnum().
+
+Tue Apr 25 16:26:39 CEST 2006, Michael Riepe <libelf@mr511.de>
+
+ * lib/gelf.h:
+ * lib/libelf.h:
+ * lib/nlist.h:
+ * lib/private.h:
+ add workaround for broken compilers.
+
+Mon Apr 24 16:24:32 CEST 2006, Michael Riepe <libelf@mr511.de>
+
+ * po/de.po:
+ update.
+
+Fri Apr 21 19:17:46 CEST 2006, Michael Riepe <libelf@mr511.de>
+
+ * acconfig.h:
+ * configure.in:
+ add --enable-extended-format.
+ * aclocal.m4:
+ search for msgmerge.
+ * lib/cook.c:
+ change _elf_item buffering.
+ handle extended format (with unusual entsize).
+ * lib/errors.h:
+ add ERROR_EHDR_SHENTSIZE and ERROR_EHDR_PHENTSIZE.
+ * po/Makefile.in:
+ use msgmerge instead of tupdate.
+
+Thu Oct 20 21:08:02 CEST 2005, Michael Riepe <libelf@mr511.de>
+
+ * lib/input.c:
+ * lib/update.c:
+ handle partial reads and writes.
+
+Tue Aug 16 01:48:17 CEST 2005, Michael Riepe <libelf@mr511.de>
+
+ * lib/begin.c:
+ add workaround for archive member misalignment.
+ * VERSION:
+ bump up to 0.8.7
+
+Tue Jul 19 11:56:26 CEST 2005, Michael Riepe <libelf@mr511.de>
+
+ * README:
+ * w32/build.bat:
+ update.
+ * w32/libelf.def:
+ fix syntax.
+
+Tue Jun 28 00:31:24 CEST 2005, Michael Riepe <libelf@mr511.de>
+
+ * Makefile.in:
+ remove superfluous slash.
+
+Tue Jun 21 03:58:47 CEST 2005, Michael Riepe <libelf@mr511.de>
+
+ * lib/Makefile.in:
+ get rid of lib/pic subdir.
+
+Sat May 21 17:39:28 CEST 2005, Michael Riepe <libelf@mr511.de>
+
+ * (global):
+ remove my e-mail address from all copyright clauses.
+
+Sun May 15 23:08:30 CEST 2005, Michael Riepe <libelf@mr511.de>
+
+ * configure.in:
+ check if $CC can copile <elf.h>.
+ * lib/private.h:
+ #include <stdint.h> before <sys/types.h> (fixes glibc bug).
+
+Sun May 8 23:40:35 CEST 2005, Michael Riepe <libelf@mr511.de>
+
+ * Makefile.in:
+ add instroot variable.
+ install libelf.pc.
+ * configure.in:
+ create libelf.pc.
+
+Sun Mar 20 15:41:22 CET 2005, Michael Riepe <libelf@mr511.de>
+
+ * (global):
+ change my e-mail address.
+
+Fri Jan 28 23:09:57 CET 2005, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * po/Makefile.in:
+ use modified gmo2msg.
+ * po/gmo2msg.c:
+ make gmo2msg output more portable.
+
+Thu Oct 7 11:37:09 CEST 2004, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/cook.c:
+ only use Elf64_Shdr if __LIBELF64 is true.
+
+Fri Sep 17 02:55:47 CEST 2004, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/elf_repl.h:
+ add some ABI and architecture definitions.
+ * w32/config.h:
+ manual update.
+
+Sat Jul 10 17:33:15 CEST 2004, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * acconfig.h:
+ * aclocal.m4:
+ * lib/errmsg.c:
+ check for dgettext, not for gettext.
+ * configure.in:
+ check for -lintl.
+ * po/Makefile.in:
+ use -lintl when building gmo2msg.
+
+Sun Jul 4 23:57:21 CEST 2004, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * Makefile.in:
+ add w32 subdir.
+ * README:
+ update for 0.8.6.
+ * configure.in:
+ create w32/Makefile.
+
+Sat Jul 3 20:42:00 CEST 2004, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/32.xlatetof.c:
+ * lib/64.xlatetof.c:
+ * lib/Makefile.in:
+ give up on <libelf_u.h>.
+ * lib/getarsym.c:
+
+Wed Jun 23 01:07:46 CEST 2004, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * config.guess:
+ * config.sub:
+ update from FSF.
+
+Tue May 4 22:02:01 CEST 2004, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * config.guess:
+ * config.sub:
+ update from FSF.
+
+Tue Mar 30 15:09:00 CEST 2004, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/32.xlatetof.c:
+ * lib/64.xlatetof.c:
+ * lib/Makefile.in:
+ use <libelf_u.h> to work around W32 compiler problems.
+
+Mon Feb 16 06:19:11 CET 2004, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * Makefile.in:
+ generate old-format tar file.
+
+Sat Jan 24 03:42:39 CET 2004, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/32.xlatetof.c:
+ * lib/64.xlatetof.c:
+ replace NULL with 0 -- some compilers don't like (void*).
+ * lib/getarsym.c:
+ * lib/nlist.c:
+ add cast to suppress compiler warning.
+
+Fri Jan 23 05:11:46 CET 2004, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/update.c:
+ #undef max before #define.
+
+Wed Jan 21 18:15:50 CET 2004, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/begin.c:
+ better support for Cygwin .lib archive files.
+
+Mon Jan 19 15:36:21 CET 2004, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/libelf.h:
+ * lib/memset.c:
+ include <stddef.h> unconditionally.
+
+Fri Jan 16 23:13:25 CET 2004, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * aclocal.m4:
+ support Intel C Compiler.
+ * lib/32.newehdr.c:
+ * lib/32.newphdr.c:
+ remove elf->e_free_ehdr and elf->e_free_phdr.
+ * lib/cook.c:
+ always allocate ehdr and phdr.
+ * lib/end.c:
+ always deallocate ehdr and phdr.
+ * lib/private.h:
+ remove elf->e_free_ehdr and elf->e_free_phdr.
+ change valid_type to suppress compiler warning.
+ * lib/update.c:
+ not necessary to update elf->e_ehdr and elf->e_phdr.
+
+Thu Jan 15 22:43:00 CET 2004, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * VERSION:
+ bump up to 0.8.6.
+ * configure.in:
+ check for __int64.
+ * lib/32.xlatetof.c:
+ * lib/64.xlatetof.c:
+ * lib/gelf.h:
+ * lib/nlist.h:
+ test _WIN32 macro.
+ * lib/begin.c:
+ add (off_t) cast to suppress compiler warning.
+ * lib/libelf.h:
+ * lib/memset.c:
+ conditionally include <stddef.h> for size_t.
+ * lib/nlist.c:
+ declare open() on W32 systems.
+
+Tue Dec 16 20:02:30 CET 2003, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * Makefile.in:
+ let disttest target make dist again.
+
+Sat Dec 13 16:14:31 CET 2003, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/update.c:
+ call lseek before ftruncate.
+
+Fri Dec 5 16:25:16 CET 2003, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * aclocal.m4:
+ add explanation for --enable-maintainer-mode
+ * lib/Makefile.in:
+ * po/Makefile.in:
+ add instroot make variable
+ * README:
+ add hint how to use it
+
+Thu Nov 6 17:35:00 CET 2003, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * Makefile.in:
+ * lib/Makefile.in:
+ * po/Makefile.in:
+ add check targets
+ add MANIFEST to distribution
+ * aclocal.m4:
+ add mr_PACKAGE macro
+ * configure.in:
+ use mr_PACKAGE macro
+
+Sat Oct 25 15:22:59 CEST 2003, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/elf_repl.h:
+ add EM_SPARC64
+
+Thu Oct 9 23:08:56 CEST 2003, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/x.movscn.c:
+ * lib/x.remscn.c:
+ verify that file is really an ELF file
+
+Wed Oct 8 17:10:09 CEST 2003, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * config.guess:
+ * config.sub:
+ latest versions from FSF
+
+Sat May 24 18:55:14 CEST 2003, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * config.guess:
+ latest version from FSF
+ * lib/Makefile.in:
+ * lib/libelf.h:
+ * lib/x.movscn.c:
+ * lib/x.remscn.c:
+ add elfx_movscn() and elfx_remscn()
+ * lib/newscn.c:
+ update e_shnum properly
+ * lib/private.h:
+ declare _elf_update_shnum()
+
+Fri May 23 18:25:48 CEST 2003, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * aclocal.m4:
+ provide name suffixes only
+ * lib/Makefile.in:
+ use name suffixes
+
+Fri May 23 01:24:26 CEST 2003, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * README:
+ update for 0.8.5
+ add section about LFS
+ * config.guess:
+ latest version from FSF
+ * configure.in:
+ * lib/Makefile.in:
+ use local pic object directory
+ * lib/checksum.c:
+ detect d_buf == NULL
+
+Sun May 18 16:49:10 CEST 2003, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * VERSION:
+ bump up to 0.8.5
+ * lib/strptr.c:
+ make elf_strptr() work safely with fragmented string tables
+ * lib/errors.h:
+ new error code and message for elf_strptr()
+ * po/de.po:
+ * po/libelf.po:
+ regenerated
+
+Mon May 12 15:29:12 CEST 2003, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/update.c:
+ improved fix for elf_update `null buffer' bug
+
+Mon May 12 00:34:44 CEST 2003, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * config.guess:
+ * config.sub:
+ latest versions from FSF
+
+Sun May 11 01:44:06 CEST 2003, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/verdef.h:
+ * lib/verneed.h:
+ fix elf_update `null buffer' error.
+ Thanks to Bart Trojanowski who reported the bug.
+
+Wed May 7 20:26:17 CEST 2003, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * configure.in:
+ fix maintainer mode default
+ * lib/verdef.h:
+ * lib/verneed.h:
+ only check d_buf if there is at least one element
+
+Mon Mar 31 17:08:04 CEST 2003, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * VERSION:
+ bump up to 0.8.4
+
+Sun Mar 23 16:06:43 CET 2003, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * configure.in:
+ fix --enable-compat
+
+Thu Feb 27 14:35:12 CET 2003, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * Makefile.in:
+ add `test-dist' target
+ * lib/errors.h:
+ new error code
+ * po/de.po:
+ * po/libelf.pot:
+ regenerated
+
+Wed Feb 26 17:48:58 CET 2003, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * config.guess:
+ * config.sub:
+ latest versions from FSF
+
+Wed Jan 15 22:50:53 CET 2003, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/begin.c:
+ fix overflow check
+
+Sun Jan 12 04:27:31 CET 2003, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * configure.in:
+ prefer int for __libelf_i32_t (if int has 32 bits)
+
+Thu Jan 2 17:40:22 CET 2003, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * README:
+ update for 0.8.3
+ * config.guess:
+ * config.sub:
+ update from ftp.gnu.org
+ * lib/cook.c:
+ require space for one SHDR only
+ * lib/elf_repl.h:
+ fix DT_ENCODING value
+
+Tue Dec 31 16:27:19 CET 2002, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/cook.c:
+ honor ELF extensions for >= 0xff00 sections
+ * lib/elf_repl.h:
+ add definitions from lates ELF spec
+ * lib/errors.h:
+ * po/libelf.pot:
+ * po/de.po:
+ new error message
+ * lib/private.h:
+ define missing pieces
+ * lib/update.c:
+ handle >= 0xff00 sections
+
+Mon Dec 23 00:23:20 CET 2002, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/Makefile.in:
+ fix dependencies.
+ * lib/cook.c:
+ add quirks mode for broken 64-bit architectures.
+ * lib/update.c:
+ do not override sh_entsize unless it's set to 0.
+ * lib/verdef.h:
+ * lib/verneed.h:
+ work around possible SEGV in translation routines.
+
+Sat Dec 14 23:33:10 CET 2002, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * ChangeLog:
+ add missing entries for 0.8.2 release.
+ * VERSION:
+ bump up to 0.8.3.
+ * lib/32.xlatetof.c:
+ * lib/64.xlatetof.c:
+ * lib/verdef.h:
+ * lib/verneed.h:
+ fix ISO C violations (required for MacOS X).
+ * po/gmo2msg.c:
+ create SUSv3 compliant .msg files.
+
+Thu Jun 11 19:00:19 CEST 2002, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * README:
+ update for 0.8.2.
+ * VERSION:
+ bump up to 0.8.2.
+ * lib/32.xlatetof.c:
+ * lib/64.xlatetof.c:
+ fix typos in for loop.
+ * lib/nlist.c:
+ add O_BINARY to file mode
+ (defaults to 0 on systems that lack it).
+
+Tue Dec 25 14:42:51 CET 2001, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * VERSION:
+ set version to 0.8.0.
+ * README:
+ update version.
+
+Tue Oct 30 17:05:03 CET 2001, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * Makefile.in:
+ use uid/gid=0 when creating the distribution tar file.
+
+Mon Oct 15 23:47:10 CEST 2001, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * configure.in:
+ check for <ar.h> and <fcntl.h>.
+ create ./pic when configuring.
+ * lib/Makefile.in:
+ move .o to ../pic/$@, not ../pic.
+ * lib/begin.c:
+ define struct ar_hdr and friends if <ar.h> is missing.
+ use lseek(..., SEEK_END).
+ * lib/input.c:
+ use lseek(..., SEEK_SET).
+ * lib/nlist.c:
+ include <fcntl.h> conditionally.
+ define O_RDONLY if it is missing.
+ * lib/private.h:
+ define SEEK_{SET,CUR,END} if they're missing.
+ * lib/update.c:
+ explicitly pass file descriptor to _elf_output().
+ use lseek(..., SEEK_SET).
+
+Tue Oct 9 22:46:01 CEST 2001, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * aclocal.m4:
+ remove superfluous case.
+
+Mon Oct 8 17:56:04 CEST 2001, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/opt.delscn.c:
+ handle versioning sections properly.
+
+Mon Oct 8 17:02:43 CEST 2001, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/32.xlatetof.c:
+ * lib/64.xlatetof.c:
+ override encoding when calculating the destination buffer
+ size for translation to a file.
+
+Sun Oct 7 21:31:01 CEST 2001, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * configure.in:
+ drop OBJS64; always compile 64-bit sources.
+ * lib/32.xlatetof.c:
+ * lib/64.xlatetof.c:
+ add translators for versioning structures.
+ * lib/Makefile.in:
+ drop OBJS64; add versioning support files.
+ * lib/errors.h:
+ add error codes for versioning support.
+ * lib/gelfehdr.c:
+ * lib/gelfphdr.c:
+ * lib/gelfshdr.c:
+ * lib/gelftrans.c:
+ * lib/swap64.c:
+ guard code with `#if __LIBELF64'.
+ * lib/private.h:
+ add translator declarations.
+ * po/de.po:
+ * po/libelf.pot:
+ add error messages for versioning support.
+
+Sun Oct 7 16:54:15 CEST 2001, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * acconfig.h:
+ * configure.in:
+ improve auto-configuration.
+ * lib/Makefile.in:
+ * po/Makefile.in
+ let users override distdir.
+ * lib/cook.c:
+ improved bugfix based on new auto-configuration.
+ * lib/getdata.c:
+ prepare src first to prevent SEGV.
+ * lib/private.h:
+ * lib/update.c:
+ cosmetic changes.
+
+Sun Oct 7 05:50:19 CEST 2001, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * configure.in:
+ * lib/cook.c:
+ fix compilation problem on Linux (SHT_SUNW_ver* undefined).
+ * lib/32.xlatetof.c:
+ * lib/64.xlatetof.c:
+ make translator functions calculate the destination size.
+ add _elf32_xltsize and _elf64_xltsize entry points.
+ * lib/private.h:
+ declare _elf32_xltsize and _elf64_xltsize.
+ * lib/getdata.c:
+ * lib/update.c:
+ use _elf32_xltsize and _elf64_xltsize.
+
+Fri Oct 5 20:35:31 CEST 2001, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/elf_repl.h:
+ add DT_VERSYM.
+ * lib/ext_types.h:
+ correct type names.
+ * lib/libelf.h:
+ add ELF_T_VDEF and ELF_T_VNEED.
+ * lib/32.fsize.c:
+ add table entries for versioning structures.
+ * lib/cook.c:
+ replace _elf_scn_types[] with _elf_scn_type().
+ * lib/private.h:
+ likewise; also remove valid_scntype() macro.
+ * lib/update.c:
+ call _elf_scn_type(), but do not set sh_entsize
+ for ELF_T_VDEF / ELF_T_VNEED.
+ * acconfig.h:
+ * lib/sys_elf.h.in:
+ added __LIBELF_SYMBOL_VERSIONS.
+ * configure.in:
+ check for symbol versioning definitions.
+ * lib/Makefile.in:
+ added gelf.h dependency.
+
+Wed Oct 3 22:46:33 CEST 2001, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/swap64.c:
+ new file; separate 64-bit functions.
+ * lib/64.xlatetof.c:
+ remove 64-bit conversion functions.
+ * lib/byteswap.h:
+ replace casts to long / unsigned long.
+ add prototypes for 64-bit conversion functions.
+ * configure.in:
+ * lib/Makefile.in:
+ add lib/swap64.c.
+ * lib/ext_types.h:
+ add type definitions for versioning.
+ * lib/elf_repl.h:
+ * lib/gelf.h:
+ cosmetic changes.
+
+Wed Oct 3 00:00:27 CEST 2001, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/elf_repl.h:
+ added lots of new definitions.
+ * lib/gelf.h:
+ * lib/libelf.h:
+ * lib/sys_elf.h.in:
+ cosmetic changes.
+
+Fri Sep 28 22:42:36 CEST 2001, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/32.xlatetof.c:
+ * lib/64.xlatetof.c:
+ remove `const' when compiling with -fPIC.
+
+Fri Sep 28 20:14:42 CEST 2001, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * README:
+ add pointers to documentation.
+ * lib/64.xlatetof.c:
+ fixed conversion thinko.
+ (Jakub Jelinek <jakub@redhat.com> found this - thanks!)
+ * lib/gelf.h:
+ * lib/32.fsize.c:
+ add gelf_msize.
+ * lib/libelf.h:
+ add comment that elf{32,64}_checksum is missing.
+
+Tue Sep 11 02:43:47 CEST 2001, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * README:
+ corrected typo.
+ * lib/cook.c:
+ * lib/private.h:
+ * lib/update.c:
+ replaces _ELFxx_ALIGN_xHDR with _fsize() call.
+
+Sun Sep 2 20:58:09 CEST 2001, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * Makefile.in:
+ * configure.in:
+ * lib/Makefile.in:
+ * po/Makefile.in:
+ add maintainer mode.
+
+Sat Sep 1 15:11:42 CEST 2001, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/sys_elf.h.in: add more fixes for broken <elf.h> files.
+
+Sat Sep 1 05:01:16 CEST 2001, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * ChangeLog: major update. Yes, I'm back.
+
+ * COPYING.LIB: updated version from FSF.
+
+ * README: updated for 0.7.1.
+
+Thu Apr 20 17:09:41 CEST 2000, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/gelftrans.c:
+ * lib/elf_repl.h:
+ add explicit casts to ELF64_R_SYM and ELF64_R_INFO.
+
+Thu Apr 13 20:15:45 CEST 2000, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/update.c: better checks for overlapping sections.
+
+ * lib/errors.h:
+ * po/de.po:
+ * po/libelf.pot:
+ new error message.
+
+Thu Apr 6 19:15:46 CEST 2000, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/strptr.c: rename `sd' variable.
+
+Fri Mar 31 20:11:14 CEST 2000, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * Makefile.in: also pass CPPFLAGS and LDFLAGS to config.status.
+
+Fri Mar 31 20:02:55 CEST 2000, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * aclocal.m4: add -DPIC define when building position-independent code.
+
+ * lib/32.xlatetof.c:
+ * lib/64.xlatetof.c:
+ * lib/errmsg.c:
+ make array members const when PIC is undefined.
+
+Fri Mar 31 14:42:32 CEST 2000, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/32.newehdr.c: make _elf_newehdr() function private again.
+
+ * lib/32.newphdr.c: make _elf_newphdr() function private again.
+
+ * lib/strptr.c: add support for 64-bit ELF format.
+
+Wed Mar 29 18:49:43 CEST 2000, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/gelfshdr.c: remove ELF class check.
+
+Mon Mar 27 01:24:50 CEST 2000, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/gelf.h: #include <libelf.h> when compiling libelf.
+
+Sun Mar 26 15:02:54 CEST 2000, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/private.h: #include <gelf.h> header file.
+
+ * lib/gelfehdr.c: move gelf_newehdr() function to lib/32.newehdr.c.
+
+ * lib/gelfphdr.c: move gelf_newphdr() function to lib/32.newphdr.c.
+
+ * lib/32.newehdr.c: add gelf_newehdr() function.
+
+ * lib/32.newphdr.c: add gelf_newphdr() function.
+
+ * lib/gelfshdr.c:
+ * lib/gelftrans.c:
+ remove explicit <gelf.h> include.
+
+Sun Mar 26 06:22:20 CEST 2000, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * acconfig.h:
+ * configure.in:
+ * lib/private.h:
+ * lib/sys_elf.h.in:
+ rename NEED_LINK_H to __LIBELF_NEED_LINK_H.
+
+ * lib/32.newehdr.c: make _elf_newehdr() function public.
+
+ * lib/32.newphdr.c: make _elf_newphdr() function public.
+
+ * lib/gelf.h:
+ include <link.h> if needed.
+ choke if 64-bit is not supported.
+ add generic versions of ELF32_* and ELF64_* macros.
+
+ * lib/gelftrans.c:
+ define ELF32_R_* and ELF64_R_* macros (missing on some systems).
+
+Sun Mar 26 05:27:15 CEST 2000, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * configure.in:
+ add check for existing <gelf.h> header.
+ build new source files when 64-bit is enabled.
+
+ * lib/Makefile.in:
+ add new source files.
+ make install-compat if --enable-compat was given.
+
+ * po/de.po:
+ * po/libelf.pot:
+ new error messages.
+
+Sun Mar 26 05:00:20 CEST 2000, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * Makefile.in:
+ * lib/Makefile.in:
+ * po/Makefile.in:
+ remove Makefile last in `make distclean'.
+
+ * aclocal.m4: explicitly state the default in --enable-* help texts.
+
+ * configure.in:
+ set ALL_LINGUAS automatically.
+ add `--enable-compat' option.
+
+ * lib/private.h: add sd_scn member to struct Scn_Data.
+
+ * lib/cook.c:
+ * lib/end.c:
+ * lib/getdata.c:
+ * lib/newdata.c:
+ * lib/opt.delscn.c:
+ * lib/rawdata.c:
+ * lib/update.c:
+ handle new sd_scn member.
+
+ * lib/gelf.h: new public header file.
+
+ * lib/gelfehdr.c: new file, implements the gelf_getehdr(),
+ gelf_update_ehdr() and gelf_newehdr() functions.
+
+ * lib/gelfphdr.c: new file, implements the gelf_getphdr(),
+ gelf_update_phdr() and gelf_newphdr() functions.
+
+ * lib/gelfshdr.c: new file, implements the gelf_getshdr()
+ and gelf_update_shdr() functions.
+
+ * lib/gelftrans.c: new file, implements the gelf_getsym(),
+ gelf_update_sym(), gelf_getdyn(), gelf_update_dyn(),
+ gelf_getrela(), gelf_update_rela(), gelf_getrel() and
+ gelf_update_rel() functions.
+
+ * lib/begin.c: add gelf_getclass() function.
+
+ * lib/32.fsize.c: add gelf_fsize() function.
+
+ * lib/32.getphdr.c: make _elf_getphdr() function public.
+
+ * lib/64.xlatetof.c:
+ add gelf_xlatetom() and gelf_xlatetof() functions.
+ remove `const' from array members.
+
+ * lib/errors.h: add GElf error messages.
+
+ * po/de.po:
+ * po/libelf.pot:
+ new error message.
+
+Thu Nov 4 21:17:34 CET 1999, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/32.xlatetof.c:
+ * lib/errmsg.c:
+ * po/gmo2msg.c:
+ remove `const' from array members.
+
+Thu Nov 4 20:16:36 CET 1999, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/Makefile.in: add assert.c; remove stamp-h in `make distclean'.
+
+ * lib/assert.c: new file, implements the __elf_assert() function.
+
+ * lib/private.h: use __elf_assert() in elf_assert() macro.
+
+Wed Mar 17 16:21:02 CET 1999, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * configure.in: add "de" to ALL_LINGUAS.
+
+ * lib/elf_repl.h: lots of new #defines.
+
+ * lib/hash.c:
+ * lib/libelf.h:
+ elf_hash() takes an `const unsigned char *'.
+
+ * po/gmo2msg.c: copy comments from .gmo file.
+
+Fri Mar 5 16:28:08 CET 1999, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * VERSION: set version to 0.7.1.
+
+ * po/de.po: new file.
+
+Fri Nov 27 22:24:00 MET 1998, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/memset.c: rename and rewrite.
+ * lib/private.h: rename __memset.
+
+Tue Aug 25 17:17:18 MEST 1998, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * aclocal.m4: remove superfluous #include.
+
+ * lib/32.xlatetof.c:
+ * lib/64.xlatetof.c: fix for picky instances of cpp(1).
+
+Sun Aug 23 18:26:53 MEST 1998, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * aclocal.m4:
+ * lib/Makefile.in: add DEPSHLIBS, set to -lc for Linux.
+
+ * README: add DEPSHLIBS description.
+
+Sat Aug 22 15:50:41 MEST 1998, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/begin.c: add workaround for broken ar(1) & friends.
+
+ * lib/32.getshdr.c: fix typo.
+
+Thu Aug 6 18:11:52 MEST 1998, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/getdata.c: fixed SEGV bug.
+
+ * lib/cook.c:
+ * lib/getdata.c:
+ * lib/newdata.c:
+ * lib/rawdata.c:
+ * lib/private.h: removed sd_scn and (Elf_Data*) casts.
+
+Fri Jun 12 21:24:50 MEST 1998, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * lib/*.c: move rcsid[] after <private.h>.
+
+ * lib/32.xlatetof.c:
+ * lib/64.xlatetof.c: replace broken Exn() macro with Cat2().
+
+ * lib/64.xlatetof.c: change `char*' to `unsigned char*'.
+
+ * lib/private.h: add `extern char *realloc();'.
+
+ * aclocal.m4:
+ * configure.in: remove leading spaces in cpp directives.
+
+Sun Jun 7 16:02:31 MEST 1998, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * README: update for 0.7.0 release.
+
+Sun Jun 4 15:26:49 MEST 1998, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * acconfig.h: add __libelf64* and __libelf_*_t.
+
+ * configure.in: clean up, add checks for 64-bit support.
+
+ * lib/64.xlatetof.c: new file, based on lib/32.xlatetof.c.
+
+ * lib/Makefile.in: add target for 64.xlatetof.o.
+
+ * lib/cook.c: check for 32-bit overflow.
+
+ * lib/elf_repl.h:
+ * lib/ext_types.h: add 64-bit data types.
+
+ * lib/private.h: add 64-bit definitions.
+
+ * lib/sys_elf.h.in: add __LIBELF64* and __libelf_*_t.
+
+ * lib/update.c: add full 64-bit support.
+
+Mon Jun 1 16:29:07 MEST 1998, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * VERSION: change version to 0.7.0.
+
+ * configure.in:
+ add lib/sys_elf.h to AC_CONFIG_HEADER.
+ new option --disable-elf64.
+
+ * Makefile.in: add target for lib/sys_elf.h.
+
+ * acconfig.h: add __LIBELF_HEADER_ELF_H.
+
+ * lib/Makefile.in: add sys_elf.h(.in).
+
+ * lib/32.fsize.c:
+ * lib/32.getehdr.c:
+ * lib/32.getphdr.c:
+ * lib/32.getshdr.c:
+ * lib/32.newehdr.c:
+ * lib/32.newphdr.c:
+ * lib/cook.c:
+ * lib/getdata.c:
+ * lib/libelf.h:
+ * lib/newscn.c:
+ * lib/nlist.c:
+ * lib/opt.delscn.c:
+ * lib/private.h:
+ * lib/update.c:
+ merged with 64bit code.
+
+ * lib/begin.c:
+ * lib/input.c:
+ bug fixes.
+
+Fri Aug 1 19:33:33 MEST 1997, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * VERSION: change version to 0.6.5.
+
+ * lib/libelf.h: add declaration for elf_memory.
+
+ * lib/private.h: add e_memory flag.
+
+ * lib/begin.c: add elf_memory, change archive freezing logic.
+
+ * lib/end.c: do not free e_data if e_memory is set.
+
+Tue Oct 22 21:31:56 MEST 1996, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * (all files): add RCS Id, import to CVS.
+
+ * Makefile.in: pass $(CC) to config.status.
+
+ * README: change for upcoming 0.6.5 release.
+
+ * aclocal.m4 (mr_ENABLE_NLS): add --enable-gnu-names option
+
+ * configure.in: change search order for <elf.h>.
+
+ * lib/begin.c (_elf_arhdr): add check for truncated archive member.
+
+ * lib/cook.c (_elf32_cook): add checks for misaligned tables.
+
+ * lib/errors.h:
+ fix wrong error message (ERROR_WRONLY).
+ add error messages for misaligned tables.
+
+ * lib/private.h: add constants for table alignments.
+
+ * po/Makefile.in: do not run mkinstalldirs directly, use $(SHELL).
+
+ * po/libelf.pot: rebuild.
+
+Tue Jul 30 17:22:41 MET DST 1996, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * VERSION: change version to 0.6.4.
+
+ * Makefile.in:
+ add DISTSUBDIRS.
+ add po/Makefile target.
+
+ * po/Makefile.in:
+ * po/gmo2msg.c:
+ * po/libelf.pot:
+ * po/stamp-po:
+ new files.
+
+ * aclocal.m4 (mr_ENABLE_NLS):
+ add MSGFILES.
+ set GMOFILES, MSGFILES and POFILES even if NLS is disabled.
+
+ * configure.in:
+ add ALL_LINGUAS.
+
+ * lib/nlist.c:
+ call elf_errno() to clear pending error.
+
+Tue Jul 28 23:53:44 MET DST 1996, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * VERSION: change version to 0.6.3.
+
+ * configure.in: fix creation of sys_elf.h.
+
+ * lib/Makefile.in:
+ move elf_repl.h to PRIVHDRS.
+ do not depend on HDRS and AUXHDRS.
+
+Sat Jul 27 18:27:09 MET DST 1996, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * VERSION: change version to 0.6.2.
+
+ * Makefile.in:
+ remove support from SUBDIRS.
+ remove subdirs/Makefile target.
+
+ * acconfig.h:
+ add ENABLE_DEBUG.
+ remove HAVE_NLS.
+
+ * aclocal.m4:
+ add mr_ENABLE_DEBUG.
+
+ * configure.in:
+ use mr_ENABLE_DEBUG.
+
+ * lib/Makefile.in:
+ add LD variable.
+ add elf_repl.h to DISTFILES.
+
+ * lib/libelf.h:
+ add check for __LIBELF_INTERNAL__.
+
+ * lib/private.h:
+ #define __LIBELF_INTERNAL__.
+ use ENABLE_DEBUG.
+
+ * support/elf.h:
+ move to lib/elf_repl.h.
+
+ * support/Makefile.in:
+ remove.
+
+Sat Jul 27 06:25:23 MET DST 1996, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * VERSION: change version to 0.6.1.
+
+ * aclocal.m4: add shared library support for sparc-sun-solaris2.
+
+ * lib/libelf.h.in: remove.
+
+ * lib/libelf.h: new file.
+
+ * configure.in:
+ remove broken check for existing installation.
+ remove @install_headers@ and @elf_h@.
+ do not build libelf.h from libelf.h.in.
+ create lib/sys_elf.h.
+
+ * lib/Makefile.in:
+ remove libelf.h and $(AUXHDRS) targets.
+ remove libelf.h.in from DISTFILES.
+ add libelf.h to DISTFILES.
+ add dummy_shlib target for broken make.
+
+Sat Jul 27 01:01:45 MET DST 1996, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * VERSION: change version to 0.6.0.
+
+ * lib: new directory.
+
+ * config.sub:
+ * config.guess:
+ new files.
+
+ * shared:
+ * shared/Makefile.in:
+ remove.
+
+ * aclocal.m4:
+ * configure.in:
+ add shared library check.
+
+ * Makefile.in:
+ * lib/Makefile.in:
+ change for new directory structure.
+ integrate shared library support.
+
+ * Makefile.in:
+ remove libelf.lsm from DISTFILES.
+
+ * libelf.lsm: remove.
+
+Thu Jul 25 19:35:05 MET DST 1996, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * VERSION: change version to 0.5.9.
+
+ * aclocal.m4: rewrite NLS check.
+
+Tue Jul 23 18:59:05 MET DST 1996, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * Makefile.in: add install-compat and uninstall-compat targets.
+
+ * configure.in:
+ * aclocal.m4:
+ fix check for NLS support.
+
+ * acconfig.h: add HAVE_CATGETS and HAVE_GETTEXT.
+
+ * errmsg.c (elf_errmsg): use HAVE_GETTEXT.
+
+Sun Jul 21 22:52:02 MET DST 1996, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * VERSION: change version to 0.5.8.
+
+ * private.h:
+ * 32.getshdr.c:
+ * cook.c:
+ * end.c:
+ * newscn.c:
+ * opt.delscn.c:
+ * update.c:
+ change allocation of section headers.
+
+ * errors.h: fix speeling error.
+
+Sat Jul 13 22:51:16 MET DST 1996, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * VERSION: change version to 0.5.7.
+
+ * private.h: add e_dsize member to struct Elf.
+
+ * begin.c (elf_begin): set e_dsize.
+
+ * update.c (_elf32_update_pointers):
+ never let e_data become shorter than e_dsize bytes.
+ use correct base pointer.
+
+Sat Jun 15 16:28:50 MET DST 1996, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * 32.xlatetof.c: change `char' to `unsigned char'.
+
+Tue May 28 19:00:30 MET DST 1996, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * Makefile.in:
+ HP-UX make wants non-empty target, change it.
+ add targets for TAGS and libelf.po.
+
+ * errors.h: mark strings for GNU gettext.
+
+ * mkmsgs: recognize new errors.h format.
+
+ * errmsg.c (elf_errmsg): add gettext support.
+
+Mon May 27 20:30:30 MET DST 1996, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * VERSION: change version to 0.5.6.
+
+ * aclocal.m4:
+ * configure.in: use new AC_CACHE_CHECK macro.
+
+ * Makefile.in:
+ * shared/Makefile.in: use @...dir@.
+
+ * Makefile.in: pass $(SRCS) and $(OBJS) to shared/Makefile.
+
+Sat May 25 01:00:15 MET DST 1996, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * update.c (elf_update): assert e_data is malloc'ed.
+
+ * begin.c (elf_begin): mmap e_data if possible.
+
+ * end.c (elf_end): munmap e_data if necessary.
+
+ * input.c (_elf_mmap): new function.
+
+ * private.h: add _elf_mmap and e_unmap_data.
+
+ * errmsg.c: make pointer array constant.
+
+Thu May 23 19:24:47 MET DST 1996, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * update.c (elf_update): mmap(MAP_SHARED) wants non-empty file.
+
+Tue May 21 15:33:07 MET DST 1996, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * begin.c (elf_begin): re-read memory image of archive members.
+
+ * cook.c (_elf32_item):
+ * getdata.c (_elf32_cook_scn): always use memory image.
+
+ * update.c (_elf_update): use mmap if possible.
+
+ * configure.in: check for mmap.
+
+Mon May 20 18:15:54 MET DST 1996, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * nlist.c (_elf_nlist): fix broken st_name range check.
+
+ * update.c (_elf32_write): check status of elf_getdata.
+
+ * cook.c (_elf32_item):
+ * getdata.c (_elf32_cook_scn):
+ use memory image when file is not an archive member.
+
+ * rawdata.c (elf_rawdata): copy raw image rather than referencing it.
+
+Wed May 15 20:04:39 MET DST 1996, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * rawdata.c (elf_rawdata): use raw image if it is present.
+
+ * cntl.c (elf_cntl): fix archive handling, ignore ELF_C_FDREAD for non-ELF files.
+
+Fri May 10 17:16:44 MET DST 1996, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * begin.c (_elf_arhdr): fix handling of long archive member names.
+
+ * configure.in: move version information to external file.
+
+ * Makefile.in: add VERSION to DISTFILES.
+
+ * VERSION: new file.
+
+Sat May 4 20:56:43 MET DST 1996, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * configure.in: change version to 0.5.5.
+
+ * Makefile.in: add libelf.lsm and ChangeLog to DISTFILES.
+
+ * rawdata.c: reorder cases to avoid unnecessary malloc/free.
+
+ * all files: update copyright phrase.
+
+ * ChangeLog:
+ * libelf.lsm: new files.
+
+Sun Oct 29 19:34:00 MET 1995, Michael Riepe <michael@stud.uni-hannover.de>
+
+ * configure.in: change version to 0.5.3.
+
+ * Makefile.in:
+ * shared/Makefile.in: add opt.delscn.c.
+
+ * libelf.h.in: add declaration for elf_delscn.
+
+ * opt.delscn.c: new file.
+
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..95d84c8
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,176 @@
+Basic Installation
+==================
+
+ These are generic installation instructions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+ The file `configure.in' is used to create `configure' by a program
+called `autoconf'. You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system. If you're
+ using `csh' on an old version of System V, you might need to type
+ `sh ./configure' instead to prevent `csh' from trying to execute
+ `configure' itself.
+
+ Running `configure' takes awhile. While running, it prints some
+ messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Optionally, type `make check' to run any self-tests that come with
+ the package.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 5. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. You can give `configure'
+initial values for variables by setting them in the environment. Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+ CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+ env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+ If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile the package for one architecture at a time
+in the source code directory. After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+Installation Names
+==================
+
+ By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc. You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on. Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+ CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+ If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+ Use and save the results of the tests in FILE instead of
+ `./config.cache'. Set FILE to `/dev/null' to disable caching, for
+ debugging `configure'.
+
+`--help'
+ Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made.
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`--version'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
+
diff --git a/MANIFEST b/MANIFEST
new file mode 100644
index 0000000..4ced37c
--- /dev/null
+++ b/MANIFEST
@@ -0,0 +1,96 @@
+25275 COPYING.LIB
+35406 ChangeLog
+7462 INSTALL
+5908 Makefile.in
+13232 README
+7 VERSION
+2955 acconfig.h
+9381 aclocal.m4
+43611 config.guess
+3987 config.h.in
+31160 config.sub
+110753 configure
+11736 configure.in
+2186 install-sh
+4798 lib/32.fsize.c
+1556 lib/32.getehdr.c
+1557 lib/32.getphdr.c
+1665 lib/32.getshdr.c
+2181 lib/32.newehdr.c
+3055 lib/32.newphdr.c
+12322 lib/32.xlatetof.c
+14221 lib/64.xlatetof.c
+8012 lib/Makefile.in
+4010 lib/Makefile.w32
+1119 lib/assert.c
+10463 lib/begin.c
+1685 lib/build.bat
+3566 lib/byteswap.h
+3937 lib/checksum.c
+1901 lib/cntl.c
+4851 lib/config.h.w32
+12554 lib/cook.c
+1183 lib/data.c
+24585 lib/elf_repl.h
+2899 lib/end.c
+2137 lib/errmsg.c
+1037 lib/errno.c
+6222 lib/errors.h
+8107 lib/ext_types.h
+997 lib/fill.c
+2400 lib/flag.c
+5103 lib/gelf.h
+4151 lib/gelfehdr.c
+3965 lib/gelfphdr.c
+3758 lib/gelfshdr.c
+9456 lib/gelftrans.c
+1175 lib/getarhdr.c
+1380 lib/getaroff.c
+2421 lib/getarsym.c
+1096 lib/getbase.c
+3841 lib/getdata.c
+1353 lib/getident.c
+1449 lib/getscn.c
+1212 lib/hash.c
+2562 lib/input.c
+1088 lib/kind.c
+1214 lib/libelf.def
+9050 lib/libelf.h
+1505 lib/memset.c
+1098 lib/ndxscn.c
+1558 lib/newdata.c
+3488 lib/newscn.c
+1356 lib/next.c
+1607 lib/nextscn.c
+5898 lib/nlist.c
+1452 lib/nlist.h
+5071 lib/opt.delscn.c
+13133 lib/private.h
+1286 lib/rand.c
+2543 lib/rawdata.c
+1541 lib/rawfile.c
+3393 lib/strptr.c
+2285 lib/swap64.c
+3812 lib/sys_elf.h.in
+4066 lib/sys_elf.h.w32
+26008 lib/update.c
+6884 lib/verdef.h
+1586 lib/verdef_32_tof.c
+1586 lib/verdef_32_tom.c
+1614 lib/verdef_64_tof.c
+1614 lib/verdef_64_tom.c
+7135 lib/verneed.h
+1435 lib/version.c
+4425 lib/x.elfext.c
+2721 lib/x.movscn.c
+2870 lib/x.remscn.c
+254 libelf.pc.in
+619 mkinstalldirs
+4593 po/Makefile.in
+8748 po/de.gmo
+52 po/de.msg
+11332 po/de.po
+3011 po/gmo2msg.c
+6483 po/libelf.pot
+10 po/stamp-po
+10 stamp-h.in
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..3f38307
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,198 @@
+# Makefile for libelf.
+# Copyright (C) 1995 - 2005 Michael Riepe
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+# @(#) $Id: Makefile.in,v 1.30 2008/05/23 08:17:56 michael Exp $
+
+instroot =
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+libdir = @libdir@
+
+pkgdir = $(libdir)/pkgconfig
+
+MV = mv -f
+RM = rm -f
+LN_S = @LN_S@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+
+# no user serviceable parts below
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+
+SHELL = /bin/sh
+@SET_MAKE@
+
+srcdir = @srcdir@
+VPATH = @srcdir@
+
+SUBDIRS = lib @POSUB@
+DISTSUBDIRS = lib po
+
+DISTFILES = \
+ acconfig.h aclocal.m4 ChangeLog config.guess config.h.in \
+ config.sub configure configure.in COPYING.LIB INSTALL install-sh \
+ Makefile.in mkinstalldirs README stamp-h.in VERSION libelf.pc.in
+
+all: all-recursive all-local
+check: check-recursive check-local
+install: install-recursive install-local
+uninstall: uninstall-recursive uninstall-local
+mostlyclean: mostlyclean-recursive mostlyclean-local
+clean: clean-recursive clean-local
+distclean: distclean-recursive distclean-local
+maintainer-clean: maintainer-clean-recursive maintainer-clean-local
+
+install-compat uninstall-compat:
+ cd lib && $(MAKE) $@
+
+all-recursive check-recursive install-recursive uninstall-recursive \
+clean-recursive distclean-recursive mostlyclean-recursive \
+maintainer-clean-recursive:
+ @subdirs="$(SUBDIRS)"; for subdir in $$subdirs; do \
+ target=`echo $@|sed 's,-recursive,,'`; \
+ echo making $$target in $$subdir; \
+ (cd $$subdir && $(MAKE) $$target) || exit 1; \
+ done
+
+all-local:
+
+check-local:
+
+install-local: $(srcdir)/mkinstalldirs libelf.pc
+ $(SHELL) $(srcdir)/mkinstalldirs $(instroot)$(pkgdir)
+ $(INSTALL_DATA) libelf.pc $(instroot)$(pkgdir)
+
+uninstall-local:
+ $(RM) $(instroot)$(pkgdir)/libelf.pc
+
+mostlyclean-local:
+ $(RM) *~ core errlist
+
+clean-local: mostlyclean-local
+
+distclean-local: clean-local
+ $(RM) config.cache config.h config.log config.status stamp-h
+ $(RM) Makefile
+ $(RM) libelf.pc
+
+maintainer-clean-local: distclean-local
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+ $(RM) config.h.in configure stamp-dist
+ $(RM) -r $(distdir)
+
+# maintainer only
+
+MAINT = @MAINT@
+
+distdir = $(PACKAGE)-$(VERSION)
+DISTPERMS = --owner=root --group=root --numeric-owner
+$(MAINT)dist: ./stamp-dist
+$(MAINT)./stamp-dist: $(DISTFILES)
+ $(RM) -r $(distdir)
+ mkdir $(distdir)
+ files="$(DISTFILES)"; for file in $$files; do \
+ ln $(srcdir)/$$file $(distdir) || \
+ cp -p $(srcdir)/$$file $(distdir) || exit 1; \
+ done
+ subdirs="$(DISTSUBDIRS)"; for subdir in $$subdirs; do \
+ (cd $$subdir && $(MAKE) dist) || exit 1; \
+ done
+ cd $(distdir) && \
+ find . -type f ! -name MANIFEST -exec wc -c {} \; | \
+ sed 's, \./, ,' | sort -k2 >MANIFEST
+ -$(RM) $(distdir).tar.gz.bak $(PACKAGE).tar.gz
+ -$(MV) $(distdir).tar.gz $(distdir).tar.gz.bak
+ tar cvohfz $(distdir).tar.gz $(DISTPERMS) $(distdir)
+ $(LN_S) $(distdir).tar.gz $(PACKAGE).tar.gz
+ $(RM) stamp-dist && echo timestamp > stamp-dist
+
+$(MAINT)check-dist:
+ $(RM) -r disttest
+ mkdir disttest
+ @echo 'unset CC CFLAGS CPPFLAGS LDFLAGS LIBS' >disttest/config.site
+ cd disttest && CONFIG_SITE=config.site ../$(distdir)/configure
+ $(MAKE) -C disttest
+ $(MAKE) -C disttest check
+ $(MAKE) -C disttest dist
+
+.PHONY: tags
+tags:
+ rm -f tags
+ ctags lib/*.c lib/*.h
+
+TRACKFS = trackfs
+trackinstall:
+ $(TRACKFS) -l install.log -b backup.cpio $(MAKE) install
+
+# For the justification of the following Makefile rules, see node
+# `Automatic Remaking' in GNU Autoconf documentation.
+
+$(MAINT)$(srcdir)/configure: $(srcdir)/configure.in $(srcdir)/aclocal.m4
+ $(RM) $(srcdir)/configure
+ cd $(srcdir) && autoconf
+
+$(MAINT)$(srcdir)/config.h.in: $(srcdir)/stamp-h.in
+$(MAINT)$(srcdir)/stamp-h.in: $(srcdir)/configure.in $(srcdir)/acconfig.h
+ $(RM) $(srcdir)/config.h.in
+ cd $(srcdir) && autoheader
+ cd $(srcdir) && $(RM) stamp-h.in && echo timestamp > stamp-h.in
+
+$(MAINT)config.h: stamp-h
+$(MAINT)stamp-h: config.h.in config.status
+ CONFIG_FILES= CONFIG_HEADERS=config.h ./config.status
+ $(RM) stamp-h && echo timestamp > stamp-h
+
+$(MAINT)Makefile: Makefile.in config.status
+ CONFIG_FILES=$@ CONFIG_HEADERS= ./config.status
+
+$(MAINT)lib/Makefile: lib/Makefile.in config.status
+ CONFIG_FILES=$@ CONFIG_HEADERS= ./config.status
+
+$(MAINT)lib/sys_elf.h: lib/stamp-h
+$(MAINT)lib/stamp-h: lib/sys_elf.h.in config.status
+ CONFIG_FILES= CONFIG_HEADERS=lib/sys_elf.h ./config.status
+ $(RM) lib/stamp-h && echo timestamp > lib/stamp-h
+
+$(MAINT)po/Makefile: po/Makefile.in config.status
+ CONFIG_FILES=$@ CONFIG_HEADERS= ./config.status
+
+$(MAINT)libelf.pc: libelf.pc.in config.status
+ CONFIG_FILES=$@ CONFIG_HEADERS= ./config.status
+
+RECHECK_FLAGS = CC='$(CC)' CPPFLAGS='$(CPPFLAGS)' \
+ CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS)' LIBS='$(LIBS)'
+
+$(MAINT)config.status: configure config.h.in VERSION
+ $(RECHECK_FLAGS) ./config.status --recheck
+
+$(MAINT)reconfig:
+ $(RM) config.cache
+ $(RECHECK_FLAGS) ./config.status --recheck
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/README b/README
new file mode 100644
index 0000000..b4f9d95
--- /dev/null
+++ b/README
@@ -0,0 +1,332 @@
+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>
diff --git a/VERSION b/VERSION
new file mode 100644
index 0000000..c2f73c6
--- /dev/null
+++ b/VERSION
@@ -0,0 +1 @@
+0.8.13
diff --git a/acconfig.h b/acconfig.h
new file mode 100644
index 0000000..6ec1174
--- /dev/null
+++ b/acconfig.h
@@ -0,0 +1,89 @@
+/*
+ * acconfig.h - Special definitions for libelf, processed by autoheader.
+ * Copyright (C) 1995 - 2001, 2004, 2006 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+/* @(#) $Id: acconfig.h,v 1.16 2008/05/23 08:17:56 michael Exp $ */
+
+/* Define if you want to include extra debugging code */
+#undef ENABLE_DEBUG
+
+/* Define if you want to support extended ELF formats */
+#undef ENABLE_EXTENDED_FORMAT
+
+/* Define if you want ELF format sanity checks by default */
+#undef ENABLE_SANITY_CHECKS
+
+/* Define if memmove() does not copy overlapping arrays correctly */
+#undef HAVE_BROKEN_MEMMOVE
+
+/* Define if you have the catgets function. */
+#undef HAVE_CATGETS
+
+/* Define if you have the dgettext function. */
+#undef HAVE_DGETTEXT
+
+/* Define if you have the memset function. */
+#undef HAVE_MEMSET
+
+/* Define if struct nlist is declared in <elf.h> or <sys/elf.h> */
+#undef HAVE_STRUCT_NLIST_DECLARATION
+
+/* Define if Elf32_Dyn is declared in <link.h> */
+#undef __LIBELF_NEED_LINK_H
+
+/* Define if Elf32_Dyn is declared in <sys/link.h> */
+#undef __LIBELF_NEED_SYS_LINK_H
+
+/* Define to `<elf.h>' or `<sys/elf.h>' if one of them is present */
+#undef __LIBELF_HEADER_ELF_H
+
+/* Define if you want 64-bit support (and your system supports it) */
+#undef __LIBELF64
+
+/* Define if you want 64-bit support, and are running IRIX */
+#undef __LIBELF64_IRIX
+
+/* Define if you want 64-bit support, and are running Linux */
+#undef __LIBELF64_LINUX
+
+/* Define if you want symbol versioning (and your system supports it) */
+#undef __LIBELF_SYMBOL_VERSIONS
+
+/* Define if symbol versioning uses Sun section type (SHT_SUNW_*) */
+#undef __LIBELF_SUN_SYMBOL_VERSIONS
+
+/* Define if symbol versioning uses GNU section types (SHT_GNU_*) */
+#undef __LIBELF_GNU_SYMBOL_VERSIONS
+
+/* Define to a 64-bit signed integer type if one exists */
+#undef __libelf_i64_t
+
+/* Define to a 64-bit unsigned integer type if one exists */
+#undef __libelf_u64_t
+
+/* Define to a 32-bit signed integer type if one exists */
+#undef __libelf_i32_t
+
+/* Define to a 32-bit unsigned integer type if one exists */
+#undef __libelf_u32_t
+
+/* Define to a 16-bit signed integer type if one exists */
+#undef __libelf_i16_t
+
+/* Define to a 16-bit unsigned integer type if one exists */
+#undef __libelf_u16_t
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 0000000..0dba347
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,336 @@
+# aclocal.m4 - Local additions to Autoconf macros.
+# Copyright (C) 1995 - 2006 Michael Riepe
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+# @(#) $Id: aclocal.m4,v 1.28 2008/05/23 08:17:56 michael Exp $
+
+AC_PREREQ(2.13)
+
+dnl mr_PACKAGE(package-name)
+AC_DEFUN(mr_PACKAGE, [changequote(<<, >>)dnl
+ changequote([, ])dnl
+ PACKAGE=$1
+ VERSION=`cat $srcdir/VERSION`
+ AC_SUBST(PACKAGE)
+ AC_SUBST(VERSION)
+ AC_ARG_ENABLE(maintainer-mode,
+ [ --enable-maintainer-mode
+ enable maintainer-specific make rules (default: auto)],
+ [mr_enable_maintainer_mode="$enableval"],
+ [case :${I_AM_THE_MAINTAINER_OF}: in
+ *:$1:*) mr_enable_maintainer_mode=yes;;
+ *) mr_enable_maintainer_mode=no;;
+ esac])
+ if test x"$mr_enable_maintainer_mode" = x"yes"; then
+ MAINT=
+ else
+ MAINT='maintainer-only-'
+ fi
+ AC_SUBST(MAINT)
+])
+
+AC_DEFUN(mr_ENABLE_NLS, [
+ AC_PROVIDE([$0])
+
+ # Needed for `make dist' even if NLS is disabled.
+ GMOFILES=
+ MSGFILES=
+ POFILES=
+ for mr_lang in $ALL_LINGUAS; do
+ GMOFILES="$GMOFILES $mr_lang.gmo"
+ MSGFILES="$MSGFILES $mr_lang.msg"
+ POFILES="$POFILES $mr_lang.po"
+ done
+ AC_SUBST(GMOFILES)
+ AC_SUBST(MSGFILES)
+ AC_SUBST(POFILES)
+
+ AC_MSG_CHECKING([whether NLS is requested])
+ AC_ARG_ENABLE(nls,
+ [ --enable-nls use Native Language Support (default: yes)],
+ [mr_enable_nls="$enableval"],
+ [mr_enable_nls=yes])
+ AC_MSG_RESULT($mr_enable_nls)
+
+ CATOBJEXT=
+ INSTOBJEXT=
+ localedir=
+ if test "$mr_enable_nls" = yes; then
+ mr_PATH=`echo ":$PATH" | sed -e 's,:[^:]*openwin[^:]*,,g' -e 's,^:,,'`
+ AC_CACHE_CHECK([for dgettext],
+ mr_cv_func_dgettext, [
+ AC_TRY_LINK([#include <libintl.h>],
+ [char *s = dgettext("", ""); return 0],
+ [mr_cv_func_dgettext=yes],
+ [mr_cv_func_dgettext=no])
+ ])
+ if test "$mr_cv_func_dgettext" = yes; then
+ AC_PATH_PROG(MSGFMT, msgfmt, no, $mr_PATH)
+ if test "$MSGFMT" != no; then
+ AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT, $mr_PATH)
+ AC_PATH_PROG(XGETTEXT, xgettext, xgettext, $mr_PATH)
+ AC_PATH_PROG(MSGMERGE, msgmerge, msgmerge, $mr_PATH)
+ AC_CACHE_CHECK([for GNU gettext],
+ mr_cv_gnu_gettext, [
+ AC_TRY_LINK([],
+ [extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr],
+ [mr_cv_gnu_gettext=yes],
+ [mr_cv_gnu_gettext=no])
+ ])
+ if test "$mr_cv_gnu_gettext" = yes; then
+ AC_CACHE_CHECK([for losing catgets-based GNU gettext],
+ mr_cv_catgets_based_gettext, [
+ AC_TRY_LINK([],
+ [extern int _msg_tbl_length; return _msg_tbl_length],
+ [mr_cv_catgets_based_gettext=yes],
+ [mr_cv_catgets_based_gettext=no])
+ ])
+ if test "$mr_cv_catgets_based_gettext" = yes; then
+ # This loses completely. Turn it off and use catgets.
+ LIBS=`echo $LIBS | sed 's,-lintl,,g'`
+ mr_cv_func_dgettext=no
+ else
+ # Is there a better test for this case?
+ AC_CACHE_CHECK([for pure GNU gettext],
+ mr_cv_pure_gnu_gettext, [
+ AC_TRY_LINK([],
+ [extern int gettext(); return gettext()],
+ [mr_cv_pure_gnu_gettext=yes],
+ [mr_cv_pure_gnu_gettext=no])
+ ])
+ if test "$mr_cv_pure_gnu_gettext" = yes; then
+ CATOBJEXT=.gmo
+ localedir='$(prefix)/share/locale'
+ else
+ CATOBJEXT=.mo
+ localedir='$(prefix)/lib/locale'
+ fi
+ INSTOBJEXT=.mo
+ fi
+ else
+ # System provided gettext
+ CATOBJEXT=.mo
+ INSTOBJEXT=.mo
+ localedir='$(prefix)/lib/locale'
+ fi
+ else
+ # Gettext but no msgfmt. Try catgets.
+ mr_cv_func_dgettext=no
+ fi
+ fi
+ if test "$mr_cv_func_dgettext" = yes; then
+ AC_DEFINE(HAVE_DGETTEXT)
+ else
+ AC_CACHE_CHECK([for catgets], mr_cv_func_catgets, [
+ AC_TRY_LINK([#include <nl_types.h>],
+ [catgets(catopen("",0),0,0,"");return 0;],
+ [mr_cv_func_catgets=yes],
+ [mr_cv_func_catgets=no])
+ ])
+ if test "$mr_cv_func_catgets" = yes; then
+ AC_PATH_PROG(GENCAT, gencat, no, $mr_PATH)
+ if test "$GENCAT" != no; then
+ AC_DEFINE(HAVE_CATGETS)
+ AC_PATH_PROG(GMSGFMT, [gmsgfmt msgfmt], msgfmt, $mr_PATH)
+ AC_PATH_PROG(XGETTEXT, xgettext, xgettext, $mr_PATH)
+ CATOBJEXT=.cat
+ INSTOBJEXT=.cat
+ localedir='$(prefix)/lib/locale'
+ fi
+ else
+ AC_MSG_WARN([no NLS support, disabled])
+ mr_enable_nls=no
+ fi
+ fi
+ fi
+ AC_SUBST(CATOBJEXT)
+ AC_SUBST(INSTOBJEXT)
+ AC_SUBST(localedir)
+
+ POSUB=
+ CATALOGS=
+ if test "$mr_enable_nls" = yes; then
+ AC_MSG_CHECKING([for catalogs to be installed])
+ mr_linguas=
+ for mr_lang in ${LINGUAS=$ALL_LINGUAS}; do
+ case " $ALL_LINGUAS " in
+ *" $mr_lang "*)
+ mr_linguas="$mr_linguas$mr_lang "
+ CATALOGS="$CATALOGS $mr_lang$CATOBJEXT"
+ ;;
+ esac
+ done
+ AC_MSG_RESULT($mr_linguas)
+ POSUB=po
+ fi
+ AC_SUBST(CATALOGS)
+ AC_SUBST(POSUB)
+])
+
+AC_DEFUN(mr_TARGET_ELF, [
+ AC_PROVIDE([$0])
+ AC_CACHE_CHECK([for native ELF system],
+ mr_cv_target_elf,
+ [AC_TRY_RUN(changequote(<<, >>)dnl
+<<#include <stdio.h>
+int
+main(int argc, char **argv) {
+ char buf[BUFSIZ];
+ FILE *fp;
+ int n;
+
+ if ((fp = fopen(*argv, "r")) == NULL) {
+ exit(1);
+ }
+ n = fread(buf, 1, sizeof(buf), fp);
+ if (n >= 52
+ && buf[0] == '\177'
+ && buf[1] == 'E'
+ && buf[2] == 'L'
+ && buf[3] == 'F') {
+ exit(0);
+ }
+ exit(1);
+}>>, changequote([, ])dnl
+ mr_cv_target_elf=yes,
+ mr_cv_target_elf=no,
+ mr_cv_target_elf=no)])])
+
+AC_DEFUN(mr_ENABLE_SHARED, [
+ AC_PROVIDE([$0])
+ PICFLAGS=
+ SHLIB_SFX=
+ SHLINK_SFX=
+ SONAME_SFX=
+ LINK_SHLIB=
+ INSTALL_SHLIB=
+ DEPSHLIBS=
+ AC_MSG_CHECKING([whether to build a shared library])
+ AC_ARG_ENABLE(shared,
+ [ --enable-shared build shared library (default: yes)],
+ [mr_enable_shared="$enableval"],
+ [mr_enable_shared=yes])
+ AC_MSG_RESULT($mr_enable_shared)
+ if test "$mr_enable_shared" = yes; then
+ AC_MSG_CHECKING([whether GNU naming conventions are requested])
+ AC_ARG_ENABLE(gnu-names,
+ [ --enable-gnu-names use GNU library naming conventions (default: no)],
+ [mr_enable_gnu_names="$enableval"],
+ [mr_enable_gnu_names=no])
+ AC_MSG_RESULT($mr_enable_gnu_names)
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([AC_PROG_CC])
+ AC_PATH_PROG(LD, ld, ld)
+ case "$host" in
+ *-linux*|*-gnu*)
+ if test "$GCC" = yes; then
+ mr_TARGET_ELF
+ if test "$mr_cv_target_elf" = yes; then
+ PICFLAGS='-fPIC -DPIC'
+ if test "$mr_enable_gnu_names" = yes
+ then SHLIB_SFX='-$(VERSION).so'
+ else SHLIB_SFX='.so.$(VERSION)'
+ fi
+ SHLINK_SFX='.so'
+ SONAME_SFX='.so.$(MAJOR)'
+ LINK_SHLIB='$(CC) -shared -Wl,-soname,$(SONAME)'
+ INSTALL_SHLIB='$(INSTALL_PROGRAM)'
+ DEPSHLIBS='-lc'
+ else
+ AC_MSG_WARN([shared libraries not supported for $host])
+ mr_enable_shared=no
+ fi
+ elif ${CC} -V 2>&1 | grep 'Intel(R) C++ Compiler' >/dev/null 2>&1; then
+ AC_MSG_WARN([Use --disable-shared if $CC fails to build the shared library])
+ PICFLAGS='-fPIC -DPIC'
+ if test "$mr_enable_gnu_names" = yes
+ then SHLIB_SFX='-$(VERSION).so'
+ else SHLIB_SFX='.so.$(VERSION)'
+ fi
+ SHLINK_SFX='.so'
+ SONAME_SFX='.so.$(MAJOR)'
+ LINK_SHLIB='$(CC) -shared -Wl,-soname,$(SONAME)'
+ INSTALL_SHLIB='$(INSTALL_PROGRAM)'
+ DEPSHLIBS='-lc'
+ else
+ AC_MSG_WARN([GNU CC required for building shared libraries])
+ mr_enable_shared=no
+ fi
+ ;;
+ i386-pc-nto-qnx*)
+ mr_TARGET_ELF
+ if test "$mr_cv_target_elf" = yes; then
+ PICFLAGS='-fPIC -DPIC'
+ if test "$mr_enable_gnu_names" = yes
+ then SHLIB_SFX='-$(VERSION).so'
+ else SHLIB_SFX='.so.$(VERSION)'
+ fi
+ SHLINK_SFX='.so'
+ SONAME_SFX='.so.$(MAJOR)'
+ LINK_SHLIB='$(CC) -shared -Wl,-soname,$(SONAME)'
+ INSTALL_SHLIB='$(INSTALL_PROGRAM)'
+ DEPSHLIBS='-lc'
+ else
+ AC_MSG_WARN([shared libraries not supported for $host])
+ mr_enable_shared=no
+ fi
+ ;;
+ sparc-sun-solaris2*)
+ if test "$GCC" = yes; then
+ PICFLAGS='-fPIC -DPIC'
+ else
+ PICFLAGS='-K PIC -DPIC'
+ fi
+ if test "$mr_enable_gnu_names" = yes
+ then SHLIB_SFX='-$(MAJOR).so'
+ else SHLIB_SFX='.so.$(MAJOR)'
+ fi
+ SONAME_SFX='.so.$(MAJOR)'
+ SHLINK_SFX='.so'
+ LINK_SHLIB='$(LD) -G -z text -h $(SONAME)'
+ INSTALL_SHLIB='$(INSTALL_PROGRAM)'
+ ;;
+ *)
+ AC_MSG_WARN([shared libraries not supported for $host])
+ mr_enable_shared=no
+ ;;
+ esac
+ else
+ mr_enable_shared=no
+ fi
+ AC_SUBST(PICFLAGS)
+ AC_SUBST(SHLIB_SFX)
+ AC_SUBST(SHLINK_SFX)
+ AC_SUBST(SONAME_SFX)
+ AC_SUBST(LINK_SHLIB)
+ AC_SUBST(INSTALL_SHLIB)
+ AC_SUBST(DEPSHLIBS)
+ DO_SHLIB="$mr_enable_shared"
+ AC_SUBST(DO_SHLIB)
+])
+
+AC_DEFUN(mr_ENABLE_DEBUG, [
+ AC_PROVIDE([$0])
+ AC_ARG_ENABLE(debug,
+ [ --enable-debug include extra debugging code (default: no)],
+ [mr_enable_debug="$enableval"],
+ [mr_enable_debug=no])
+ if test "$mr_enable_debug" = yes; then
+ AC_DEFINE(ENABLE_DEBUG)
+ fi
+])
+
+# vi: set ts=8 sw=2 :
diff --git a/config.guess b/config.guess
new file mode 100755
index 0000000..dd1688b
--- /dev/null
+++ b/config.guess
@@ -0,0 +1,1459 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+
+timestamp='2004-06-11'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Per Bothner <per@bothner.com>.
+# Please send patches to <config-patches@gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub. If it succeeds, it prints the system name on stdout, and
+# exits with 0. Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit 0 ;;
+ --version | -v )
+ echo "$version" ; exit 0 ;;
+ --help | --h* | -h )
+ echo "$usage"; exit 0 ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+ * )
+ break ;;
+ esac
+done
+
+if test $# != 0; then
+ echo "$me: too many arguments$help" >&2
+ exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,) echo "int x;" > $dummy.c ;
+ for c in cc gcc c89 c99 ; do
+ if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+ CC_FOR_BUILD="$c"; break ;
+ fi ;
+ done ;
+ if test x"$CC_FOR_BUILD" = x ; then
+ CC_FOR_BUILD=no_compiler_found ;
+ fi
+ ;;
+ ,,*) CC_FOR_BUILD=$CC ;;
+ ,*,*) CC_FOR_BUILD=$HOST_CC ;;
+esac ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+ PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ *:NetBSD:*:*)
+ # NetBSD (nbsd) targets should (where applicable) match one or
+ # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
+ # switched to ELF, *-*-netbsd* would select the old
+ # object file format. This provides both forward
+ # compatibility and a consistent mechanism for selecting the
+ # object file format.
+ #
+ # Note: NetBSD doesn't particularly care about the vendor
+ # portion of the name. We always set it to "unknown".
+ sysctl="sysctl -n hw.machine_arch"
+ UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+ /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+ case "${UNAME_MACHINE_ARCH}" in
+ armeb) machine=armeb-unknown ;;
+ arm*) machine=arm-unknown ;;
+ sh3el) machine=shl-unknown ;;
+ sh3eb) machine=sh-unknown ;;
+ *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+ esac
+ # The Operating System including object format, if it has switched
+ # to ELF recently, or will in the future.
+ case "${UNAME_MACHINE_ARCH}" in
+ arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ eval $set_cc_for_build
+ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep __ELF__ >/dev/null
+ then
+ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+ # Return netbsd for either. FIX?
+ os=netbsd
+ else
+ os=netbsdelf
+ fi
+ ;;
+ *)
+ os=netbsd
+ ;;
+ esac
+ # The OS release
+ # Debian GNU/NetBSD machines have a different userland, and
+ # thus, need a distinct triplet. However, they do not need
+ # kernel version information, so it can be replaced with a
+ # suitable tag, in the style of linux-gnu.
+ case "${UNAME_VERSION}" in
+ Debian*)
+ release='-gnu'
+ ;;
+ *)
+ release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ ;;
+ esac
+ # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+ # contains redundant information, the shorter form:
+ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+ echo "${machine}-${os}${release}"
+ exit 0 ;;
+ amd64:OpenBSD:*:*)
+ echo x86_64-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ amiga:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ arc:OpenBSD:*:*)
+ echo mipsel-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ cats:OpenBSD:*:*)
+ echo arm-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ hp300:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ luna88k:OpenBSD:*:*)
+ echo m88k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mac68k:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ macppc:OpenBSD:*:*)
+ echo powerpc-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mvme68k:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mvme88k:OpenBSD:*:*)
+ echo m88k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mvmeppc:OpenBSD:*:*)
+ echo powerpc-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ pmax:OpenBSD:*:*)
+ echo mipsel-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sgi:OpenBSD:*:*)
+ echo mipseb-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sun3:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ wgrisc:OpenBSD:*:*)
+ echo mipsel-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ *:OpenBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ *:ekkoBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+ exit 0 ;;
+ macppc:MirBSD:*:*)
+ echo powerppc-unknown-mirbsd${UNAME_RELEASE}
+ exit 0 ;;
+ *:MirBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+ exit 0 ;;
+ alpha:OSF1:*:*)
+ case $UNAME_RELEASE in
+ *4.0)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ ;;
+ *5.*)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+ ;;
+ esac
+ # According to Compaq, /usr/sbin/psrinfo has been available on
+ # OSF/1 and Tru64 systems produced since 1995. I hope that
+ # covers most systems running today. This code pipes the CPU
+ # types through head -n 1, so we only detect the type of CPU 0.
+ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+ case "$ALPHA_CPU_TYPE" in
+ "EV4 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "EV4.5 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "LCA4 (21066/21068)")
+ UNAME_MACHINE="alpha" ;;
+ "EV5 (21164)")
+ UNAME_MACHINE="alphaev5" ;;
+ "EV5.6 (21164A)")
+ UNAME_MACHINE="alphaev56" ;;
+ "EV5.6 (21164PC)")
+ UNAME_MACHINE="alphapca56" ;;
+ "EV5.7 (21164PC)")
+ UNAME_MACHINE="alphapca57" ;;
+ "EV6 (21264)")
+ UNAME_MACHINE="alphaev6" ;;
+ "EV6.7 (21264A)")
+ UNAME_MACHINE="alphaev67" ;;
+ "EV6.8CB (21264C)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8AL (21264B)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8CX (21264D)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.9A (21264/EV69A)")
+ UNAME_MACHINE="alphaev69" ;;
+ "EV7 (21364)")
+ UNAME_MACHINE="alphaev7" ;;
+ "EV7.9 (21364A)")
+ UNAME_MACHINE="alphaev79" ;;
+ esac
+ # A Pn.n version is a patched version.
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ exit 0 ;;
+ Alpha*:OpenVMS:*:*)
+ echo alpha-hp-vms
+ exit 0 ;;
+ Alpha\ *:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # Should we change UNAME_MACHINE based on the output of uname instead
+ # of the specific Alpha model?
+ echo alpha-pc-interix
+ exit 0 ;;
+ 21064:Windows_NT:50:3)
+ echo alpha-dec-winnt3.5
+ exit 0 ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ echo m68k-unknown-sysv4
+ exit 0;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-amigaos
+ exit 0 ;;
+ *:[Mm]orph[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-morphos
+ exit 0 ;;
+ *:OS/390:*:*)
+ echo i370-ibm-openedition
+ exit 0 ;;
+ *:OS400:*:*)
+ echo powerpc-ibm-os400
+ exit 0 ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ echo arm-acorn-riscix${UNAME_RELEASE}
+ exit 0;;
+ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+ echo hppa1.1-hitachi-hiuxmpp
+ exit 0;;
+ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ if test "`(/bin/universe) 2>/dev/null`" = att ; then
+ echo pyramid-pyramid-sysv3
+ else
+ echo pyramid-pyramid-bsd
+ fi
+ exit 0 ;;
+ NILE*:*:*:dcosx)
+ echo pyramid-pyramid-svr4
+ exit 0 ;;
+ DRS?6000:unix:4.0:6*)
+ echo sparc-icl-nx6
+ exit 0 ;;
+ DRS?6000:UNIX_SV:4.2*:7*)
+ case `/usr/bin/uname -p` in
+ sparc) echo sparc-icl-nx7 && exit 0 ;;
+ esac ;;
+ sun4H:SunOS:5.*:*)
+ echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ i86pc:SunOS:5.*:*)
+ echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ sun4*:SunOS:*:*)
+ case "`/usr/bin/arch -k`" in
+ Series*|S4*)
+ UNAME_RELEASE=`uname -v`
+ ;;
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+ exit 0 ;;
+ sun3*:SunOS:*:*)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ exit 0 ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+ case "`/bin/arch`" in
+ sun3)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ ;;
+ sun4)
+ echo sparc-sun-sunos${UNAME_RELEASE}
+ ;;
+ esac
+ exit 0 ;;
+ aushp:SunOS:*:*)
+ echo sparc-auspex-sunos${UNAME_RELEASE}
+ exit 0 ;;
+ # The situation for MiNT is a little confusing. The machine name
+ # can be virtually everything (everything which is not
+ # "atarist" or "atariste" at least should have a processor
+ # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
+ # to the lowercase version "mint" (or "freemint"). Finally
+ # the system name "TOS" denotes a system which is actually not
+ # MiNT. But MiNT is downward compatible to TOS, so this should
+ # be no problem.
+ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit 0 ;;
+ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit 0 ;;
+ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit 0 ;;
+ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+ echo m68k-milan-mint${UNAME_RELEASE}
+ exit 0 ;;
+ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+ echo m68k-hades-mint${UNAME_RELEASE}
+ exit 0 ;;
+ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+ echo m68k-unknown-mint${UNAME_RELEASE}
+ exit 0 ;;
+ m68k:machten:*:*)
+ echo m68k-apple-machten${UNAME_RELEASE}
+ exit 0 ;;
+ powerpc:machten:*:*)
+ echo powerpc-apple-machten${UNAME_RELEASE}
+ exit 0 ;;
+ RISC*:Mach:*:*)
+ echo mips-dec-mach_bsd4.3
+ exit 0 ;;
+ RISC*:ULTRIX:*:*)
+ echo mips-dec-ultrix${UNAME_RELEASE}
+ exit 0 ;;
+ VAX*:ULTRIX*:*:*)
+ echo vax-dec-ultrix${UNAME_RELEASE}
+ exit 0 ;;
+ 2020:CLIX:*:* | 2430:CLIX:*:*)
+ echo clipper-intergraph-clix${UNAME_RELEASE}
+ exit 0 ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h> /* for printf() prototype */
+ int main (int argc, char *argv[]) {
+#else
+ int main (argc, argv) int argc; char *argv[]; {
+#endif
+ #if defined (host_mips) && defined (MIPSEB)
+ #if defined (SYSTYPE_SYSV)
+ printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_SVR4)
+ printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+ printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+ #endif
+ #endif
+ exit (-1);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c \
+ && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+ && exit 0
+ echo mips-mips-riscos${UNAME_RELEASE}
+ exit 0 ;;
+ Motorola:PowerMAX_OS:*:*)
+ echo powerpc-motorola-powermax
+ exit 0 ;;
+ Motorola:*:4.3:PL8-*)
+ echo powerpc-harris-powermax
+ exit 0 ;;
+ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+ echo powerpc-harris-powermax
+ exit 0 ;;
+ Night_Hawk:Power_UNIX:*:*)
+ echo powerpc-harris-powerunix
+ exit 0 ;;
+ m88k:CX/UX:7*:*)
+ echo m88k-harris-cxux7
+ exit 0 ;;
+ m88k:*:4*:R4*)
+ echo m88k-motorola-sysv4
+ exit 0 ;;
+ m88k:*:3*:R3*)
+ echo m88k-motorola-sysv3
+ exit 0 ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+ then
+ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+ [ ${TARGET_BINARY_INTERFACE}x = x ]
+ then
+ echo m88k-dg-dgux${UNAME_RELEASE}
+ else
+ echo m88k-dg-dguxbcs${UNAME_RELEASE}
+ fi
+ else
+ echo i586-dg-dgux${UNAME_RELEASE}
+ fi
+ exit 0 ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ echo m88k-dolphin-sysv3
+ exit 0 ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ echo m88k-motorola-sysv3
+ exit 0 ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ echo m88k-tektronix-sysv3
+ exit 0 ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ echo m68k-tektronix-bsd
+ exit 0 ;;
+ *:IRIX*:*:*)
+ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+ exit 0 ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i*86:AIX:*:*)
+ echo i386-ibm-aix
+ exit 0 ;;
+ ia64:AIX:*:*)
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+ exit 0 ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0
+ echo rs6000-ibm-aix3.2.5
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ echo rs6000-ibm-aix3.2.4
+ else
+ echo rs6000-ibm-aix3.2
+ fi
+ exit 0 ;;
+ *:AIX:*:[45])
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+ if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+ exit 0 ;;
+ *:AIX:*:*)
+ echo rs6000-ibm-aix
+ exit 0 ;;
+ ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+ echo romp-ibm-bsd4.4
+ exit 0 ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
+ echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
+ exit 0 ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ echo rs6000-bull-bosx
+ exit 0 ;;
+ DPX/2?00:B.O.S.:*:*)
+ echo m68k-bull-sysv3
+ exit 0 ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ echo m68k-hp-bsd
+ exit 0 ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ echo m68k-hp-bsd4.4
+ exit 0 ;;
+ 9000/[34678]??:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ case "${UNAME_MACHINE}" in
+ 9000/31? ) HP_ARCH=m68000 ;;
+ 9000/[34]?? ) HP_ARCH=m68k ;;
+ 9000/[678][0-9][0-9])
+ if [ -x /usr/bin/getconf ]; then
+ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+ case "${sc_cpu_version}" in
+ 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+ 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+ 532) # CPU_PA_RISC2_0
+ case "${sc_kernel_bits}" in
+ 32) HP_ARCH="hppa2.0n" ;;
+ 64) HP_ARCH="hppa2.0w" ;;
+ '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
+ esac ;;
+ esac
+ fi
+ if [ "${HP_ARCH}" = "" ]; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+
+ #define _HPUX_SOURCE
+ #include <stdlib.h>
+ #include <unistd.h>
+
+ int main ()
+ {
+ #if defined(_SC_KERNEL_BITS)
+ long bits = sysconf(_SC_KERNEL_BITS);
+ #endif
+ long cpu = sysconf (_SC_CPU_VERSION);
+
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+ case CPU_PA_RISC2_0:
+ #if defined(_SC_KERNEL_BITS)
+ switch (bits)
+ {
+ case 64: puts ("hppa2.0w"); break;
+ case 32: puts ("hppa2.0n"); break;
+ default: puts ("hppa2.0"); break;
+ } break;
+ #else /* !defined(_SC_KERNEL_BITS) */
+ puts ("hppa2.0"); break;
+ #endif
+ default: puts ("hppa1.0"); break;
+ }
+ exit (0);
+ }
+EOF
+ (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+ test -z "$HP_ARCH" && HP_ARCH=hppa
+ fi ;;
+ esac
+ if [ ${HP_ARCH} = "hppa2.0w" ]
+ then
+ # avoid double evaluation of $set_cc_for_build
+ test -n "$CC_FOR_BUILD" || eval $set_cc_for_build
+ if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null
+ then
+ HP_ARCH="hppa2.0w"
+ else
+ HP_ARCH="hppa64"
+ fi
+ fi
+ echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+ exit 0 ;;
+ ia64:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ echo ia64-hp-hpux${HPUX_REV}
+ exit 0 ;;
+ 3050*:HI-UX:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <unistd.h>
+ int
+ main ()
+ {
+ long cpu = sysconf (_SC_CPU_VERSION);
+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
+ results, however. */
+ if (CPU_IS_PA_RISC (cpu))
+ {
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+ default: puts ("hppa-hitachi-hiuxwe2"); break;
+ }
+ }
+ else if (CPU_IS_HP_MC68K (cpu))
+ puts ("m68k-hitachi-hiuxwe2");
+ else puts ("unknown-hitachi-hiuxwe2");
+ exit (0);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0
+ echo unknown-hitachi-hiuxwe2
+ exit 0 ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+ echo hppa1.1-hp-bsd
+ exit 0 ;;
+ 9000/8??:4.3bsd:*:*)
+ echo hppa1.0-hp-bsd
+ exit 0 ;;
+ *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+ echo hppa1.0-hp-mpeix
+ exit 0 ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+ echo hppa1.1-hp-osf
+ exit 0 ;;
+ hp8??:OSF1:*:*)
+ echo hppa1.0-hp-osf
+ exit 0 ;;
+ i*86:OSF1:*:*)
+ if [ -x /usr/sbin/sysversion ] ; then
+ echo ${UNAME_MACHINE}-unknown-osf1mk
+ else
+ echo ${UNAME_MACHINE}-unknown-osf1
+ fi
+ exit 0 ;;
+ parisc*:Lites*:*:*)
+ echo hppa1.1-hp-lites
+ exit 0 ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ echo c1-convex-bsd
+ exit 0 ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit 0 ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ echo c34-convex-bsd
+ exit 0 ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ echo c38-convex-bsd
+ exit 0 ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ echo c4-convex-bsd
+ exit 0 ;;
+ CRAY*Y-MP:*:*:*)
+ echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit 0 ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+ -e 's/\.[^.]*$/.X/'
+ exit 0 ;;
+ CRAY*TS:*:*:*)
+ echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit 0 ;;
+ CRAY*T3E:*:*:*)
+ echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit 0 ;;
+ CRAY*SV1:*:*:*)
+ echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit 0 ;;
+ *:UNICOS/mp:*:*)
+ echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit 0 ;;
+ F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+ FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+ echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit 0 ;;
+ 5000:UNIX_System_V:4.*:*)
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit 0 ;;
+ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+ echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+ exit 0 ;;
+ sparc*:BSD/OS:*:*)
+ echo sparc-unknown-bsdi${UNAME_RELEASE}
+ exit 0 ;;
+ *:BSD/OS:*:*)
+ echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+ exit 0 ;;
+ *:FreeBSD:*:*)
+ # Determine whether the default compiler uses glibc.
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <features.h>
+ #if __GLIBC__ >= 2
+ LIBC=gnu
+ #else
+ LIBC=
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
+ # GNU/KFreeBSD systems have a "k" prefix to indicate we are using
+ # FreeBSD's kernel, but not the complete OS.
+ case ${LIBC} in gnu) kernel_only='k' ;; esac
+ echo ${UNAME_MACHINE}-unknown-${kernel_only}freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC}
+ exit 0 ;;
+ i*:CYGWIN*:*)
+ echo ${UNAME_MACHINE}-pc-cygwin
+ exit 0 ;;
+ i*:MINGW*:*)
+ echo ${UNAME_MACHINE}-pc-mingw32
+ exit 0 ;;
+ i*:PW*:*)
+ echo ${UNAME_MACHINE}-pc-pw32
+ exit 0 ;;
+ x86:Interix*:[34]*)
+ echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//'
+ exit 0 ;;
+ [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+ echo i${UNAME_MACHINE}-pc-mks
+ exit 0 ;;
+ i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+ # UNAME_MACHINE based on the output of uname instead of i386?
+ echo i586-pc-interix
+ exit 0 ;;
+ i*:UWIN*:*)
+ echo ${UNAME_MACHINE}-pc-uwin
+ exit 0 ;;
+ p*:CYGWIN*:*)
+ echo powerpcle-unknown-cygwin
+ exit 0 ;;
+ prep*:SunOS:5.*:*)
+ echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ *:GNU:*:*)
+ # the GNU system
+ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ exit 0 ;;
+ *:GNU/*:*:*)
+ # other systems with GNU libc and userland
+ echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+ exit 0 ;;
+ i*86:Minix:*:*)
+ echo ${UNAME_MACHINE}-pc-minix
+ exit 0 ;;
+ arm*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit 0 ;;
+ cris:Linux:*:*)
+ echo cris-axis-linux-gnu
+ exit 0 ;;
+ ia64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit 0 ;;
+ m32r*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit 0 ;;
+ m68*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit 0 ;;
+ mips:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips
+ #undef mipsel
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mipsel
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
+ test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0
+ ;;
+ mips64:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips64
+ #undef mips64el
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mips64el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips64
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
+ test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0
+ ;;
+ ppc:Linux:*:*)
+ echo powerpc-unknown-linux-gnu
+ exit 0 ;;
+ ppc64:Linux:*:*)
+ echo powerpc64-unknown-linux-gnu
+ exit 0 ;;
+ alpha:Linux:*:*)
+ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+ EV5) UNAME_MACHINE=alphaev5 ;;
+ EV56) UNAME_MACHINE=alphaev56 ;;
+ PCA56) UNAME_MACHINE=alphapca56 ;;
+ PCA57) UNAME_MACHINE=alphapca56 ;;
+ EV6) UNAME_MACHINE=alphaev6 ;;
+ EV67) UNAME_MACHINE=alphaev67 ;;
+ EV68*) UNAME_MACHINE=alphaev68 ;;
+ esac
+ objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+ if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+ echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+ exit 0 ;;
+ parisc:Linux:*:* | hppa:Linux:*:*)
+ # Look for CPU level
+ case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+ PA7*) echo hppa1.1-unknown-linux-gnu ;;
+ PA8*) echo hppa2.0-unknown-linux-gnu ;;
+ *) echo hppa-unknown-linux-gnu ;;
+ esac
+ exit 0 ;;
+ parisc64:Linux:*:* | hppa64:Linux:*:*)
+ echo hppa64-unknown-linux-gnu
+ exit 0 ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+ echo ${UNAME_MACHINE}-ibm-linux
+ exit 0 ;;
+ sh64*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit 0 ;;
+ sh*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit 0 ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit 0 ;;
+ x86_64:Linux:*:*)
+ echo x86_64-unknown-linux-gnu
+ exit 0 ;;
+ i*86:Linux:*:*)
+ # The BFD linker knows what the default object file format is, so
+ # first see if it will tell us. cd to the root directory to prevent
+ # problems with other programs or directories called `ld' in the path.
+ # Set LC_ALL=C to ensure ld outputs messages in English.
+ ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+ | sed -ne '/supported targets:/!d
+ s/[ ][ ]*/ /g
+ s/.*supported targets: *//
+ s/ .*//
+ p'`
+ case "$ld_supported_targets" in
+ elf32-i386)
+ TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+ ;;
+ a.out-i386-linux)
+ echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+ exit 0 ;;
+ coff-i386)
+ echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+ exit 0 ;;
+ "")
+ # Either a pre-BFD a.out linker (linux-gnuoldld) or
+ # one that does not give us useful --help.
+ echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+ exit 0 ;;
+ esac
+ # Determine whether the default compiler is a.out or elf
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <features.h>
+ #ifdef __ELF__
+ # ifdef __GLIBC__
+ # if __GLIBC__ >= 2
+ LIBC=gnu
+ # else
+ LIBC=gnulibc1
+ # endif
+ # else
+ LIBC=gnulibc1
+ # endif
+ #else
+ #ifdef __INTEL_COMPILER
+ LIBC=gnu
+ #else
+ LIBC=gnuaout
+ #endif
+ #endif
+ #ifdef __dietlibc__
+ LIBC=dietlibc
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
+ test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0
+ test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
+ ;;
+ i*86:DYNIX/ptx:4*:*)
+ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+ # earlier versions are messed up and put the nodename in both
+ # sysname and nodename.
+ echo i386-sequent-sysv4
+ exit 0 ;;
+ i*86:UNIX_SV:4.2MP:2.*)
+ # Unixware is an offshoot of SVR4, but it has its own version
+ # number series starting with 2...
+ # I am not positive that other SVR4 systems won't match this,
+ # I just have to hope. -- rms.
+ # Use sysv4.2uw... so that sysv4* matches it.
+ echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+ exit 0 ;;
+ i*86:OS/2:*:*)
+ # If we were able to find `uname', then EMX Unix compatibility
+ # is probably installed.
+ echo ${UNAME_MACHINE}-pc-os2-emx
+ exit 0 ;;
+ i*86:XTS-300:*:STOP)
+ echo ${UNAME_MACHINE}-unknown-stop
+ exit 0 ;;
+ i*86:atheos:*:*)
+ echo ${UNAME_MACHINE}-unknown-atheos
+ exit 0 ;;
+ i*86:syllable:*:*)
+ echo ${UNAME_MACHINE}-pc-syllable
+ exit 0 ;;
+ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+ echo i386-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ i*86:*DOS:*:*)
+ echo ${UNAME_MACHINE}-pc-msdosdjgpp
+ exit 0 ;;
+ i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+ UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+ fi
+ exit 0 ;;
+ i*86:*:5:[78]*)
+ case `/bin/uname -X | grep "^Machine"` in
+ *486*) UNAME_MACHINE=i486 ;;
+ *Pentium) UNAME_MACHINE=i586 ;;
+ *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+ esac
+ echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+ exit 0 ;;
+ i*86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+ && UNAME_MACHINE=i686
+ (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+ && UNAME_MACHINE=i686
+ echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+ else
+ echo ${UNAME_MACHINE}-pc-sysv32
+ fi
+ exit 0 ;;
+ pc:*:*:*)
+ # Left here for compatibility:
+ # uname -m prints for DJGPP always 'pc', but it prints nothing about
+ # the processor, so we play safe by assuming i386.
+ echo i386-pc-msdosdjgpp
+ exit 0 ;;
+ Intel:Mach:3*:*)
+ echo i386-pc-mach3
+ exit 0 ;;
+ paragon:*:*:*)
+ echo i860-intel-osf1
+ exit 0 ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
+ fi
+ exit 0 ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ echo m68010-convergent-sysv
+ exit 0 ;;
+ mc68k:UNIX:SYSTEM5:3.51m)
+ echo m68k-convergent-sysv
+ exit 0 ;;
+ M680?0:D-NIX:5.3:*)
+ echo m68k-diab-dnix
+ exit 0 ;;
+ M68*:*:R3V[5678]*:*)
+ test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && echo i486-ncr-sysv4 && exit 0 ;;
+ m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+ echo m68k-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ mc68030:UNIX_System_V:4.*:*)
+ echo m68k-atari-sysv4
+ exit 0 ;;
+ TSUNAMI:LynxOS:2.*:*)
+ echo sparc-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ rs6000:LynxOS:2.*:*)
+ echo rs6000-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+ echo powerpc-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ SM[BE]S:UNIX_SV:*:*)
+ echo mips-dde-sysv${UNAME_RELEASE}
+ exit 0 ;;
+ RM*:ReliantUNIX-*:*:*)
+ echo mips-sni-sysv4
+ exit 0 ;;
+ RM*:SINIX-*:*:*)
+ echo mips-sni-sysv4
+ exit 0 ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ echo ${UNAME_MACHINE}-sni-sysv4
+ else
+ echo ns32k-sni-sysv
+ fi
+ exit 0 ;;
+ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
+ echo i586-unisys-sysv4
+ exit 0 ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ echo hppa1.1-stratus-sysv4
+ exit 0 ;;
+ *:*:*:FTX*)
+ # From seanf@swdc.stratus.com.
+ echo i860-stratus-sysv4
+ exit 0 ;;
+ *:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo hppa1.1-stratus-vos
+ exit 0 ;;
+ mc68*:A/UX:*:*)
+ echo m68k-apple-aux${UNAME_RELEASE}
+ exit 0 ;;
+ news*:NEWS-OS:6*:*)
+ echo mips-sony-newsos6
+ exit 0 ;;
+ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+ if [ -d /usr/nec ]; then
+ echo mips-nec-sysv${UNAME_RELEASE}
+ else
+ echo mips-unknown-sysv${UNAME_RELEASE}
+ fi
+ exit 0 ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ echo powerpc-be-beos
+ exit 0 ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ echo powerpc-apple-beos
+ exit 0 ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ echo i586-pc-beos
+ exit 0 ;;
+ SX-4:SUPER-UX:*:*)
+ echo sx4-nec-superux${UNAME_RELEASE}
+ exit 0 ;;
+ SX-5:SUPER-UX:*:*)
+ echo sx5-nec-superux${UNAME_RELEASE}
+ exit 0 ;;
+ SX-6:SUPER-UX:*:*)
+ echo sx6-nec-superux${UNAME_RELEASE}
+ exit 0 ;;
+ Power*:Rhapsody:*:*)
+ echo powerpc-apple-rhapsody${UNAME_RELEASE}
+ exit 0 ;;
+ *:Rhapsody:*:*)
+ echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+ exit 0 ;;
+ *:Darwin:*:*)
+ case `uname -p` in
+ *86) UNAME_PROCESSOR=i686 ;;
+ powerpc) UNAME_PROCESSOR=powerpc ;;
+ esac
+ echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+ exit 0 ;;
+ *:procnto*:*:* | *:QNX:[0123456789]*:*)
+ UNAME_PROCESSOR=`uname -p`
+ if test "$UNAME_PROCESSOR" = "x86"; then
+ UNAME_PROCESSOR=i386
+ UNAME_MACHINE=pc
+ fi
+ echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+ exit 0 ;;
+ *:QNX:*:4*)
+ echo i386-pc-qnx
+ exit 0 ;;
+ NSR-?:NONSTOP_KERNEL:*:*)
+ echo nsr-tandem-nsk${UNAME_RELEASE}
+ exit 0 ;;
+ *:NonStop-UX:*:*)
+ echo mips-compaq-nonstopux
+ exit 0 ;;
+ BS2000:POSIX*:*:*)
+ echo bs2000-siemens-sysv
+ exit 0 ;;
+ DS/*:UNIX_System_V:*:*)
+ echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+ exit 0 ;;
+ *:Plan9:*:*)
+ # "uname -m" is not consistent, so use $cputype instead. 386
+ # is converted to i386 for consistency with other x86
+ # operating systems.
+ if test "$cputype" = "386"; then
+ UNAME_MACHINE=i386
+ else
+ UNAME_MACHINE="$cputype"
+ fi
+ echo ${UNAME_MACHINE}-unknown-plan9
+ exit 0 ;;
+ *:TOPS-10:*:*)
+ echo pdp10-unknown-tops10
+ exit 0 ;;
+ *:TENEX:*:*)
+ echo pdp10-unknown-tenex
+ exit 0 ;;
+ KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+ echo pdp10-dec-tops20
+ exit 0 ;;
+ XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+ echo pdp10-xkl-tops20
+ exit 0 ;;
+ *:TOPS-20:*:*)
+ echo pdp10-unknown-tops20
+ exit 0 ;;
+ *:ITS:*:*)
+ echo pdp10-unknown-its
+ exit 0 ;;
+ SEI:*:*:SEIUX)
+ echo mips-sei-seiux${UNAME_RELEASE}
+ exit 0 ;;
+ *:DragonFly:*:*)
+ echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+ I don't know.... */
+ printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+ printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+ "4"
+#else
+ ""
+#endif
+ ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+ printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+ printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+ int version;
+ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+ if (version < 4)
+ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+ else
+ printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+ exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+ printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+ printf ("ns32k-encore-mach\n"); exit (0);
+#else
+ printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+ printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+ printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+ printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+ struct utsname un;
+
+ uname(&un);
+
+ if (strncmp(un.version, "V2", 2) == 0) {
+ printf ("i386-sequent-ptx2\n"); exit (0);
+ }
+ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+ printf ("i386-sequent-ptx1\n"); exit (0);
+ }
+ printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+# include <sys/param.h>
+# if defined (BSD)
+# if BSD == 43
+ printf ("vax-dec-bsd4.3\n"); exit (0);
+# else
+# if BSD == 199006
+ printf ("vax-dec-bsd4.3reno\n"); exit (0);
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# endif
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# else
+ printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+ exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+ case `getsysinfo -f cpu_type` in
+ c1*)
+ echo c1-convex-bsd
+ exit 0 ;;
+ c2*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit 0 ;;
+ c34*)
+ echo c34-convex-bsd
+ exit 0 ;;
+ c38*)
+ echo c38-convex-bsd
+ exit 0 ;;
+ c4*)
+ echo c4-convex-bsd
+ exit 0 ;;
+ esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+ ftp://ftp.gnu.org/pub/gnu/config/
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo = `(hostinfo) 2>/dev/null`
+/bin/universe = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/config.h.in b/config.h.in
new file mode 100644
index 0000000..9040a72
--- /dev/null
+++ b/config.h.in
@@ -0,0 +1,151 @@
+/* config.h.in. Generated automatically from configure.in by autoheader. */
+
+/* Define to empty if the keyword does not work. */
+#undef const
+
+/* Define if you have a working `mmap' system call. */
+#undef HAVE_MMAP
+
+/* Define to `long' if <sys/types.h> doesn't define. */
+#undef off_t
+
+/* Define to `unsigned' if <sys/types.h> doesn't define. */
+#undef size_t
+
+/* Define if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Define if you want to include extra debugging code */
+#undef ENABLE_DEBUG
+
+/* Define if you want to support extended ELF formats */
+#undef ENABLE_EXTENDED_FORMAT
+
+/* Define if you want ELF format sanity checks by default */
+#undef ENABLE_SANITY_CHECKS
+
+/* Define if memmove() does not copy overlapping arrays correctly */
+#undef HAVE_BROKEN_MEMMOVE
+
+/* Define if you have the catgets function. */
+#undef HAVE_CATGETS
+
+/* Define if you have the dgettext function. */
+#undef HAVE_DGETTEXT
+
+/* Define if you have the memset function. */
+#undef HAVE_MEMSET
+
+/* Define if struct nlist is declared in <elf.h> or <sys/elf.h> */
+#undef HAVE_STRUCT_NLIST_DECLARATION
+
+/* Define if Elf32_Dyn is declared in <link.h> */
+#undef __LIBELF_NEED_LINK_H
+
+/* Define if Elf32_Dyn is declared in <sys/link.h> */
+#undef __LIBELF_NEED_SYS_LINK_H
+
+/* Define to `<elf.h>' or `<sys/elf.h>' if one of them is present */
+#undef __LIBELF_HEADER_ELF_H
+
+/* Define if you want 64-bit support (and your system supports it) */
+#undef __LIBELF64
+
+/* Define if you want 64-bit support, and are running IRIX */
+#undef __LIBELF64_IRIX
+
+/* Define if you want 64-bit support, and are running Linux */
+#undef __LIBELF64_LINUX
+
+/* Define if you want symbol versioning (and your system supports it) */
+#undef __LIBELF_SYMBOL_VERSIONS
+
+/* Define if symbol versioning uses Sun section type (SHT_SUNW_*) */
+#undef __LIBELF_SUN_SYMBOL_VERSIONS
+
+/* Define if symbol versioning uses GNU section types (SHT_GNU_*) */
+#undef __LIBELF_GNU_SYMBOL_VERSIONS
+
+/* Define to a 64-bit signed integer type if one exists */
+#undef __libelf_i64_t
+
+/* Define to a 64-bit unsigned integer type if one exists */
+#undef __libelf_u64_t
+
+/* Define to a 32-bit signed integer type if one exists */
+#undef __libelf_i32_t
+
+/* Define to a 32-bit unsigned integer type if one exists */
+#undef __libelf_u32_t
+
+/* Define to a 16-bit signed integer type if one exists */
+#undef __libelf_i16_t
+
+/* Define to a 16-bit unsigned integer type if one exists */
+#undef __libelf_u16_t
+
+/* The number of bytes in a __int64. */
+#undef SIZEOF___INT64
+
+/* The number of bytes in a int. */
+#undef SIZEOF_INT
+
+/* The number of bytes in a long. */
+#undef SIZEOF_LONG
+
+/* The number of bytes in a long long. */
+#undef SIZEOF_LONG_LONG
+
+/* The number of bytes in a short. */
+#undef SIZEOF_SHORT
+
+/* Define if you have the ftruncate function. */
+#undef HAVE_FTRUNCATE
+
+/* Define if you have the getpagesize function. */
+#undef HAVE_GETPAGESIZE
+
+/* Define if you have the memcmp function. */
+#undef HAVE_MEMCMP
+
+/* Define if you have the memcpy function. */
+#undef HAVE_MEMCPY
+
+/* Define if you have the memmove function. */
+#undef HAVE_MEMMOVE
+
+/* Define if you have the memset function. */
+#undef HAVE_MEMSET
+
+/* Define if you have the <ar.h> header file. */
+#undef HAVE_AR_H
+
+/* Define if you have the <elf.h> header file. */
+#undef HAVE_ELF_H
+
+/* Define if you have the <fcntl.h> header file. */
+#undef HAVE_FCNTL_H
+
+/* Define if you have the <gelf.h> header file. */
+#undef HAVE_GELF_H
+
+/* Define if you have the <libelf.h> header file. */
+#undef HAVE_LIBELF_H
+
+/* Define if you have the <link.h> header file. */
+#undef HAVE_LINK_H
+
+/* Define if you have the <nlist.h> header file. */
+#undef HAVE_NLIST_H
+
+/* Define if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define if you have the <sys/elf.h> header file. */
+#undef HAVE_SYS_ELF_H
+
+/* Define if you have the <sys/link.h> header file. */
+#undef HAVE_SYS_LINK_H
+
+/* Define if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
diff --git a/config.sub b/config.sub
new file mode 100755
index 0000000..ba33103
--- /dev/null
+++ b/config.sub
@@ -0,0 +1,1549 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+
+timestamp='2004-03-12'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine. It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Please send patches to <config-patches@gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+ $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit 0 ;;
+ --version | -v )
+ echo "$version" ; exit 0 ;;
+ --help | --h* | -h )
+ echo "$usage"; exit 0 ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help"
+ exit 1 ;;
+
+ *local*)
+ # First pass through any local machine types.
+ echo $1
+ exit 0;;
+
+ * )
+ break ;;
+ esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+ exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+ exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+ nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \
+ kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
+ os=-$maybe_os
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ *)
+ basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+ if [ $basic_machine != $1 ]
+ then os=`echo $1 | sed 's/.*-/-/'`
+ else os=; fi
+ ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work. We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+ -sun*os*)
+ # Prevent following clause from handling this invalid input.
+ ;;
+ -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+ -apple | -axis)
+ os=
+ basic_machine=$1
+ ;;
+ -sim | -cisco | -oki | -wec | -winbond)
+ os=
+ basic_machine=$1
+ ;;
+ -scout)
+ ;;
+ -wrs)
+ os=-vxworks
+ basic_machine=$1
+ ;;
+ -chorusos*)
+ os=-chorusos
+ basic_machine=$1
+ ;;
+ -chorusrdb)
+ os=-chorusrdb
+ basic_machine=$1
+ ;;
+ -hiux*)
+ os=-hiuxwe2
+ ;;
+ -sco5)
+ os=-sco3.2v5
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco4)
+ os=-sco3.2v4
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2.[4-9]*)
+ os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2v[4-9]*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco*)
+ os=-sco3.2v2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -udk*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -isc)
+ os=-isc2.2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -clix*)
+ basic_machine=clipper-intergraph
+ ;;
+ -isc*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -lynx*)
+ os=-lynxos
+ ;;
+ -ptx*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+ ;;
+ -windowsnt*)
+ os=`echo $os | sed -e 's/windowsnt/winnt/'`
+ ;;
+ -psos*)
+ os=-psos
+ ;;
+ -mint | -mint[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+ # Recognize the basic CPU types without company name.
+ # Some are omitted here because they have special meanings below.
+ 1750a | 580 \
+ | a29k \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ | am33_2.0 \
+ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+ | c4x | clipper \
+ | d10v | d30v | dlx | dsp16xx \
+ | fr30 | frv \
+ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | i370 | i860 | i960 | ia64 \
+ | ip2k | iq2000 \
+ | m32r | m32rle | m68000 | m68k | m88k | mcore \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64el \
+ | mips64vr | mips64vrel \
+ | mips64orion | mips64orionel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipstx39 | mipstx39el \
+ | mn10200 | mn10300 \
+ | msp430 \
+ | ns16k | ns32k \
+ | openrisc | or32 \
+ | pdp10 | pdp11 | pj | pjl \
+ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+ | pyramid \
+ | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
+ | sh64 | sh64le \
+ | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv8 | sparcv9 | sparcv9b \
+ | strongarm \
+ | tahoe | thumb | tic4x | tic80 | tron \
+ | v850 | v850e \
+ | we32k \
+ | x86 | xscale | xstormy16 | xtensa \
+ | z8k)
+ basic_machine=$basic_machine-unknown
+ ;;
+ m6811 | m68hc11 | m6812 | m68hc12)
+ # Motorola 68HC11/12.
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+ ;;
+
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i*86 | x86_64)
+ basic_machine=$basic_machine-pc
+ ;;
+ # Object if more than one company name word.
+ *-*-*)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+ # Recognize the basic CPU types with company name.
+ 580-* \
+ | a29k-* \
+ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
+ | avr-* \
+ | bs2000-* \
+ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+ | clipper-* | cydra-* \
+ | d10v-* | d30v-* | dlx-* \
+ | elxsi-* \
+ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
+ | h8300-* | h8500-* \
+ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+ | i*86-* | i860-* | i960-* | ia64-* \
+ | ip2k-* | iq2000-* \
+ | m32r-* | m32rle-* \
+ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+ | m88110-* | m88k-* | mcore-* \
+ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+ | mips16-* \
+ | mips64-* | mips64el-* \
+ | mips64vr-* | mips64vrel-* \
+ | mips64orion-* | mips64orionel-* \
+ | mips64vr4100-* | mips64vr4100el-* \
+ | mips64vr4300-* | mips64vr4300el-* \
+ | mips64vr5000-* | mips64vr5000el-* \
+ | mipsisa32-* | mipsisa32el-* \
+ | mipsisa32r2-* | mipsisa32r2el-* \
+ | mipsisa64-* | mipsisa64el-* \
+ | mipsisa64r2-* | mipsisa64r2el-* \
+ | mipsisa64sb1-* | mipsisa64sb1el-* \
+ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+ | mipstx39-* | mipstx39el-* \
+ | msp430-* \
+ | none-* | np1-* | nv1-* | ns16k-* | ns32k-* \
+ | orion-* \
+ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+ | pyramid-* \
+ | romp-* | rs6000-* \
+ | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \
+ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+ | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \
+ | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
+ | tahoe-* | thumb-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+ | tron-* \
+ | v850-* | v850e-* | vax-* \
+ | we32k-* \
+ | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \
+ | xtensa-* \
+ | ymp-* \
+ | z8k-*)
+ ;;
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 386bsd)
+ basic_machine=i386-unknown
+ os=-bsd
+ ;;
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ basic_machine=m68000-att
+ ;;
+ 3b*)
+ basic_machine=we32k-att
+ ;;
+ a29khif)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ abacus)
+ basic_machine=abacus-unknown
+ ;;
+ adobe68k)
+ basic_machine=m68010-adobe
+ os=-scout
+ ;;
+ alliant | fx80)
+ basic_machine=fx80-alliant
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ os=-bsd
+ ;;
+ amd64)
+ basic_machine=x86_64-pc
+ ;;
+ amd64-*)
+ basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ os=-sysv
+ ;;
+ amiga | amiga-*)
+ basic_machine=m68k-unknown
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-unknown
+ os=-amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-unknown
+ os=-sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ os=-sysv
+ ;;
+ apollo68bsd)
+ basic_machine=m68k-apollo
+ os=-bsd
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ c90)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ os=-bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ os=-bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ os=-bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ os=-bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ os=-bsd
+ ;;
+ cray | j90)
+ basic_machine=j90-cray
+ os=-unicos
+ ;;
+ cr16c)
+ basic_machine=cr16c-unknown
+ os=-elf
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
+ cris | cris-* | etrax*)
+ basic_machine=cris-axis
+ ;;
+ crx)
+ basic_machine=crx-unknown
+ os=-elf
+ ;;
+ da30 | da30-*)
+ basic_machine=m68k-da30
+ ;;
+ decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ ;;
+ decsystem10* | dec10*)
+ basic_machine=pdp10-dec
+ os=-tops10
+ ;;
+ decsystem20* | dec20*)
+ basic_machine=pdp10-dec
+ os=-tops20
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ basic_machine=m68k-motorola
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ os=-sysv3
+ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
+ ;;
+ dpx2* | dpx2*-bull)
+ basic_machine=m68k-bull
+ os=-sysv3
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ os=-ebmon
+ ;;
+ elxsi)
+ basic_machine=elxsi-elxsi
+ os=-bsd
+ ;;
+ encore | umax | mmax)
+ basic_machine=ns32k-encore
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE)
+ basic_machine=m68k-ericsson
+ os=-ose
+ ;;
+ fx2800)
+ basic_machine=i860-alliant
+ ;;
+ genix)
+ basic_machine=ns32k-ns
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ os=-sysv
+ ;;
+ go32)
+ basic_machine=i386-pc
+ os=-go32
+ ;;
+ h3050r* | hiux*)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ os=-hms
+ ;;
+ h8300xray)
+ basic_machine=h8300-hitachi
+ os=-xray
+ ;;
+ h8500hms)
+ basic_machine=h8500-hitachi
+ os=-hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ os=-sysv3
+ ;;
+ hp300-*)
+ basic_machine=m68k-hp
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ os=-bsd
+ ;;
+ hp300hpux)
+ basic_machine=m68k-hp
+ os=-hpux
+ ;;
+ hp3k9[0-9][0-9] | hp9[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ basic_machine=m68000-hp
+ ;;
+ hp9k3[2-9][0-9])
+ basic_machine=m68k-hp
+ ;;
+ hp9k6[0-9][0-9] | hp6[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k7[0-79][0-9] | hp7[0-79][0-9])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k78[0-9] | hp78[0-9])
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][13679] | hp8[0-9][13679])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hppa-next)
+ os=-nextstep3
+ ;;
+ hppaosf)
+ basic_machine=hppa1.1-hp
+ os=-osf
+ ;;
+ hppro)
+ basic_machine=hppa1.1-hp
+ os=-proelf
+ ;;
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
+ ;;
+# I'm not sure what "Sysv32" means. Should this be sysv3.2?
+ i*86v32)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
+ ;;
+ i*86v4*)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv4
+ ;;
+ i*86v)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv
+ ;;
+ i*86sol2)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-solaris2
+ ;;
+ i386mach)
+ basic_machine=i386-mach
+ os=-mach
+ ;;
+ i386-vsta | vsta)
+ basic_machine=i386-unknown
+ os=-vsta
+ ;;
+ iris | iris4d)
+ basic_machine=mips-sgi
+ case $os in
+ -irix*)
+ ;;
+ *)
+ os=-irix4
+ ;;
+ esac
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
+ m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ mingw32)
+ basic_machine=i386-pc
+ os=-mingw32
+ ;;
+ miniframe)
+ basic_machine=m68000-convergent
+ ;;
+ *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+ mips3*-*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+ ;;
+ mips3*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+ ;;
+ mmix*)
+ basic_machine=mmix-knuth
+ os=-mmixware
+ ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ morphos)
+ basic_machine=powerpc-unknown
+ os=-morphos
+ ;;
+ msdos)
+ basic_machine=i386-pc
+ os=-msdos
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ os=-sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-unknown
+ os=-netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-rebel
+ os=-linux
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ os=-newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ os=-newsos
+ ;;
+ news-3600 | risc-news)
+ basic_machine=mips-sony
+ os=-newsos
+ ;;
+ necv70)
+ basic_machine=v70-nec
+ os=-sysv
+ ;;
+ next | m*-next )
+ basic_machine=m68k-next
+ case $os in
+ -nextstep* )
+ ;;
+ -ns2*)
+ os=-nextstep2
+ ;;
+ *)
+ os=-nextstep3
+ ;;
+ esac
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ os=-cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ os=-cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ os=-nindy
+ ;;
+ mon960)
+ basic_machine=i960-intel
+ os=-mon960
+ ;;
+ nonstopux)
+ basic_machine=mips-compaq
+ os=-nonstopux
+ ;;
+ np1)
+ basic_machine=np1-gould
+ ;;
+ nv1)
+ basic_machine=nv1-cray
+ os=-unicosmp
+ ;;
+ nsr-tandem)
+ basic_machine=nsr-tandem
+ ;;
+ op50n-* | op60c-*)
+ basic_machine=hppa1.1-oki
+ os=-proelf
+ ;;
+ or32 | or32-*)
+ basic_machine=or32-unknown
+ os=-coff
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+ os=-os400
+ ;;
+ OSE68000 | ose68000)
+ basic_machine=m68000-ericsson
+ os=-ose
+ ;;
+ os68k)
+ basic_machine=m68k-none
+ os=-os68k
+ ;;
+ pa-hitachi)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ os=-osf
+ ;;
+ pbd)
+ basic_machine=sparc-tti
+ ;;
+ pbb)
+ basic_machine=m68k-tti
+ ;;
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
+ pentium | p5 | k5 | k6 | nexgen | viac3)
+ basic_machine=i586-pc
+ ;;
+ pentiumpro | p6 | 6x86 | athlon | athlon_*)
+ basic_machine=i686-pc
+ ;;
+ pentiumii | pentium2 | pentiumiii | pentium3)
+ basic_machine=i686-pc
+ ;;
+ pentium4)
+ basic_machine=i786-pc
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumpro-* | p6-* | 6x86-* | athlon-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentium4-*)
+ basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pn)
+ basic_machine=pn-gould
+ ;;
+ power) basic_machine=power-ibm
+ ;;
+ ppc) basic_machine=powerpc-unknown
+ ;;
+ ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppcle | powerpclittle | ppc-le | powerpc-little)
+ basic_machine=powerpcle-unknown
+ ;;
+ ppcle-* | powerpclittle-*)
+ basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64) basic_machine=powerpc64-unknown
+ ;;
+ ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+ basic_machine=powerpc64le-unknown
+ ;;
+ ppc64le-* | powerpc64little-*)
+ basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ps2)
+ basic_machine=i386-ibm
+ ;;
+ pw32)
+ basic_machine=i586-unknown
+ os=-pw32
+ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ rm[46]00)
+ basic_machine=mips-siemens
+ ;;
+ rtpc | rtpc-*)
+ basic_machine=romp-ibm
+ ;;
+ s390 | s390-*)
+ basic_machine=s390-ibm
+ ;;
+ s390x | s390x-*)
+ basic_machine=s390x-ibm
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ sb1)
+ basic_machine=mipsisa64sb1-unknown
+ ;;
+ sb1el)
+ basic_machine=mipsisa64sb1el-unknown
+ ;;
+ sei)
+ basic_machine=mips-sei
+ os=-seiux
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh)
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
+ sh64)
+ basic_machine=sh64-unknown
+ ;;
+ sparclite-wrs | simso-wrs)
+ basic_machine=sparclite-wrs
+ os=-vxworks
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ os=-sysv2
+ ;;
+ spur)
+ basic_machine=spur-unknown
+ ;;
+ st2000)
+ basic_machine=m68k-tandem
+ ;;
+ stratus)
+ basic_machine=i860-stratus
+ os=-sysv4
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ os=-sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ os=-sunos4
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ os=-sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ os=-sunos4
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ os=-sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ os=-sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ os=-solaris2
+ ;;
+ sun3 | sun3-*)
+ basic_machine=m68k-sun
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ ;;
+ sv1)
+ basic_machine=sv1-cray
+ os=-unicos
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ os=-dynix
+ ;;
+ t3e)
+ basic_machine=alphaev5-cray
+ os=-unicos
+ ;;
+ t90)
+ basic_machine=t90-cray
+ os=-unicos
+ ;;
+ tic54x | c54x*)
+ basic_machine=tic54x-unknown
+ os=-coff
+ ;;
+ tic55x | c55x*)
+ basic_machine=tic55x-unknown
+ os=-coff
+ ;;
+ tic6x | c6x*)
+ basic_machine=tic6x-unknown
+ os=-coff
+ ;;
+ tx39)
+ basic_machine=mipstx39-unknown
+ ;;
+ tx39el)
+ basic_machine=mipstx39el-unknown
+ ;;
+ toad1)
+ basic_machine=pdp10-xkl
+ os=-tops20
+ ;;
+ tower | tower-32)
+ basic_machine=m68k-ncr
+ ;;
+ tpf)
+ basic_machine=s390x-ibm
+ os=-tpf
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ os=-sym1
+ ;;
+ v810 | necv810)
+ basic_machine=v810-nec
+ os=-none
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ os=-sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ os=-vms
+ ;;
+ vpp*|vx|vx-*)
+ basic_machine=f301-fujitsu
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ os=-vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ os=-vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ os=-vxworks
+ ;;
+ w65*)
+ basic_machine=w65-wdc
+ os=-none
+ ;;
+ w89k-*)
+ basic_machine=hppa1.1-winbond
+ os=-proelf
+ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ z8k-*-coff)
+ basic_machine=z8k-unknown
+ os=-sim
+ ;;
+ none)
+ basic_machine=none-none
+ os=-none
+ ;;
+
+# Here we handle the default manufacturer of certain CPU types. It is in
+# some cases the only manufacturer, in others, it is the most popular.
+ w89k)
+ basic_machine=hppa1.1-winbond
+ ;;
+ op50n)
+ basic_machine=hppa1.1-oki
+ ;;
+ op60c)
+ basic_machine=hppa1.1-oki
+ ;;
+ romp)
+ basic_machine=romp-ibm
+ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+ vax)
+ basic_machine=vax-dec
+ ;;
+ pdp10)
+ # there are many clones, so DEC is not a safe bet
+ basic_machine=pdp10-unknown
+ ;;
+ pdp11)
+ basic_machine=pdp11-dec
+ ;;
+ we32k)
+ basic_machine=we32k-att
+ ;;
+ sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele)
+ basic_machine=sh-unknown
+ ;;
+ sh64)
+ basic_machine=sh64-unknown
+ ;;
+ sparc | sparcv8 | sparcv9 | sparcv9b)
+ basic_machine=sparc-sun
+ ;;
+ cydra)
+ basic_machine=cydra-cydrome
+ ;;
+ orion)
+ basic_machine=orion-highlevel
+ ;;
+ orion105)
+ basic_machine=clipper-highlevel
+ ;;
+ mac | mpw | mac-mpw)
+ basic_machine=m68k-apple
+ ;;
+ pmac | pmac-mpw)
+ basic_machine=powerpc-apple
+ ;;
+ *-unknown)
+ # Make sure to match an already-canonicalized machine name.
+ ;;
+ *)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+ *-digital*)
+ basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+ ;;
+ *-commodore*)
+ basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+ # First match some system type aliases
+ # that might get confused with valid system types.
+ # -solaris* is a basic system type, with this one exception.
+ -solaris1 | -solaris1.*)
+ os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ ;;
+ -solaris)
+ os=-solaris2
+ ;;
+ -svr4*)
+ os=-sysv4
+ ;;
+ -unixware*)
+ os=-sysv4.2uw
+ ;;
+ -gnu/linux*)
+ os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+ ;;
+ # First accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST END IN A *, to match a version number.
+ # -sysv* is not here because it comes later, after sysvr4.
+ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ | -aos* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \
+ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ | -chorusos* | -chorusrdb* \
+ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \
+ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*)
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ -qnx*)
+ case $basic_machine in
+ x86-* | i*86-*)
+ ;;
+ *)
+ os=-nto$os
+ ;;
+ esac
+ ;;
+ -nto-qnx*)
+ ;;
+ -nto*)
+ os=`echo $os | sed -e 's|nto|nto-qnx|'`
+ ;;
+ -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+ | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
+ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+ ;;
+ -mac*)
+ os=`echo $os | sed -e 's|mac|macos|'`
+ ;;
+ -linux-dietlibc)
+ os=-linux-dietlibc
+ ;;
+ -linux*)
+ os=`echo $os | sed -e 's|linux|linux-gnu|'`
+ ;;
+ -sunos5*)
+ os=`echo $os | sed -e 's|sunos5|solaris2|'`
+ ;;
+ -sunos6*)
+ os=`echo $os | sed -e 's|sunos6|solaris3|'`
+ ;;
+ -opened*)
+ os=-openedition
+ ;;
+ -os400*)
+ os=-os400
+ ;;
+ -wince*)
+ os=-wince
+ ;;
+ -osfrose*)
+ os=-osfrose
+ ;;
+ -osf*)
+ os=-osf
+ ;;
+ -utek*)
+ os=-bsd
+ ;;
+ -dynix*)
+ os=-bsd
+ ;;
+ -acis*)
+ os=-aos
+ ;;
+ -atheos*)
+ os=-atheos
+ ;;
+ -syllable*)
+ os=-syllable
+ ;;
+ -386bsd)
+ os=-bsd
+ ;;
+ -ctix* | -uts*)
+ os=-sysv
+ ;;
+ -nova*)
+ os=-rtmk-nova
+ ;;
+ -ns2 )
+ os=-nextstep2
+ ;;
+ -nsk*)
+ os=-nsk
+ ;;
+ # Preserve the version number of sinix5.
+ -sinix5.*)
+ os=`echo $os | sed -e 's|sinix|sysv|'`
+ ;;
+ -sinix*)
+ os=-sysv4
+ ;;
+ -tpf*)
+ os=-tpf
+ ;;
+ -triton*)
+ os=-sysv3
+ ;;
+ -oss*)
+ os=-sysv3
+ ;;
+ -svr4)
+ os=-sysv4
+ ;;
+ -svr3)
+ os=-sysv3
+ ;;
+ -sysvr4)
+ os=-sysv4
+ ;;
+ # This must come after -sysvr4.
+ -sysv*)
+ ;;
+ -ose*)
+ os=-ose
+ ;;
+ -es1800*)
+ os=-ose
+ ;;
+ -xenix)
+ os=-xenix
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ os=-mint
+ ;;
+ -aros*)
+ os=-aros
+ ;;
+ -kaos*)
+ os=-kaos
+ ;;
+ -none)
+ ;;
+ *)
+ # Get rid of the `-' at the beginning of $os.
+ os=`echo $os | sed 's/[^-]*-//'`
+ echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+ *-acorn)
+ os=-riscix1.2
+ ;;
+ arm*-rebel)
+ os=-linux
+ ;;
+ arm*-semi)
+ os=-aout
+ ;;
+ c4x-* | tic4x-*)
+ os=-coff
+ ;;
+ # This must come before the *-dec entry.
+ pdp10-*)
+ os=-tops20
+ ;;
+ pdp11-*)
+ os=-none
+ ;;
+ *-dec | vax-*)
+ os=-ultrix4.2
+ ;;
+ m68*-apollo)
+ os=-domain
+ ;;
+ i386-sun)
+ os=-sunos4.0.2
+ ;;
+ m68000-sun)
+ os=-sunos3
+ # This also exists in the configure program, but was not the
+ # default.
+ # os=-sunos4
+ ;;
+ m68*-cisco)
+ os=-aout
+ ;;
+ mips*-cisco)
+ os=-elf
+ ;;
+ mips*-*)
+ os=-elf
+ ;;
+ or32-*)
+ os=-coff
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=-sysv3
+ ;;
+ sparc-* | *-sun)
+ os=-sunos4.1.1
+ ;;
+ *-be)
+ os=-beos
+ ;;
+ *-ibm)
+ os=-aix
+ ;;
+ *-wec)
+ os=-proelf
+ ;;
+ *-winbond)
+ os=-proelf
+ ;;
+ *-oki)
+ os=-proelf
+ ;;
+ *-hp)
+ os=-hpux
+ ;;
+ *-hitachi)
+ os=-hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=-sysv
+ ;;
+ *-cbm)
+ os=-amigaos
+ ;;
+ *-dg)
+ os=-dgux
+ ;;
+ *-dolphin)
+ os=-sysv3
+ ;;
+ m68k-ccur)
+ os=-rtu
+ ;;
+ m88k-omron*)
+ os=-luna
+ ;;
+ *-next )
+ os=-nextstep
+ ;;
+ *-sequent)
+ os=-ptx
+ ;;
+ *-crds)
+ os=-unos
+ ;;
+ *-ns)
+ os=-genix
+ ;;
+ i370-*)
+ os=-mvs
+ ;;
+ *-next)
+ os=-nextstep3
+ ;;
+ *-gould)
+ os=-sysv
+ ;;
+ *-highlevel)
+ os=-bsd
+ ;;
+ *-encore)
+ os=-bsd
+ ;;
+ *-sgi)
+ os=-irix
+ ;;
+ *-siemens)
+ os=-sysv4
+ ;;
+ *-masscomp)
+ os=-rtu
+ ;;
+ f30[01]-fujitsu | f700-fujitsu)
+ os=-uxpv
+ ;;
+ *-rom68k)
+ os=-coff
+ ;;
+ *-*bug)
+ os=-coff
+ ;;
+ *-apple)
+ os=-macos
+ ;;
+ *-atari*)
+ os=-mint
+ ;;
+ *)
+ os=-none
+ ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+ *-unknown)
+ case $os in
+ -riscix*)
+ vendor=acorn
+ ;;
+ -sunos*)
+ vendor=sun
+ ;;
+ -aix*)
+ vendor=ibm
+ ;;
+ -beos*)
+ vendor=be
+ ;;
+ -hpux*)
+ vendor=hp
+ ;;
+ -mpeix*)
+ vendor=hp
+ ;;
+ -hiux*)
+ vendor=hitachi
+ ;;
+ -unos*)
+ vendor=crds
+ ;;
+ -dgux*)
+ vendor=dg
+ ;;
+ -luna*)
+ vendor=omron
+ ;;
+ -genix*)
+ vendor=ns
+ ;;
+ -mvs* | -opened*)
+ vendor=ibm
+ ;;
+ -os400*)
+ vendor=ibm
+ ;;
+ -ptx*)
+ vendor=sequent
+ ;;
+ -tpf*)
+ vendor=ibm
+ ;;
+ -vxsim* | -vxworks* | -windiss*)
+ vendor=wrs
+ ;;
+ -aux*)
+ vendor=apple
+ ;;
+ -hms*)
+ vendor=hitachi
+ ;;
+ -mpw* | -macos*)
+ vendor=apple
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ vendor=atari
+ ;;
+ -vos*)
+ vendor=stratus
+ ;;
+ esac
+ basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+ ;;
+esac
+
+echo $basic_machine$os
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/configure b/configure
new file mode 100755
index 0000000..69d9ae8
--- /dev/null
+++ b/configure
@@ -0,0 +1,3910 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_help="$ac_help
+ --enable-maintainer-mode
+ enable maintainer-specific make rules (default: auto)"
+ac_help="$ac_help
+ --enable-compat install <libelf.h>, <nlist.h> and <gelf.h> (default: auto)"
+ac_help="$ac_help
+ --enable-elf64 compile in 64-bit support (default: auto)"
+ac_help="$ac_help
+ --enable-versioning compile in versioning support (default: auto)"
+ac_help="$ac_help
+ --enable-nls use Native Language Support (default: yes)"
+ac_help="$ac_help
+ --enable-shared build shared library (default: yes)"
+ac_help="$ac_help
+ --enable-gnu-names use GNU library naming conventions (default: no)"
+ac_help="$ac_help
+ --enable-extended-format support extended file formats (default: no)"
+ac_help="$ac_help
+ --enable-sanity-checks enable sanity checks by default (default: yes)"
+ac_help="$ac_help
+ --enable-debug include extra debugging code (default: no)"
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ case "$ac_option" in
+ -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) ac_optarg= ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case "$ac_option" in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir="$ac_optarg" ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build="$ac_optarg" ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file="$ac_optarg" ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir="$ac_optarg" ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ eval "enable_${ac_feature}=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix="$ac_optarg" ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he)
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+ --cache-file=FILE cache test results in FILE
+ --help print this message
+ --no-create do not create output files
+ --quiet, --silent do not print \`checking...' messages
+ --version print the version of autoconf that created configure
+Directory and file names:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [same as prefix]
+ --bindir=DIR user executables in DIR [EPREFIX/bin]
+ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
+ --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data in DIR
+ [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data in DIR
+ [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
+ --libdir=DIR object code libraries in DIR [EPREFIX/lib]
+ --includedir=DIR C header files in DIR [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
+ --infodir=DIR info documentation in DIR [PREFIX/info]
+ --mandir=DIR man documentation in DIR [PREFIX/man]
+ --srcdir=DIR find the sources in DIR [configure dir or ..]
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM
+ run sed PROGRAM on installed program names
+EOF
+ cat << EOF
+Host type:
+ --build=BUILD configure for building on BUILD [BUILD=HOST]
+ --host=HOST configure for HOST [guessed]
+ --target=TARGET configure for TARGET [TARGET=HOST]
+Features and packages:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+EOF
+ if test -n "$ac_help"; then
+ echo "--enable and --with options recognized:$ac_help"
+ fi
+ exit 0 ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host="$ac_optarg" ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir="$ac_optarg" ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir="$ac_optarg" ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir="$ac_optarg" ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir="$ac_optarg" ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir="$ac_optarg" ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir="$ac_optarg" ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir="$ac_optarg" ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix="$ac_optarg" ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix="$ac_optarg" ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix="$ac_optarg" ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name="$ac_optarg" ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir="$ac_optarg" ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir="$ac_optarg" ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site="$ac_optarg" ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir="$ac_optarg" ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir="$ac_optarg" ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target="$ac_optarg" ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers)
+ echo "configure generated by autoconf version 2.13"
+ exit 0 ;;
+
+ -with-* | --with-*)
+ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_${ac_package}='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ eval "with_${ac_package}=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes="$ac_optarg" ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries="$ac_optarg" ;;
+
+ -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+ ;;
+
+ *)
+ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+ echo "configure: warning: $ac_option: invalid host type" 1>&2
+ fi
+ if test "x$nonopt" != xNONE; then
+ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+ fi
+ nonopt="$ac_option"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+ exec 6>/dev/null
+else
+ exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+ case "$ac_arg" in
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c) ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+ ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+ esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set. These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=VERSION
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_prog=$0
+ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+ else
+ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+ fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ echo "loading site script $ac_site_file"
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+
+
+
+
+
+ PACKAGE=libelf
+ VERSION=`cat $srcdir/VERSION`
+
+
+ # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
+if test "${enable_maintainer_mode+set}" = set; then
+ enableval="$enable_maintainer_mode"
+ mr_enable_maintainer_mode="$enableval"
+else
+ case :${I_AM_THE_MAINTAINER_OF}: in
+ *:libelf:*) mr_enable_maintainer_mode=yes;;
+ *) mr_enable_maintainer_mode=no;;
+ esac
+fi
+
+ if test x"$mr_enable_maintainer_mode" = x"yes"; then
+ MAINT=
+ else
+ MAINT='maintainer-only-'
+ fi
+
+
+
+ALL_LINGUAS=`cd $srcdir/po && echo *.po | sed 's/\.po//g'`
+
+set `echo $VERSION | sed 's/\./ /g'`
+MAJOR=${1-1}
+MINOR=${2-0}
+PATCH=${3-0}
+
+
+echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
+echo "configure:582: checking whether ${MAKE-make} sets \${MAKE}" >&5
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftestmake <<\EOF
+all:
+ @echo 'ac_maketemp="${MAKE}"'
+EOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftestmake
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ SET_MAKE=
+else
+ echo "$ac_t""no" 1>&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:611: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:641: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_prog_rejected=no
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# -gt 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ set dummy "$ac_dir/$ac_word" "$@"
+ shift
+ ac_cv_prog_CC="$@"
+ fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ if test -z "$CC"; then
+ case "`uname -s`" in
+ *win32* | *WIN32*)
+ # Extract the first word of "cl", so it can be a program name with args.
+set dummy cl; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:692: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="cl"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+ ;;
+ esac
+ fi
+ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:724: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext << EOF
+
+#line 735 "configure"
+#include "confdefs.h"
+
+main(){return(0);}
+EOF
+if { (eval echo configure:740: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ ac_cv_prog_cc_works=yes
+ # If we can't run a trivial program, we are probably using a cross compiler.
+ if (./conftest; exit) 2>/dev/null; then
+ ac_cv_prog_cc_cross=no
+ else
+ ac_cv_prog_cc_cross=yes
+ fi
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_cv_prog_cc_works=no
+fi
+rm -fr conftest*
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+if test $ac_cv_prog_cc_works = no; then
+ { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:766: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:771: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.c <<EOF
+#ifdef __GNUC__
+ yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:780: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ ac_cv_prog_gcc=yes
+else
+ ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+
+ac_test_CFLAGS="${CFLAGS+set}"
+ac_save_CFLAGS="$CFLAGS"
+CFLAGS=
+echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:799: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+ ac_cv_prog_cc_g=yes
+else
+ ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+
+echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:831: checking how to run the C preprocessor" >&5
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ # This must be in double quotes, not single quotes, because CPP may get
+ # substituted into the Makefile and "${CC-cc}" will confuse make.
+ CPP="${CC-cc} -E"
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp.
+ cat > conftest.$ac_ext <<EOF
+#line 846 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:852: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -E -traditional-cpp"
+ cat > conftest.$ac_ext <<EOF
+#line 863 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:869: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -nologo -E"
+ cat > conftest.$ac_ext <<EOF
+#line 880 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:886: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP=/lib/cpp
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+ ac_cv_prog_CPP="$CPP"
+fi
+ CPP="$ac_cv_prog_CPP"
+else
+ ac_cv_prog_CPP="$CPP"
+fi
+echo "$ac_t""$CPP" 1>&6
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:941: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":"
+ for ac_dir in $PATH; do
+ # Account for people who put trailing slashes in PATH elements.
+ case "$ac_dir/" in
+ /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ if test -f $ac_dir/$ac_prog; then
+ if test $ac_prog = install &&
+ grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ else
+ ac_cv_path_install="$ac_dir/$ac_prog -c"
+ break 2
+ fi
+ fi
+ done
+ ;;
+ esac
+ done
+ IFS="$ac_save_IFS"
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL="$ac_cv_path_install"
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL="$ac_install_sh"
+ fi
+fi
+echo "$ac_t""$INSTALL" 1>&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+# Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:996: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_RANLIB="ranlib"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+ echo "$ac_t""$RANLIB" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
+echo "configure:1024: checking whether ln -s works" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ rm -f conftestdata
+if ln -s X conftestdata 2>/dev/null
+then
+ rm -f conftestdata
+ ac_cv_prog_LN_S="ln -s"
+else
+ ac_cv_prog_LN_S=ln
+fi
+fi
+LN_S="$ac_cv_prog_LN_S"
+if test "$ac_cv_prog_LN_S" = "ln -s"; then
+ echo "$ac_t""yes" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+
+echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
+echo "configure:1047: checking for ANSI C header files" >&5
+if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1052 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1060: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ ac_cv_header_stdc=yes
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 1077 "configure"
+#include "confdefs.h"
+#include <string.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "memchr" >/dev/null 2>&1; then
+ :
+else
+ rm -rf conftest*
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 1095 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "free" >/dev/null 2>&1; then
+ :
+else
+ rm -rf conftest*
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+if test "$cross_compiling" = yes; then
+ :
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1116 "configure"
+#include "confdefs.h"
+#include <ctype.h>
+#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int main () { int i; for (i = 0; i < 256; i++)
+if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
+exit (0); }
+
+EOF
+if { (eval echo configure:1127: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ :
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_header_stdc=no
+fi
+rm -fr conftest*
+fi
+
+fi
+fi
+
+echo "$ac_t""$ac_cv_header_stdc" 1>&6
+if test $ac_cv_header_stdc = yes; then
+ cat >> confdefs.h <<\EOF
+#define STDC_HEADERS 1
+EOF
+
+fi
+
+for ac_hdr in unistd.h stdint.h fcntl.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:1154: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1159 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1164: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+for ac_hdr in elf.h sys/elf.h link.h sys/link.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:1194: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1199 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1204: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+echo $ac_n "checking if ${CC} can compile elf.h""... $ac_c" 1>&6
+echo "configure:1231: checking if ${CC} can compile elf.h" >&5
+if eval "test \"`echo '$''{'libelf_cv_elf_h_works'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ cat > conftest.$ac_ext <<EOF
+#line 1237 "configure"
+#include "confdefs.h"
+#if HAVE_ELF_H
+ #include <elf.h>
+ #elif HAVE_SYS_ELF_H
+ #include <sys/elf.h>
+ #endif
+int main() {
+Elf32_Ehdr dummy
+; return 0; }
+EOF
+if { (eval echo configure:1248: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ libelf_cv_elf_h_works=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ libelf_cv_elf_h_works=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$libelf_cv_elf_h_works" 1>&6
+if test "$libelf_cv_elf_h_works" = no; then
+ ac_cv_header_elf_h=no
+ ac_cv_header_sys_elf_h=no
+fi
+if test "$ac_cv_header_elf_h" = yes; then
+ cat >> confdefs.h <<\EOF
+#define __LIBELF_HEADER_ELF_H <elf.h>
+EOF
+
+elif test "$ac_cv_header_sys_elf_h" = yes; then
+ cat >> confdefs.h <<\EOF
+#define __LIBELF_HEADER_ELF_H <sys/elf.h>
+EOF
+
+fi
+
+for ac_hdr in ar.h libelf.h nlist.h gelf.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:1282: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1287 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1292: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+echo $ac_n "checking whether to install <libelf.h>, <nlist.h> and <gelf.h>""... $ac_c" 1>&6
+echo "configure:1319: checking whether to install <libelf.h>, <nlist.h> and <gelf.h>" >&5
+# Check whether --enable-compat or --disable-compat was given.
+if test "${enable_compat+set}" = set; then
+ enableval="$enable_compat"
+ DO_COMPAT="$enableval"
+else
+ if test "$ac_cv_header_libelf_h$ac_cv_header_nlist_h$ac_cv_header_gelf_h" = yesyesyes
+ then DO_COMPAT=no
+ else DO_COMPAT=yes
+ fi
+fi
+
+echo "$ac_t""$DO_COMPAT" 1>&6
+
+
+echo $ac_n "checking for working const""... $ac_c" 1>&6
+echo "configure:1335: checking for working const" >&5
+if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1340 "configure"
+#include "confdefs.h"
+
+int main() {
+
+/* Ultrix mips cc rejects this. */
+typedef int charset[2]; const charset x;
+/* SunOS 4.1.1 cc rejects this. */
+char const *const *ccp;
+char **p;
+/* NEC SVR4.0.2 mips cc rejects this. */
+struct point {int x, y;};
+static struct point const zero = {0,0};
+/* AIX XL C 1.02.0.0 rejects this.
+ It does not let you subtract one const X* pointer from another in an arm
+ of an if-expression whose if-part is not a constant expression */
+const char *g = "string";
+ccp = &g + (g ? g-g : 0);
+/* HPUX 7.0 cc rejects these. */
+++ccp;
+p = (char**) ccp;
+ccp = (char const *const *) p;
+{ /* SCO 3.2v4 cc rejects this. */
+ char *t;
+ char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+ *t++ = 0;
+}
+{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */
+ int x[] = {25, 17};
+ const int *foo = &x[0];
+ ++foo;
+}
+{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+ typedef const int *iptr;
+ iptr p = 0;
+ ++p;
+}
+{ /* AIX XL C 1.02.0.0 rejects this saying
+ "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+ struct s { int j; const int *ap[3]; };
+ struct s *b; b->j = 5;
+}
+{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+ const int foo = 10;
+}
+
+; return 0; }
+EOF
+if { (eval echo configure:1389: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_c_const=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_c_const=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_c_const" 1>&6
+if test $ac_cv_c_const = no; then
+ cat >> confdefs.h <<\EOF
+#define const
+EOF
+
+fi
+
+echo $ac_n "checking for off_t""... $ac_c" 1>&6
+echo "configure:1410: checking for off_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1415 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "(^|[^a-zA-Z_0-9])off_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+ rm -rf conftest*
+ ac_cv_type_off_t=yes
+else
+ rm -rf conftest*
+ ac_cv_type_off_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_type_off_t" 1>&6
+if test $ac_cv_type_off_t = no; then
+ cat >> confdefs.h <<\EOF
+#define off_t long
+EOF
+
+fi
+
+echo $ac_n "checking for size_t""... $ac_c" 1>&6
+echo "configure:1443: checking for size_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1448 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+ rm -rf conftest*
+ ac_cv_type_size_t=yes
+else
+ rm -rf conftest*
+ ac_cv_type_size_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_type_size_t" 1>&6
+if test $ac_cv_type_size_t = no; then
+ cat >> confdefs.h <<\EOF
+#define size_t unsigned
+EOF
+
+fi
+
+
+echo $ac_n "checking size of short""... $ac_c" 1>&6
+echo "configure:1477: checking size of short" >&5
+if eval "test \"`echo '$''{'ac_cv_sizeof_short'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_sizeof_short=2
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1485 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+main()
+{
+ FILE *f=fopen("conftestval", "w");
+ if (!f) exit(1);
+ fprintf(f, "%d\n", sizeof(short));
+ exit(0);
+}
+EOF
+if { (eval echo configure:1496: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ ac_cv_sizeof_short=`cat conftestval`
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_sizeof_short=0
+fi
+rm -fr conftest*
+fi
+
+fi
+echo "$ac_t""$ac_cv_sizeof_short" 1>&6
+cat >> confdefs.h <<EOF
+#define SIZEOF_SHORT $ac_cv_sizeof_short
+EOF
+
+
+echo $ac_n "checking size of int""... $ac_c" 1>&6
+echo "configure:1516: checking size of int" >&5
+if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_sizeof_int=4
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1524 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+main()
+{
+ FILE *f=fopen("conftestval", "w");
+ if (!f) exit(1);
+ fprintf(f, "%d\n", sizeof(int));
+ exit(0);
+}
+EOF
+if { (eval echo configure:1535: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ ac_cv_sizeof_int=`cat conftestval`
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_sizeof_int=0
+fi
+rm -fr conftest*
+fi
+
+fi
+echo "$ac_t""$ac_cv_sizeof_int" 1>&6
+cat >> confdefs.h <<EOF
+#define SIZEOF_INT $ac_cv_sizeof_int
+EOF
+
+
+echo $ac_n "checking size of long""... $ac_c" 1>&6
+echo "configure:1555: checking size of long" >&5
+if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_sizeof_long=4
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1563 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+main()
+{
+ FILE *f=fopen("conftestval", "w");
+ if (!f) exit(1);
+ fprintf(f, "%d\n", sizeof(long));
+ exit(0);
+}
+EOF
+if { (eval echo configure:1574: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ ac_cv_sizeof_long=`cat conftestval`
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_sizeof_long=0
+fi
+rm -fr conftest*
+fi
+
+fi
+echo "$ac_t""$ac_cv_sizeof_long" 1>&6
+cat >> confdefs.h <<EOF
+#define SIZEOF_LONG $ac_cv_sizeof_long
+EOF
+
+
+echo $ac_n "checking size of long long""... $ac_c" 1>&6
+echo "configure:1594: checking size of long long" >&5
+if eval "test \"`echo '$''{'ac_cv_sizeof_long_long'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_sizeof_long_long=0
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1602 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+main()
+{
+ FILE *f=fopen("conftestval", "w");
+ if (!f) exit(1);
+ fprintf(f, "%d\n", sizeof(long long));
+ exit(0);
+}
+EOF
+if { (eval echo configure:1613: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ ac_cv_sizeof_long_long=`cat conftestval`
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_sizeof_long_long=0
+fi
+rm -fr conftest*
+fi
+
+fi
+echo "$ac_t""$ac_cv_sizeof_long_long" 1>&6
+cat >> confdefs.h <<EOF
+#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long
+EOF
+
+
+# Windows port
+echo $ac_n "checking size of __int64""... $ac_c" 1>&6
+echo "configure:1634: checking size of __int64" >&5
+if eval "test \"`echo '$''{'ac_cv_sizeof___int64'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_sizeof___int64=0
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1642 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+main()
+{
+ FILE *f=fopen("conftestval", "w");
+ if (!f) exit(1);
+ fprintf(f, "%d\n", sizeof(__int64));
+ exit(0);
+}
+EOF
+if { (eval echo configure:1653: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ ac_cv_sizeof___int64=`cat conftestval`
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_sizeof___int64=0
+fi
+rm -fr conftest*
+fi
+
+fi
+echo "$ac_t""$ac_cv_sizeof___int64" 1>&6
+cat >> confdefs.h <<EOF
+#define SIZEOF___INT64 $ac_cv_sizeof___int64
+EOF
+
+
+
+if test "$ac_cv_header_elf_h" = yes \
+|| test "$ac_cv_header_sys_elf_h" = yes; then
+
+ # Slowaris declares Elf32_Dyn in <link.h>.
+ # QNX declares Elf32_Dyn in <sys/link.h>.
+ echo $ac_n "checking for struct Elf32_Dyn""... $ac_c" 1>&6
+echo "configure:1679: checking for struct Elf32_Dyn" >&5
+if eval "test \"`echo '$''{'libelf_cv_struct_elf32_dyn'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ cat > conftest.$ac_ext <<EOF
+#line 1685 "configure"
+#include "confdefs.h"
+#include __LIBELF_HEADER_ELF_H
+int main() {
+Elf32_Dyn x
+; return 0; }
+EOF
+if { (eval echo configure:1692: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ libelf_cv_struct_elf32_dyn=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat > conftest.$ac_ext <<EOF
+#line 1700 "configure"
+#include "confdefs.h"
+#include <link.h>
+int main() {
+Elf32_Dyn x
+; return 0; }
+EOF
+if { (eval echo configure:1707: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ libelf_cv_struct_elf32_dyn=link.h
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat > conftest.$ac_ext <<EOF
+#line 1715 "configure"
+#include "confdefs.h"
+#include <sys/link.h>
+int main() {
+Elf32_Dyn x
+; return 0; }
+EOF
+if { (eval echo configure:1722: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ libelf_cv_struct_elf32_dyn=sys/link.h
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ libelf_cv_struct_elf32_dyn=no
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$libelf_cv_struct_elf32_dyn" 1>&6
+ if test "$libelf_cv_struct_elf32_dyn" = link.h; then
+ cat >> confdefs.h <<\EOF
+#define __LIBELF_NEED_LINK_H 1
+EOF
+
+ elif test "$libelf_cv_struct_elf32_dyn" = sys/link.h; then
+ cat >> confdefs.h <<\EOF
+#define __LIBELF_NEED_SYS_LINK_H 1
+EOF
+
+ elif test "$libelf_cv_struct_elf32_dyn" = no; then
+ { echo "configure: error: no declaration for Elf32_Dyn" 1>&2; exit 1; }
+ fi
+
+ # Linux declares struct nlist in <elf.h>.
+ echo $ac_n "checking for struct nlist in elf.h""... $ac_c" 1>&6
+echo "configure:1755: checking for struct nlist in elf.h" >&5
+if eval "test \"`echo '$''{'libelf_cv_struct_nlist'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ cat > conftest.$ac_ext <<EOF
+#line 1761 "configure"
+#include "confdefs.h"
+#include __LIBELF_HEADER_ELF_H
+int main() {
+struct nlist nl
+; return 0; }
+EOF
+if { (eval echo configure:1768: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ libelf_cv_struct_nlist=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ libelf_cv_struct_nlist=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$libelf_cv_struct_nlist" 1>&6
+ if test "$libelf_cv_struct_nlist" = yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_STRUCT_NLIST_DECLARATION 1
+EOF
+
+ fi
+
+ # Check for 64-bit data types.
+ echo $ac_n "checking for struct Elf64_Ehdr""... $ac_c" 1>&6
+echo "configure:1790: checking for struct Elf64_Ehdr" >&5
+if eval "test \"`echo '$''{'libelf_cv_struct_elf64_ehdr'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1795 "configure"
+#include "confdefs.h"
+#include __LIBELF_HEADER_ELF_H
+int main() {
+Elf64_Ehdr x
+; return 0; }
+EOF
+if { (eval echo configure:1802: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ libelf_cv_struct_elf64_ehdr=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ libelf_cv_struct_elf64_ehdr=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$libelf_cv_struct_elf64_ehdr" 1>&6
+
+ # Linux lacks typedefs for scalar ELF64_* types.
+ echo $ac_n "checking for Elf64_Addr""... $ac_c" 1>&6
+echo "configure:1818: checking for Elf64_Addr" >&5
+if eval "test \"`echo '$''{'libelf_cv_type_elf64_addr'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1823 "configure"
+#include "confdefs.h"
+#include __LIBELF_HEADER_ELF_H
+int main() {
+Elf64_Addr x
+; return 0; }
+EOF
+if { (eval echo configure:1830: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ libelf_cv_type_elf64_addr=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ libelf_cv_type_elf64_addr=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$libelf_cv_type_elf64_addr" 1>&6
+
+ # IRIX' struct Elf64_Rel is slightly different. Ugh.
+ echo $ac_n "checking for struct Elf64_Rel""... $ac_c" 1>&6
+echo "configure:1846: checking for struct Elf64_Rel" >&5
+if eval "test \"`echo '$''{'libelf_cv_struct_elf64_rel'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1851 "configure"
+#include "confdefs.h"
+#include __LIBELF_HEADER_ELF_H
+int main() {
+Elf64_Rel x; x.r_info = 1
+; return 0; }
+EOF
+if { (eval echo configure:1858: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ libelf_cv_struct_elf64_rel=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat > conftest.$ac_ext <<EOF
+#line 1866 "configure"
+#include "confdefs.h"
+#include __LIBELF_HEADER_ELF_H
+int main() {
+Elf64_Rel x; x.r_sym = 1
+; return 0; }
+EOF
+if { (eval echo configure:1873: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ libelf_cv_struct_elf64_rel=irix
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ libelf_cv_struct_elf64_rel=no
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$libelf_cv_struct_elf64_rel" 1>&6
+
+ case "$libelf_cv_struct_elf64_ehdr:\
+$libelf_cv_type_elf64_addr:\
+$libelf_cv_struct_elf64_rel" in
+ yes:yes:yes)
+ libelf_64bit=yes;;
+ yes:yes:irix)
+ cat >> confdefs.h <<\EOF
+#define __LIBELF64_IRIX 1
+EOF
+
+ libelf_64bit=yes;;
+ yes:no:yes)
+ cat >> confdefs.h <<\EOF
+#define __LIBELF64_LINUX 1
+EOF
+
+ libelf_64bit=yes;;
+ *)
+ libelf_64bit=no;;
+ esac
+
+ # Check for symbol versioning definitions
+ echo $ac_n "checking for Elf32_Verdef""... $ac_c" 1>&6
+echo "configure:1912: checking for Elf32_Verdef" >&5
+if eval "test \"`echo '$''{'libelf_cv_verdef32'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1917 "configure"
+#include "confdefs.h"
+#include __LIBELF_HEADER_ELF_H
+ #if __LIBELF_NEED_LINK_H
+ #include <link.h> /* Solaris wants this */
+ #endif
+int main() {
+struct {
+ Elf32_Verdef vd;
+ Elf32_Verdaux vda;
+ Elf32_Verneed vn;
+ Elf32_Vernaux vna;
+ } x
+; return 0; }
+EOF
+if { (eval echo configure:1932: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ libelf_cv_verdef32=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ libelf_cv_verdef32=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$libelf_cv_verdef32" 1>&6
+
+ echo $ac_n "checking for Elf64_Verdef""... $ac_c" 1>&6
+echo "configure:1947: checking for Elf64_Verdef" >&5
+if eval "test \"`echo '$''{'libelf_cv_verdef64'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1952 "configure"
+#include "confdefs.h"
+#include __LIBELF_HEADER_ELF_H
+ #if __LIBELF_NEED_LINK_H
+ #include <link.h> /* Solaris wants this */
+ #endif
+int main() {
+struct {
+ Elf64_Verdef vd;
+ Elf64_Verdaux vda;
+ Elf64_Verneed vn;
+ Elf64_Vernaux vna;
+ } x
+; return 0; }
+EOF
+if { (eval echo configure:1967: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ libelf_cv_verdef64=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ libelf_cv_verdef64=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$libelf_cv_verdef64" 1>&6
+
+ echo $ac_n "checking for SHT_SUNW_verdef""... $ac_c" 1>&6
+echo "configure:1982: checking for SHT_SUNW_verdef" >&5
+if eval "test \"`echo '$''{'libelf_cv_sun_verdef'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1987 "configure"
+#include "confdefs.h"
+#include __LIBELF_HEADER_ELF_H
+int main() {
+Elf32_Word x = SHT_SUNW_verdef + SHT_SUNW_verneed + SHT_SUNW_versym
+; return 0; }
+EOF
+if { (eval echo configure:1994: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ libelf_cv_sun_verdef=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ libelf_cv_sun_verdef=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$libelf_cv_sun_verdef" 1>&6
+
+ echo $ac_n "checking for SHT_GNU_verdef""... $ac_c" 1>&6
+echo "configure:2009: checking for SHT_GNU_verdef" >&5
+if eval "test \"`echo '$''{'libelf_cv_gnu_verdef'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2014 "configure"
+#include "confdefs.h"
+#include __LIBELF_HEADER_ELF_H
+int main() {
+Elf32_Word x = SHT_GNU_verdef + SHT_GNU_verneed + SHT_GNU_versym
+; return 0; }
+EOF
+if { (eval echo configure:2021: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ libelf_cv_gnu_verdef=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ libelf_cv_gnu_verdef=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$libelf_cv_gnu_verdef" 1>&6
+else
+ # lib/elf_repl.h supports 64-bit
+ libelf_64bit=yes
+
+ # lib/elf_repl.h supports symbol versioning
+ libelf_cv_verdef32=yes
+ libelf_cv_verdef64=yes
+ libelf_cv_sun_verdef=yes
+ libelf_cv_gnu_verdef=yes
+fi
+
+echo $ac_n "checking for 64-bit integer""... $ac_c" 1>&6
+echo "configure:2046: checking for 64-bit integer" >&5
+if eval "test \"`echo '$''{'libelf_cv_int64'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ if test "$ac_cv_sizeof_long" = 8; then
+ libelf_cv_int64='long'
+ elif test "$ac_cv_sizeof___int64" = 8; then
+ libelf_cv_int64='__int64'
+ elif test "$ac_cv_sizeof_long_long" = 8; then
+ libelf_cv_int64='long long'
+ else
+ libelf_cv_int64=no
+ fi
+fi
+
+echo "$ac_t""$libelf_cv_int64" 1>&6
+if test "$libelf_cv_int64" = no; then
+ libelf_64bit=no
+else
+ cat >> confdefs.h <<EOF
+#define __libelf_i64_t $libelf_cv_int64
+EOF
+
+ cat >> confdefs.h <<EOF
+#define __libelf_u64_t unsigned $libelf_cv_int64
+EOF
+
+fi
+
+echo $ac_n "checking for 32-bit integer""... $ac_c" 1>&6
+echo "configure:2077: checking for 32-bit integer" >&5
+if eval "test \"`echo '$''{'libelf_cv_int32'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ if test "$ac_cv_sizeof_int" = 4; then
+ libelf_cv_int32='int'
+ elif test "$ac_cv_sizeof_long" = 4; then
+ libelf_cv_int32='long'
+ else
+ libelf_cv_int32=no
+ fi
+fi
+
+echo "$ac_t""$libelf_cv_int32" 1>&6
+if test "$libelf_cv_int32" = no; then
+ { echo "configure: error: neither int nor long is 32-bit" 1>&2; exit 1; }
+else
+ cat >> confdefs.h <<EOF
+#define __libelf_i32_t $libelf_cv_int32
+EOF
+
+ cat >> confdefs.h <<EOF
+#define __libelf_u32_t unsigned $libelf_cv_int32
+EOF
+
+fi
+
+echo $ac_n "checking for 16-bit integer""... $ac_c" 1>&6
+echo "configure:2106: checking for 16-bit integer" >&5
+if eval "test \"`echo '$''{'libelf_cv_int16'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ if test "$ac_cv_sizeof_short" = 2; then
+ libelf_cv_int16='short'
+ elif test "$ac_cv_sizeof_int" = 2; then
+ libelf_cv_int16='int'
+ else
+ libelf_cv_int16=no
+ fi
+fi
+
+echo "$ac_t""$libelf_cv_int16" 1>&6
+if test "$libelf_cv_int16" = no; then
+ { echo "configure: error: neither short nor int is 16-bit" 1>&2; exit 1; }
+else
+ cat >> confdefs.h <<EOF
+#define __libelf_i16_t $libelf_cv_int16
+EOF
+
+ cat >> confdefs.h <<EOF
+#define __libelf_u16_t unsigned $libelf_cv_int16
+EOF
+
+fi
+
+for ac_hdr in unistd.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:2138: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2143 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:2148: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+for ac_func in getpagesize
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2177: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2182 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2205: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+echo $ac_n "checking for working mmap""... $ac_c" 1>&6
+echo "configure:2230: checking for working mmap" >&5
+if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_mmap_fixed_mapped=no
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2238 "configure"
+#include "confdefs.h"
+
+/* Thanks to Mike Haertel and Jim Avera for this test.
+ Here is a matrix of mmap possibilities:
+ mmap private not fixed
+ mmap private fixed at somewhere currently unmapped
+ mmap private fixed at somewhere already mapped
+ mmap shared not fixed
+ mmap shared fixed at somewhere currently unmapped
+ mmap shared fixed at somewhere already mapped
+ For private mappings, we should verify that changes cannot be read()
+ back from the file, nor mmap's back from the file at a different
+ address. (There have been systems where private was not correctly
+ implemented like the infamous i386 svr4.0, and systems where the
+ VM page cache was not coherent with the filesystem buffer cache
+ like early versions of FreeBSD and possibly contemporary NetBSD.)
+ For shared mappings, we should conversely verify that changes get
+ propogated back to all the places they're supposed to be.
+
+ Grep wants private fixed already mapped.
+ The main things grep needs to know about mmap are:
+ * does it exist and is it safe to write into the mmap'd area
+ * how to use it (BSD variants) */
+#include <sys/types.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+
+/* This mess was copied from the GNU getpagesize.h. */
+#ifndef HAVE_GETPAGESIZE
+# ifdef HAVE_UNISTD_H
+# include <unistd.h>
+# endif
+
+/* Assume that all systems that can run configure have sys/param.h. */
+# ifndef HAVE_SYS_PARAM_H
+# define HAVE_SYS_PARAM_H 1
+# endif
+
+# ifdef _SC_PAGESIZE
+# define getpagesize() sysconf(_SC_PAGESIZE)
+# else /* no _SC_PAGESIZE */
+# ifdef HAVE_SYS_PARAM_H
+# include <sys/param.h>
+# ifdef EXEC_PAGESIZE
+# define getpagesize() EXEC_PAGESIZE
+# else /* no EXEC_PAGESIZE */
+# ifdef NBPG
+# define getpagesize() NBPG * CLSIZE
+# ifndef CLSIZE
+# define CLSIZE 1
+# endif /* no CLSIZE */
+# else /* no NBPG */
+# ifdef NBPC
+# define getpagesize() NBPC
+# else /* no NBPC */
+# ifdef PAGESIZE
+# define getpagesize() PAGESIZE
+# endif /* PAGESIZE */
+# endif /* no NBPC */
+# endif /* no NBPG */
+# endif /* no EXEC_PAGESIZE */
+# else /* no HAVE_SYS_PARAM_H */
+# define getpagesize() 8192 /* punt totally */
+# endif /* no HAVE_SYS_PARAM_H */
+# endif /* no _SC_PAGESIZE */
+
+#endif /* no HAVE_GETPAGESIZE */
+
+#ifdef __cplusplus
+extern "C" { void *malloc(unsigned); }
+#else
+char *malloc();
+#endif
+
+int
+main()
+{
+ char *data, *data2, *data3;
+ int i, pagesize;
+ int fd;
+
+ pagesize = getpagesize();
+
+ /*
+ * First, make a file with some known garbage in it.
+ */
+ data = malloc(pagesize);
+ if (!data)
+ exit(1);
+ for (i = 0; i < pagesize; ++i)
+ *(data + i) = rand();
+ umask(0);
+ fd = creat("conftestmmap", 0600);
+ if (fd < 0)
+ exit(1);
+ if (write(fd, data, pagesize) != pagesize)
+ exit(1);
+ close(fd);
+
+ /*
+ * Next, try to mmap the file at a fixed address which
+ * already has something else allocated at it. If we can,
+ * also make sure that we see the same garbage.
+ */
+ fd = open("conftestmmap", O_RDWR);
+ if (fd < 0)
+ exit(1);
+ data2 = malloc(2 * pagesize);
+ if (!data2)
+ exit(1);
+ data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1);
+ if (data2 != mmap(data2, pagesize, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_FIXED, fd, 0L))
+ exit(1);
+ for (i = 0; i < pagesize; ++i)
+ if (*(data + i) != *(data2 + i))
+ exit(1);
+
+ /*
+ * Finally, make sure that changes to the mapped area
+ * do not percolate back to the file as seen by read().
+ * (This is a bug on some variants of i386 svr4.0.)
+ */
+ for (i = 0; i < pagesize; ++i)
+ *(data2 + i) = *(data2 + i) + 1;
+ data3 = malloc(pagesize);
+ if (!data3)
+ exit(1);
+ if (read(fd, data3, pagesize) != pagesize)
+ exit(1);
+ for (i = 0; i < pagesize; ++i)
+ if (*(data + i) != *(data3 + i))
+ exit(1);
+ close(fd);
+ unlink("conftestmmap");
+ exit(0);
+}
+
+EOF
+if { (eval echo configure:2378: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ ac_cv_func_mmap_fixed_mapped=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_func_mmap_fixed_mapped=no
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$ac_cv_func_mmap_fixed_mapped" 1>&6
+if test $ac_cv_func_mmap_fixed_mapped = yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_MMAP 1
+EOF
+
+fi
+
+for ac_func in ftruncate memcmp memcpy memmove
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2403: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2408 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2431: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+for ac_func in memset
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2458: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2463 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2486: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+LIBOBJS="$LIBOBJS ${ac_func}.${ac_objext}"
+fi
+done
+
+
+if test "$ac_cv_func_memset" = yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_MEMSET 1
+EOF
+
+fi
+
+echo $ac_n "checking whether overlapping arrays are copied correctly""... $ac_c" 1>&6
+echo "configure:2520: checking whether overlapping arrays are copied correctly" >&5
+if eval "test \"`echo '$''{'libelf_cv_working_memmove'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ libelf_cv_working_memmove='maybe not'
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2528 "configure"
+#include "confdefs.h"
+#include "confdefs.h"
+#if HAVE_MEMMOVE
+extern void *memmove();
+#else
+extern void bcopy();
+#define memmove(d,s,n) bcopy((s),(d),(n))
+#endif
+extern int strcmp();
+main() {
+ char buf[] = "0123456789";
+ memmove(buf + 1, buf, 9);
+ if (strcmp(buf, "0012345678")) exit(1);
+ exit(0);
+}
+EOF
+if { (eval echo configure:2545: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ libelf_cv_working_memmove=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ libelf_cv_working_memmove=no
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$libelf_cv_working_memmove" 1>&6
+if test "$libelf_cv_working_memmove" != yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_BROKEN_MEMMOVE 1
+EOF
+
+fi
+
+echo $ac_n "checking the coffee machine""... $ac_c" 1>&6
+echo "configure:2568: checking the coffee machine" >&5
+if eval "test \"`echo '$''{'mr_cv_coffee_machine'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ mr_cv_coffee_machine='empty - operator may not work as expected'
+fi
+
+echo "$ac_t""$mr_cv_coffee_machine" 1>&6
+
+echo $ac_n "checking whether 64-bit ELF support is sufficient""... $ac_c" 1>&6
+echo "configure:2578: checking whether 64-bit ELF support is sufficient" >&5
+echo "$ac_t""$libelf_64bit" 1>&6
+echo $ac_n "checking whether to include 64-bit support""... $ac_c" 1>&6
+echo "configure:2581: checking whether to include 64-bit support" >&5
+if test "$libelf_64bit" = no; then
+ libelf_enable_64bit=no
+else
+ # Check whether --enable-elf64 or --disable-elf64 was given.
+if test "${enable_elf64+set}" = set; then
+ enableval="$enable_elf64"
+ libelf_enable_64bit="$enableval"
+else
+ libelf_enable_64bit=yes
+fi
+
+fi
+echo "$ac_t""$libelf_enable_64bit" 1>&6
+if test "$libelf_enable_64bit" = yes; then
+ cat >> confdefs.h <<\EOF
+#define __LIBELF64 1
+EOF
+
+fi
+
+echo $ac_n "checking whether versioning support is sufficient""... $ac_c" 1>&6
+echo "configure:2603: checking whether versioning support is sufficient" >&5
+libelf_versioning=no
+case "$libelf_enable_64bit:$libelf_cv_verdef32:$libelf_cv_verdef64" in
+ no:yes:* | yes:yes:yes)
+ if test "$libelf_cv_sun_verdef" = yes; then
+ cat >> confdefs.h <<\EOF
+#define __LIBELF_SUN_SYMBOL_VERSIONS 1
+EOF
+
+ libelf_versioning=yes
+ elif test "$libelf_cv_gnu_verdef" = yes; then
+ cat >> confdefs.h <<\EOF
+#define __LIBELF_GNU_SYMBOL_VERSIONS 1
+EOF
+
+ libelf_versioning=yes
+ fi;;
+esac
+echo "$ac_t""$libelf_versioning" 1>&6
+echo $ac_n "checking whether to include versioning support""... $ac_c" 1>&6
+echo "configure:2623: checking whether to include versioning support" >&5
+if test "$libelf_versioning" = no; then
+ libelf_enable_versioning=no
+else
+ # Check whether --enable-versioning or --disable-versioning was given.
+if test "${enable_versioning+set}" = set; then
+ enableval="$enable_versioning"
+ libelf_enable_versioning="$enableval"
+else
+ libelf_enable_versioning=yes
+fi
+
+fi
+echo "$ac_t""$libelf_enable_versioning" 1>&6
+if test "$libelf_enable_versioning" = yes; then
+ cat >> confdefs.h <<\EOF
+#define __LIBELF_SYMBOL_VERSIONS 1
+EOF
+
+fi
+
+
+
+
+ # Needed for `make dist' even if NLS is disabled.
+ GMOFILES=
+ MSGFILES=
+ POFILES=
+ for mr_lang in $ALL_LINGUAS; do
+ GMOFILES="$GMOFILES $mr_lang.gmo"
+ MSGFILES="$MSGFILES $mr_lang.msg"
+ POFILES="$POFILES $mr_lang.po"
+ done
+
+
+
+
+ echo $ac_n "checking whether NLS is requested""... $ac_c" 1>&6
+echo "configure:2661: checking whether NLS is requested" >&5
+ # Check whether --enable-nls or --disable-nls was given.
+if test "${enable_nls+set}" = set; then
+ enableval="$enable_nls"
+ mr_enable_nls="$enableval"
+else
+ mr_enable_nls=yes
+fi
+
+ echo "$ac_t""$mr_enable_nls" 1>&6
+
+ CATOBJEXT=
+ INSTOBJEXT=
+ localedir=
+ if test "$mr_enable_nls" = yes; then
+ mr_PATH=`echo ":$PATH" | sed -e 's,:^:*openwin^:*,,g' -e 's,^:,,'`
+ echo $ac_n "checking for dgettext""... $ac_c" 1>&6
+echo "configure:2678: checking for dgettext" >&5
+if eval "test \"`echo '$''{'mr_cv_func_dgettext'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ cat > conftest.$ac_ext <<EOF
+#line 2684 "configure"
+#include "confdefs.h"
+#include <libintl.h>
+int main() {
+char *s = dgettext("", ""); return 0
+; return 0; }
+EOF
+if { (eval echo configure:2691: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ mr_cv_func_dgettext=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ mr_cv_func_dgettext=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$mr_cv_func_dgettext" 1>&6
+ if test "$mr_cv_func_dgettext" = yes; then
+ # Extract the first word of "msgfmt", so it can be a program name with args.
+set dummy msgfmt; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:2709: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$MSGFMT" in
+ /*)
+ ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$mr_PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_MSGFMT="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="no"
+ ;;
+esac
+fi
+MSGFMT="$ac_cv_path_MSGFMT"
+if test -n "$MSGFMT"; then
+ echo "$ac_t""$MSGFMT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ if test "$MSGFMT" != no; then
+ # Extract the first word of "gmsgfmt", so it can be a program name with args.
+set dummy gmsgfmt; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:2746: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$GMSGFMT" in
+ /*)
+ ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$mr_PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_GMSGFMT="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
+ ;;
+esac
+fi
+GMSGFMT="$ac_cv_path_GMSGFMT"
+if test -n "$GMSGFMT"; then
+ echo "$ac_t""$GMSGFMT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ # Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:2782: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$XGETTEXT" in
+ /*)
+ ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$mr_PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_XGETTEXT="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT="xgettext"
+ ;;
+esac
+fi
+XGETTEXT="$ac_cv_path_XGETTEXT"
+if test -n "$XGETTEXT"; then
+ echo "$ac_t""$XGETTEXT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ # Extract the first word of "msgmerge", so it can be a program name with args.
+set dummy msgmerge; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:2818: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_MSGMERGE'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$MSGMERGE" in
+ /*)
+ ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$mr_PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_MSGMERGE="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE="msgmerge"
+ ;;
+esac
+fi
+MSGMERGE="$ac_cv_path_MSGMERGE"
+if test -n "$MSGMERGE"; then
+ echo "$ac_t""$MSGMERGE" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ echo $ac_n "checking for GNU gettext""... $ac_c" 1>&6
+echo "configure:2852: checking for GNU gettext" >&5
+if eval "test \"`echo '$''{'mr_cv_gnu_gettext'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ cat > conftest.$ac_ext <<EOF
+#line 2858 "configure"
+#include "confdefs.h"
+
+int main() {
+extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr
+; return 0; }
+EOF
+if { (eval echo configure:2865: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ mr_cv_gnu_gettext=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ mr_cv_gnu_gettext=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$mr_cv_gnu_gettext" 1>&6
+ if test "$mr_cv_gnu_gettext" = yes; then
+ echo $ac_n "checking for losing catgets-based GNU gettext""... $ac_c" 1>&6
+echo "configure:2881: checking for losing catgets-based GNU gettext" >&5
+if eval "test \"`echo '$''{'mr_cv_catgets_based_gettext'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ cat > conftest.$ac_ext <<EOF
+#line 2887 "configure"
+#include "confdefs.h"
+
+int main() {
+extern int _msg_tbl_length; return _msg_tbl_length
+; return 0; }
+EOF
+if { (eval echo configure:2894: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ mr_cv_catgets_based_gettext=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ mr_cv_catgets_based_gettext=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$mr_cv_catgets_based_gettext" 1>&6
+ if test "$mr_cv_catgets_based_gettext" = yes; then
+ # This loses completely. Turn it off and use catgets.
+ LIBS=`echo $LIBS | sed 's,-lintl,,g'`
+ mr_cv_func_dgettext=no
+ else
+ # Is there a better test for this case?
+ echo $ac_n "checking for pure GNU gettext""... $ac_c" 1>&6
+echo "configure:2915: checking for pure GNU gettext" >&5
+if eval "test \"`echo '$''{'mr_cv_pure_gnu_gettext'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ cat > conftest.$ac_ext <<EOF
+#line 2921 "configure"
+#include "confdefs.h"
+
+int main() {
+extern int gettext(); return gettext()
+; return 0; }
+EOF
+if { (eval echo configure:2928: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ mr_cv_pure_gnu_gettext=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ mr_cv_pure_gnu_gettext=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$mr_cv_pure_gnu_gettext" 1>&6
+ if test "$mr_cv_pure_gnu_gettext" = yes; then
+ CATOBJEXT=.gmo
+ localedir='$(prefix)/share/locale'
+ else
+ CATOBJEXT=.mo
+ localedir='$(prefix)/lib/locale'
+ fi
+ INSTOBJEXT=.mo
+ fi
+ else
+ # System provided gettext
+ CATOBJEXT=.mo
+ INSTOBJEXT=.mo
+ localedir='$(prefix)/lib/locale'
+ fi
+ else
+ # Gettext but no msgfmt. Try catgets.
+ mr_cv_func_dgettext=no
+ fi
+ fi
+ if test "$mr_cv_func_dgettext" = yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_DGETTEXT 1
+EOF
+
+ else
+ echo $ac_n "checking for catgets""... $ac_c" 1>&6
+echo "configure:2969: checking for catgets" >&5
+if eval "test \"`echo '$''{'mr_cv_func_catgets'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ cat > conftest.$ac_ext <<EOF
+#line 2975 "configure"
+#include "confdefs.h"
+#include <nl_types.h>
+int main() {
+catgets(catopen("",0),0,0,"");return 0;
+; return 0; }
+EOF
+if { (eval echo configure:2982: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ mr_cv_func_catgets=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ mr_cv_func_catgets=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$mr_cv_func_catgets" 1>&6
+ if test "$mr_cv_func_catgets" = yes; then
+ # Extract the first word of "gencat", so it can be a program name with args.
+set dummy gencat; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3000: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_GENCAT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$GENCAT" in
+ /*)
+ ac_cv_path_GENCAT="$GENCAT" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_GENCAT="$GENCAT" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$mr_PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_GENCAT="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_GENCAT" && ac_cv_path_GENCAT="no"
+ ;;
+esac
+fi
+GENCAT="$ac_cv_path_GENCAT"
+if test -n "$GENCAT"; then
+ echo "$ac_t""$GENCAT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ if test "$GENCAT" != no; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_CATGETS 1
+EOF
+
+ # Extract the first word of "gmsgfmt msgfmt", so it can be a program name with args.
+set dummy gmsgfmt msgfmt; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3041: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$GMSGFMT" in
+ /*)
+ ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$mr_PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_GMSGFMT="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="msgfmt"
+ ;;
+esac
+fi
+GMSGFMT="$ac_cv_path_GMSGFMT"
+if test -n "$GMSGFMT"; then
+ echo "$ac_t""$GMSGFMT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ # Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3077: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$XGETTEXT" in
+ /*)
+ ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$mr_PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_XGETTEXT="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT="xgettext"
+ ;;
+esac
+fi
+XGETTEXT="$ac_cv_path_XGETTEXT"
+if test -n "$XGETTEXT"; then
+ echo "$ac_t""$XGETTEXT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ CATOBJEXT=.cat
+ INSTOBJEXT=.cat
+ localedir='$(prefix)/lib/locale'
+ fi
+ else
+ echo "configure: warning: no NLS support, disabled" 1>&2
+ mr_enable_nls=no
+ fi
+ fi
+ fi
+
+
+
+
+ POSUB=
+ CATALOGS=
+ if test "$mr_enable_nls" = yes; then
+ echo $ac_n "checking for catalogs to be installed""... $ac_c" 1>&6
+echo "configure:3128: checking for catalogs to be installed" >&5
+ mr_linguas=
+ for mr_lang in ${LINGUAS=$ALL_LINGUAS}; do
+ case " $ALL_LINGUAS " in
+ *" $mr_lang "*)
+ mr_linguas="$mr_linguas$mr_lang "
+ CATALOGS="$CATALOGS $mr_lang$CATOBJEXT"
+ ;;
+ esac
+ done
+ echo "$ac_t""$mr_linguas" 1>&6
+ POSUB=po
+ fi
+
+
+
+LIBINTL=
+echo $ac_n "checking for gettext in -lintl""... $ac_c" 1>&6
+echo "configure:3146: checking for gettext in -lintl" >&5
+ac_lib_var=`echo intl'_'gettext | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lintl $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 3154 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char gettext();
+
+int main() {
+gettext()
+; return 0; }
+EOF
+if { (eval echo configure:3165: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ LIBINTL=-lintl
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+
+
+# Make sure we can run config.sub.
+if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
+else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking host system type""... $ac_c" 1>&6
+echo "configure:3194: checking host system type" >&5
+
+host_alias=$host
+case "$host_alias" in
+NONE)
+ case $nonopt in
+ NONE)
+ if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :
+ else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
+ fi ;;
+ *) host_alias=$nonopt ;;
+ esac ;;
+esac
+
+host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$host" 1>&6
+
+
+
+ PICFLAGS=
+ SHLIB_SFX=
+ SHLINK_SFX=
+ SONAME_SFX=
+ LINK_SHLIB=
+ INSTALL_SHLIB=
+ DEPSHLIBS=
+ echo $ac_n "checking whether to build a shared library""... $ac_c" 1>&6
+echo "configure:3224: checking whether to build a shared library" >&5
+ # Check whether --enable-shared or --disable-shared was given.
+if test "${enable_shared+set}" = set; then
+ enableval="$enable_shared"
+ mr_enable_shared="$enableval"
+else
+ mr_enable_shared=yes
+fi
+
+ echo "$ac_t""$mr_enable_shared" 1>&6
+ if test "$mr_enable_shared" = yes; then
+ echo $ac_n "checking whether GNU naming conventions are requested""... $ac_c" 1>&6
+echo "configure:3236: checking whether GNU naming conventions are requested" >&5
+ # Check whether --enable-gnu-names or --disable-gnu-names was given.
+if test "${enable_gnu_names+set}" = set; then
+ enableval="$enable_gnu_names"
+ mr_enable_gnu_names="$enableval"
+else
+ mr_enable_gnu_names=no
+fi
+
+ echo "$ac_t""$mr_enable_gnu_names" 1>&6
+
+
+ # Extract the first word of "ld", so it can be a program name with args.
+set dummy ld; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3251: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_LD'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$LD" in
+ /*)
+ ac_cv_path_LD="$LD" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_LD="$LD" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_LD="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_LD" && ac_cv_path_LD="ld"
+ ;;
+esac
+fi
+LD="$ac_cv_path_LD"
+if test -n "$LD"; then
+ echo "$ac_t""$LD" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ case "$host" in
+ *-linux*|*-gnu*)
+ if test "$GCC" = yes; then
+
+
+ echo $ac_n "checking for native ELF system""... $ac_c" 1>&6
+echo "configure:3290: checking for native ELF system" >&5
+if eval "test \"`echo '$''{'mr_cv_target_elf'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ mr_cv_target_elf=no
+else
+ cat > conftest.$ac_ext <<EOF
+#line 3298 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main(int argc, char **argv) {
+ char buf[BUFSIZ];
+ FILE *fp;
+ int n;
+
+ if ((fp = fopen(*argv, "r")) == NULL) {
+ exit(1);
+ }
+ n = fread(buf, 1, sizeof(buf), fp);
+ if (n >= 52
+ && buf[0] == '\177'
+ && buf[1] == 'E'
+ && buf[2] == 'L'
+ && buf[3] == 'F') {
+ exit(0);
+ }
+ exit(1);
+}
+EOF
+if { (eval echo configure:3321: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ mr_cv_target_elf=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ mr_cv_target_elf=no
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$mr_cv_target_elf" 1>&6
+ if test "$mr_cv_target_elf" = yes; then
+ PICFLAGS='-fPIC -DPIC'
+ if test "$mr_enable_gnu_names" = yes
+ then SHLIB_SFX='-$(VERSION).so'
+ else SHLIB_SFX='.so.$(VERSION)'
+ fi
+ SHLINK_SFX='.so'
+ SONAME_SFX='.so.$(MAJOR)'
+ LINK_SHLIB='$(CC) -shared -Wl,-soname,$(SONAME)'
+ INSTALL_SHLIB='$(INSTALL_PROGRAM)'
+ DEPSHLIBS='-lc'
+ else
+ echo "configure: warning: shared libraries not supported for $host" 1>&2
+ mr_enable_shared=no
+ fi
+ elif ${CC} -V 2>&1 | grep 'Intel(R) C++ Compiler' >/dev/null 2>&1; then
+ echo "configure: warning: Use --disable-shared if $CC fails to build the shared library" 1>&2
+ PICFLAGS='-fPIC -DPIC'
+ if test "$mr_enable_gnu_names" = yes
+ then SHLIB_SFX='-$(VERSION).so'
+ else SHLIB_SFX='.so.$(VERSION)'
+ fi
+ SHLINK_SFX='.so'
+ SONAME_SFX='.so.$(MAJOR)'
+ LINK_SHLIB='$(CC) -shared -Wl,-soname,$(SONAME)'
+ INSTALL_SHLIB='$(INSTALL_PROGRAM)'
+ DEPSHLIBS='-lc'
+ else
+ echo "configure: warning: GNU CC required for building shared libraries" 1>&2
+ mr_enable_shared=no
+ fi
+ ;;
+ i386-pc-nto-qnx*)
+
+
+ echo $ac_n "checking for native ELF system""... $ac_c" 1>&6
+echo "configure:3372: checking for native ELF system" >&5
+if eval "test \"`echo '$''{'mr_cv_target_elf'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ mr_cv_target_elf=no
+else
+ cat > conftest.$ac_ext <<EOF
+#line 3380 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main(int argc, char **argv) {
+ char buf[BUFSIZ];
+ FILE *fp;
+ int n;
+
+ if ((fp = fopen(*argv, "r")) == NULL) {
+ exit(1);
+ }
+ n = fread(buf, 1, sizeof(buf), fp);
+ if (n >= 52
+ && buf[0] == '\177'
+ && buf[1] == 'E'
+ && buf[2] == 'L'
+ && buf[3] == 'F') {
+ exit(0);
+ }
+ exit(1);
+}
+EOF
+if { (eval echo configure:3403: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ mr_cv_target_elf=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ mr_cv_target_elf=no
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$mr_cv_target_elf" 1>&6
+ if test "$mr_cv_target_elf" = yes; then
+ PICFLAGS='-fPIC -DPIC'
+ if test "$mr_enable_gnu_names" = yes
+ then SHLIB_SFX='-$(VERSION).so'
+ else SHLIB_SFX='.so.$(VERSION)'
+ fi
+ SHLINK_SFX='.so'
+ SONAME_SFX='.so.$(MAJOR)'
+ LINK_SHLIB='$(CC) -shared -Wl,-soname,$(SONAME)'
+ INSTALL_SHLIB='$(INSTALL_PROGRAM)'
+ DEPSHLIBS='-lc'
+ else
+ echo "configure: warning: shared libraries not supported for $host" 1>&2
+ mr_enable_shared=no
+ fi
+ ;;
+ sparc-sun-solaris2*)
+ if test "$GCC" = yes; then
+ PICFLAGS='-fPIC -DPIC'
+ else
+ PICFLAGS='-K PIC -DPIC'
+ fi
+ if test "$mr_enable_gnu_names" = yes
+ then SHLIB_SFX='-$(MAJOR).so'
+ else SHLIB_SFX='.so.$(MAJOR)'
+ fi
+ SONAME_SFX='.so.$(MAJOR)'
+ SHLINK_SFX='.so'
+ LINK_SHLIB='$(LD) -G -z text -h $(SONAME)'
+ INSTALL_SHLIB='$(INSTALL_PROGRAM)'
+ ;;
+ *)
+ echo "configure: warning: shared libraries not supported for $host" 1>&2
+ mr_enable_shared=no
+ ;;
+ esac
+ else
+ mr_enable_shared=no
+ fi
+
+
+
+
+
+
+
+ DO_SHLIB="$mr_enable_shared"
+
+
+
+# Check whether --enable-extended-format or --disable-extended-format was given.
+if test "${enable_extended_format+set}" = set; then
+ enableval="$enable_extended_format"
+ mr_enable_extended_format="$enableval"
+else
+ mr_enable_extended_format=no
+fi
+
+if test "$mr_enable_extended_format" = yes; then
+ cat >> confdefs.h <<\EOF
+#define ENABLE_EXTENDED_FORMAT 1
+EOF
+
+fi
+
+# Check whether --enable-sanity-checks or --disable-sanity-checks was given.
+if test "${enable_sanity_checks+set}" = set; then
+ enableval="$enable_sanity_checks"
+ mr_enable_sanity_checks="$enableval"
+else
+ mr_enable_sanity_checks=yes
+fi
+
+if test "$mr_enable_sanity_checks" = yes; then
+ cat >> confdefs.h <<\EOF
+#define ENABLE_SANITY_CHECKS 1
+EOF
+
+fi
+
+
+
+ # Check whether --enable-debug or --disable-debug was given.
+if test "${enable_debug+set}" = set; then
+ enableval="$enable_debug"
+ mr_enable_debug="$enableval"
+else
+ mr_enable_debug=no
+fi
+
+ if test "$mr_enable_debug" = yes; then
+ cat >> confdefs.h <<\EOF
+#define ENABLE_DEBUG 1
+EOF
+
+ fi
+
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote substitution
+ # turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+DEFS=-DHAVE_CONFIG_H
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+ case "\$ac_option" in
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+ -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+ echo "$CONFIG_STATUS generated by autoconf version 2.13"
+ exit 0 ;;
+ -help | --help | --hel | --he | --h)
+ echo "\$ac_cs_usage"; exit 0 ;;
+ *) echo "\$ac_cs_usage"; exit 1 ;;
+ esac
+done
+
+ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
+
+trap 'rm -fr `echo "Makefile lib/Makefile po/Makefile libelf.pc config.h lib/sys_elf.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@PACKAGE@%$PACKAGE%g
+s%@VERSION@%$VERSION%g
+s%@MAINT@%$MAINT%g
+s%@MAJOR@%$MAJOR%g
+s%@SET_MAKE@%$SET_MAKE%g
+s%@CC@%$CC%g
+s%@CPP@%$CPP%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@RANLIB@%$RANLIB%g
+s%@LN_S@%$LN_S%g
+s%@DO_COMPAT@%$DO_COMPAT%g
+s%@LIBOBJS@%$LIBOBJS%g
+s%@GMOFILES@%$GMOFILES%g
+s%@MSGFILES@%$MSGFILES%g
+s%@POFILES@%$POFILES%g
+s%@MSGFMT@%$MSGFMT%g
+s%@GMSGFMT@%$GMSGFMT%g
+s%@XGETTEXT@%$XGETTEXT%g
+s%@MSGMERGE@%$MSGMERGE%g
+s%@GENCAT@%$GENCAT%g
+s%@CATOBJEXT@%$CATOBJEXT%g
+s%@INSTOBJEXT@%$INSTOBJEXT%g
+s%@localedir@%$localedir%g
+s%@CATALOGS@%$CATALOGS%g
+s%@POSUB@%$POSUB%g
+s%@LIBINTL@%$LIBINTL%g
+s%@host@%$host%g
+s%@host_alias@%$host_alias%g
+s%@host_cpu@%$host_cpu%g
+s%@host_vendor@%$host_vendor%g
+s%@host_os@%$host_os%g
+s%@LD@%$LD%g
+s%@PICFLAGS@%$PICFLAGS%g
+s%@SHLIB_SFX@%$SHLIB_SFX%g
+s%@SHLINK_SFX@%$SHLINK_SFX%g
+s%@SONAME_SFX@%$SONAME_SFX%g
+s%@LINK_SHLIB@%$LINK_SHLIB%g
+s%@INSTALL_SHLIB@%$INSTALL_SHLIB%g
+s%@DEPSHLIBS@%$DEPSHLIBS%g
+s%@DO_SHLIB@%$DO_SHLIB%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+ else
+ sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+ fi
+ if test ! -s conftest.s$ac_file; then
+ ac_more_lines=false
+ rm -f conftest.s$ac_file
+ else
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f conftest.s$ac_file"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+ fi
+ ac_file=`expr $ac_file + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_cmds`
+ fi
+done
+if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile lib/Makefile po/Makefile libelf.pc"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+ else
+ ac_dir_suffix= ac_dots=
+ fi
+
+ case "$ac_given_srcdir" in
+ .) srcdir=.
+ if test -z "$ac_dots"; then top_srcdir=.
+ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+ *) # Relative path.
+ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+ case "$ac_given_INSTALL" in
+ [/$]*) INSTALL="$ac_given_INSTALL" ;;
+ *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+ esac
+
+ echo creating "$ac_file"
+ rm -f "$ac_file"
+ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+ case "$ac_file" in
+ *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+ *) ac_comsub= ;;
+ esac
+
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)'
+ac_dB='\([ ][ ]*\)[^ ]*%\1#\2'
+ac_dC='\3'
+ac_dD='%g'
+# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='\([ ]\)%\1#\2define\3'
+ac_uC=' '
+ac_uD='\4%g'
+# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_eB='$%\1#\2define\3'
+ac_eC=' '
+ac_eD='%g'
+
+if test "${CONFIG_HEADERS+set}" != set; then
+EOF
+cat >> $CONFIG_STATUS <<EOF
+ CONFIG_HEADERS="config.h lib/sys_elf.h"
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+fi
+for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ echo creating $ac_file
+
+ rm -f conftest.frag conftest.in conftest.out
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ cat $ac_file_inputs > conftest.in
+
+EOF
+
+# Transform confdefs.h into a sed script conftest.vals that substitutes
+# the proper values into config.h.in to produce config.h. And first:
+# Protect against being on the right side of a sed subst in config.status.
+# Protect against being in an unquoted here document in config.status.
+rm -f conftest.vals
+cat > conftest.hdr <<\EOF
+s/[\\&%]/\\&/g
+s%[\\$`]%\\&%g
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
+s%ac_d%ac_u%gp
+s%ac_u%ac_e%gp
+EOF
+sed -n -f conftest.hdr confdefs.h > conftest.vals
+rm -f conftest.hdr
+
+# This sed command replaces #undef with comments. This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >> conftest.vals <<\EOF
+s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
+EOF
+
+# Break up conftest.vals because some shells have a limit on
+# the size of here documents, and old seds have small limits too.
+
+rm -f conftest.tail
+while :
+do
+ ac_lines=`grep -c . conftest.vals`
+ # grep -c gives empty output for an empty file on some AIX systems.
+ if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
+ # Write a limited-size here document to conftest.frag.
+ echo ' cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
+ echo 'CEOF
+ sed -f conftest.frag conftest.in > conftest.out
+ rm -f conftest.in
+ mv conftest.out conftest.in
+' >> $CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
+ rm -f conftest.vals
+ mv conftest.tail conftest.vals
+done
+rm -f conftest.vals
+
+cat >> $CONFIG_STATUS <<\EOF
+ rm -f conftest.frag conftest.h
+ echo "/* $ac_file. Generated automatically by configure. */" > conftest.h
+ cat conftest.in >> conftest.h
+ rm -f conftest.in
+ if cmp -s $ac_file conftest.h 2>/dev/null; then
+ echo "$ac_file is unchanged"
+ rm -f conftest.h
+ else
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ fi
+ rm -f $ac_file
+ mv conftest.h $ac_file
+ fi
+fi; done
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+echo timestamp > stamp-h; echo timestamp > lib/stamp-h
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
+
+# vi: set ts=8 sw=2 :
diff --git a/configure.in b/configure.in
new file mode 100644
index 0000000..ab43f47
--- /dev/null
+++ b/configure.in
@@ -0,0 +1,379 @@
+# configure.in - Configure template for libelf.
+# Process this file with autoconf to produce a configure script.
+# Copyright (C) 1995 - 2006 Michael Riepe
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+# @(#) $Id: configure.in,v 1.41 2008/05/23 08:17:56 michael Exp $
+
+AC_INIT(VERSION)
+AC_CONFIG_HEADER(config.h lib/sys_elf.h)
+
+AC_PREREQ(2.13)
+
+mr_PACKAGE(libelf)
+
+dnl NOTE: there must be at least one .po file!
+ALL_LINGUAS=`cd $srcdir/po && echo *.po | sed 's/\.po//g'`
+
+dnl Assuming all arguments have already been processed...
+set `echo $VERSION | sed 's/\./ /g'`
+MAJOR=${1-1}
+MINOR=${2-0}
+PATCH=${3-0}
+AC_SUBST(MAJOR)
+
+dnl Checks for programs.
+AC_PROG_MAKE_SET
+AC_PROG_CC
+AC_PROG_CPP
+AC_PROG_INSTALL
+AC_PROG_RANLIB
+AC_PROG_LN_S
+
+dnl Checks for libraries.
+
+dnl Checks for header files.
+AC_HEADER_STDC
+AC_CHECK_HEADERS(unistd.h stdint.h fcntl.h)
+AC_CHECK_HEADERS(elf.h sys/elf.h link.h sys/link.h)
+AC_CACHE_CHECK([if ${CC} can compile elf.h], libelf_cv_elf_h_works, [
+ AC_TRY_COMPILE(
+ [#if HAVE_ELF_H
+ #include <elf.h>
+ #elif HAVE_SYS_ELF_H
+ #include <sys/elf.h>
+ #endif],
+ [Elf32_Ehdr dummy],
+ [libelf_cv_elf_h_works=yes],
+ [libelf_cv_elf_h_works=no])
+])
+if test "$libelf_cv_elf_h_works" = no; then
+ ac_cv_header_elf_h=no
+ ac_cv_header_sys_elf_h=no
+fi
+if test "$ac_cv_header_elf_h" = yes; then
+ AC_DEFINE(__LIBELF_HEADER_ELF_H, [<elf.h>])
+elif test "$ac_cv_header_sys_elf_h" = yes; then
+ AC_DEFINE(__LIBELF_HEADER_ELF_H, [<sys/elf.h>])
+fi
+
+AC_CHECK_HEADERS(ar.h libelf.h nlist.h gelf.h)
+AC_MSG_CHECKING([whether to install <libelf.h>, <nlist.h> and <gelf.h>])
+AC_ARG_ENABLE(compat,
+ [ --enable-compat install <libelf.h>, <nlist.h> and <gelf.h> (default: auto)],
+ [DO_COMPAT="$enableval"],
+ [if test "$ac_cv_header_libelf_h$ac_cv_header_nlist_h$ac_cv_header_gelf_h" = yesyesyes
+ then DO_COMPAT=no
+ else DO_COMPAT=yes
+ fi])
+AC_MSG_RESULT($DO_COMPAT)
+AC_SUBST(DO_COMPAT)
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+AC_C_CONST
+AC_TYPE_OFF_T
+AC_TYPE_SIZE_T
+
+AC_CHECK_SIZEOF(short,2)
+AC_CHECK_SIZEOF(int,4)
+AC_CHECK_SIZEOF(long,4)
+AC_CHECK_SIZEOF(long long,0)
+# Windows port
+AC_CHECK_SIZEOF(__int64, 0)
+
+if test "$ac_cv_header_elf_h" = yes \
+|| test "$ac_cv_header_sys_elf_h" = yes; then
+
+ # Slowaris declares Elf32_Dyn in <link.h>.
+ # QNX declares Elf32_Dyn in <sys/link.h>.
+ AC_CACHE_CHECK([for struct Elf32_Dyn], libelf_cv_struct_elf32_dyn, [
+ AC_TRY_COMPILE([#include __LIBELF_HEADER_ELF_H], [Elf32_Dyn x],
+ [libelf_cv_struct_elf32_dyn=yes],
+ AC_TRY_COMPILE([#include <link.h>], [Elf32_Dyn x],
+ [libelf_cv_struct_elf32_dyn=link.h],
+ AC_TRY_COMPILE([#include <sys/link.h>], [Elf32_Dyn x],
+ [libelf_cv_struct_elf32_dyn=sys/link.h],
+ [libelf_cv_struct_elf32_dyn=no])))])
+ if test "$libelf_cv_struct_elf32_dyn" = link.h; then
+ AC_DEFINE(__LIBELF_NEED_LINK_H)
+ elif test "$libelf_cv_struct_elf32_dyn" = sys/link.h; then
+ AC_DEFINE(__LIBELF_NEED_SYS_LINK_H)
+ elif test "$libelf_cv_struct_elf32_dyn" = no; then
+ AC_MSG_ERROR([no declaration for Elf32_Dyn])
+ fi
+
+ # Linux declares struct nlist in <elf.h>.
+ AC_CACHE_CHECK([for struct nlist in elf.h], libelf_cv_struct_nlist, [
+ AC_TRY_COMPILE([#include __LIBELF_HEADER_ELF_H], [struct nlist nl],
+ [libelf_cv_struct_nlist=yes],
+ [libelf_cv_struct_nlist=no])])
+ if test "$libelf_cv_struct_nlist" = yes; then
+ AC_DEFINE(HAVE_STRUCT_NLIST_DECLARATION)
+ fi
+
+ # Check for 64-bit data types.
+ AC_CACHE_CHECK([for struct Elf64_Ehdr], libelf_cv_struct_elf64_ehdr,
+ AC_TRY_COMPILE([#include __LIBELF_HEADER_ELF_H],
+ [Elf64_Ehdr x],
+ [libelf_cv_struct_elf64_ehdr=yes],
+ [libelf_cv_struct_elf64_ehdr=no]))
+
+ # Linux lacks typedefs for scalar ELF64_* types.
+ AC_CACHE_CHECK([for Elf64_Addr], libelf_cv_type_elf64_addr,
+ AC_TRY_COMPILE([#include __LIBELF_HEADER_ELF_H],
+ [Elf64_Addr x],
+ [libelf_cv_type_elf64_addr=yes],
+ [libelf_cv_type_elf64_addr=no]))
+
+ # IRIX' struct Elf64_Rel is slightly different. Ugh.
+ AC_CACHE_CHECK([for struct Elf64_Rel], libelf_cv_struct_elf64_rel,
+ AC_TRY_COMPILE([#include __LIBELF_HEADER_ELF_H],
+ [Elf64_Rel x; x.r_info = 1],
+ [libelf_cv_struct_elf64_rel=yes],
+ AC_TRY_COMPILE([#include __LIBELF_HEADER_ELF_H],
+ [Elf64_Rel x; x.r_sym = 1],
+ [libelf_cv_struct_elf64_rel=irix],
+ [libelf_cv_struct_elf64_rel=no])))
+
+ case "$libelf_cv_struct_elf64_ehdr:\
+$libelf_cv_type_elf64_addr:\
+$libelf_cv_struct_elf64_rel" in
+ yes:yes:yes)
+ libelf_64bit=yes;;
+ yes:yes:irix)
+ AC_DEFINE(__LIBELF64_IRIX)
+ libelf_64bit=yes;;
+ yes:no:yes)
+ AC_DEFINE(__LIBELF64_LINUX)
+ libelf_64bit=yes;;
+ *)
+ libelf_64bit=no;;
+ esac
+
+ # Check for symbol versioning definitions
+ AC_CACHE_CHECK([for Elf32_Verdef], libelf_cv_verdef32,
+ AC_TRY_COMPILE(
+ [#include __LIBELF_HEADER_ELF_H
+ #if __LIBELF_NEED_LINK_H
+ #include <link.h> /* Solaris wants this */
+ #endif],
+ [struct {
+ Elf32_Verdef vd;
+ Elf32_Verdaux vda;
+ Elf32_Verneed vn;
+ Elf32_Vernaux vna;
+ } x],
+ [libelf_cv_verdef32=yes],
+ [libelf_cv_verdef32=no]))
+
+ AC_CACHE_CHECK([for Elf64_Verdef], libelf_cv_verdef64,
+ AC_TRY_COMPILE(
+ [#include __LIBELF_HEADER_ELF_H
+ #if __LIBELF_NEED_LINK_H
+ #include <link.h> /* Solaris wants this */
+ #endif],
+ [struct {
+ Elf64_Verdef vd;
+ Elf64_Verdaux vda;
+ Elf64_Verneed vn;
+ Elf64_Vernaux vna;
+ } x],
+ [libelf_cv_verdef64=yes],
+ [libelf_cv_verdef64=no]))
+
+ AC_CACHE_CHECK([for SHT_SUNW_verdef], libelf_cv_sun_verdef,
+ AC_TRY_COMPILE([#include __LIBELF_HEADER_ELF_H],
+ [Elf32_Word x = SHT_SUNW_verdef + SHT_SUNW_verneed + SHT_SUNW_versym],
+ [libelf_cv_sun_verdef=yes],
+ [libelf_cv_sun_verdef=no]))
+
+ AC_CACHE_CHECK([for SHT_GNU_verdef], libelf_cv_gnu_verdef,
+ AC_TRY_COMPILE([#include __LIBELF_HEADER_ELF_H],
+ [Elf32_Word x = SHT_GNU_verdef + SHT_GNU_verneed + SHT_GNU_versym],
+ [libelf_cv_gnu_verdef=yes],
+ [libelf_cv_gnu_verdef=no]))
+else
+ # lib/elf_repl.h supports 64-bit
+ libelf_64bit=yes
+
+ # lib/elf_repl.h supports symbol versioning
+ libelf_cv_verdef32=yes
+ libelf_cv_verdef64=yes
+ libelf_cv_sun_verdef=yes
+ libelf_cv_gnu_verdef=yes
+fi
+
+AC_CACHE_CHECK([for 64-bit integer], libelf_cv_int64, [
+ if test "$ac_cv_sizeof_long" = 8; then
+ libelf_cv_int64='long'
+ elif test "$ac_cv_sizeof___int64" = 8; then
+ libelf_cv_int64='__int64'
+ elif test "$ac_cv_sizeof_long_long" = 8; then
+ libelf_cv_int64='long long'
+ else
+ libelf_cv_int64=no
+ fi])
+if test "$libelf_cv_int64" = no; then
+ libelf_64bit=no
+else
+ AC_DEFINE_UNQUOTED(__libelf_i64_t, [$libelf_cv_int64])
+ AC_DEFINE_UNQUOTED(__libelf_u64_t, [unsigned $libelf_cv_int64])
+fi
+
+AC_CACHE_CHECK([for 32-bit integer], libelf_cv_int32, [
+ if test "$ac_cv_sizeof_int" = 4; then
+ libelf_cv_int32='int'
+ elif test "$ac_cv_sizeof_long" = 4; then
+ libelf_cv_int32='long'
+ else
+ libelf_cv_int32=no
+ fi])
+if test "$libelf_cv_int32" = no; then
+ AC_MSG_ERROR([neither int nor long is 32-bit])
+else
+ AC_DEFINE_UNQUOTED(__libelf_i32_t, [$libelf_cv_int32])
+ AC_DEFINE_UNQUOTED(__libelf_u32_t, [unsigned $libelf_cv_int32])
+fi
+
+AC_CACHE_CHECK([for 16-bit integer], libelf_cv_int16, [
+ if test "$ac_cv_sizeof_short" = 2; then
+ libelf_cv_int16='short'
+ elif test "$ac_cv_sizeof_int" = 2; then
+ libelf_cv_int16='int'
+ else
+ libelf_cv_int16=no
+ fi])
+if test "$libelf_cv_int16" = no; then
+ AC_MSG_ERROR([neither short nor int is 16-bit])
+else
+ AC_DEFINE_UNQUOTED(__libelf_i16_t, [$libelf_cv_int16])
+ AC_DEFINE_UNQUOTED(__libelf_u16_t, [unsigned $libelf_cv_int16])
+fi
+
+dnl Checks for library functions.
+AC_FUNC_MMAP
+AC_CHECK_FUNCS(ftruncate memcmp memcpy memmove)
+AC_REPLACE_FUNCS(memset)
+if test "$ac_cv_func_memset" = yes; then
+ AC_DEFINE(HAVE_MEMSET)
+fi
+
+AC_CACHE_CHECK([whether overlapping arrays are copied correctly],
+ libelf_cv_working_memmove,
+ [AC_TRY_RUN(changequote(<<, >>)dnl
+<<#include "confdefs.h"
+#if HAVE_MEMMOVE
+extern void *memmove();
+#else
+extern void bcopy();
+#define memmove(d,s,n) bcopy((s),(d),(n))
+#endif
+extern int strcmp();
+main() {
+ char buf[] = "0123456789";
+ memmove(buf + 1, buf, 9);
+ if (strcmp(buf, "0012345678")) exit(1);
+ exit(0);
+}>>, changequote([, ])dnl
+ libelf_cv_working_memmove=yes,
+ libelf_cv_working_memmove=no,
+ libelf_cv_working_memmove='maybe not')])
+if test "$libelf_cv_working_memmove" != yes; then
+ AC_DEFINE(HAVE_BROKEN_MEMMOVE)
+fi
+
+AC_CACHE_CHECK([the coffee machine], mr_cv_coffee_machine,
+ [mr_cv_coffee_machine='empty - operator may not work as expected'])
+
+dnl Check for 64-bit support.
+AC_MSG_CHECKING([whether 64-bit ELF support is sufficient])
+AC_MSG_RESULT($libelf_64bit)
+AC_MSG_CHECKING([whether to include 64-bit support])
+if test "$libelf_64bit" = no; then
+ libelf_enable_64bit=no
+else
+ AC_ARG_ENABLE(elf64,
+ [ --enable-elf64 compile in 64-bit support (default: auto)],
+ [libelf_enable_64bit="$enableval"],
+ [libelf_enable_64bit=yes])
+fi
+AC_MSG_RESULT($libelf_enable_64bit)
+if test "$libelf_enable_64bit" = yes; then
+ AC_DEFINE(__LIBELF64)
+fi
+
+AC_MSG_CHECKING([whether versioning support is sufficient])
+libelf_versioning=no
+case "$libelf_enable_64bit:$libelf_cv_verdef32:$libelf_cv_verdef64" in
+ no:yes:* | yes:yes:yes)
+ if test "$libelf_cv_sun_verdef" = yes; then
+ AC_DEFINE(__LIBELF_SUN_SYMBOL_VERSIONS)
+ libelf_versioning=yes
+ elif test "$libelf_cv_gnu_verdef" = yes; then
+ AC_DEFINE(__LIBELF_GNU_SYMBOL_VERSIONS)
+ libelf_versioning=yes
+ fi;;
+esac
+AC_MSG_RESULT($libelf_versioning)
+AC_MSG_CHECKING([whether to include versioning support])
+if test "$libelf_versioning" = no; then
+ libelf_enable_versioning=no
+else
+ AC_ARG_ENABLE(versioning,
+ [ --enable-versioning compile in versioning support (default: auto)],
+ [libelf_enable_versioning="$enableval"],
+ [libelf_enable_versioning=yes])
+fi
+AC_MSG_RESULT($libelf_enable_versioning)
+if test "$libelf_enable_versioning" = yes; then
+ AC_DEFINE(__LIBELF_SYMBOL_VERSIONS)
+fi
+
+dnl Check for NLS support.
+mr_ENABLE_NLS
+dnl this is for gmo2msg...
+LIBINTL=
+AC_CHECK_LIB(intl, gettext, [LIBINTL=-lintl])
+AC_SUBST(LIBINTL)
+
+dnl Check for shared library support.
+mr_ENABLE_SHARED
+
+dnl Check for extended ELF format support
+AC_ARG_ENABLE(extended-format,
+ [ --enable-extended-format support extended file formats (default: no)],
+ [mr_enable_extended_format="$enableval"],
+ [mr_enable_extended_format=no])
+if test "$mr_enable_extended_format" = yes; then
+ AC_DEFINE(ENABLE_EXTENDED_FORMAT)
+fi
+
+dnl Check if ELF sanity checks should be enabled
+AC_ARG_ENABLE(sanity-checks,
+ [ --enable-sanity-checks enable sanity checks by default (default: yes)],
+ [mr_enable_sanity_checks="$enableval"],
+ [mr_enable_sanity_checks=yes])
+if test "$mr_enable_sanity_checks" = yes; then
+ AC_DEFINE(ENABLE_SANITY_CHECKS)
+fi
+
+dnl Check for debug support.
+mr_ENABLE_DEBUG
+
+AC_OUTPUT([Makefile lib/Makefile po/Makefile libelf.pc],
+ [echo timestamp > stamp-h; echo timestamp > lib/stamp-h])
+
+# vi: set ts=8 sw=2 :
diff --git a/install-sh b/install-sh
new file mode 100755
index 0000000..0ff4b6a
--- /dev/null
+++ b/install-sh
@@ -0,0 +1,119 @@
+#!/bin/sh
+
+#
+# install - install a program, script, or datafile
+# This comes from X11R5; it is not part of GNU.
+#
+# $XConsortium: install.sh,v 1.2 89/12/18 14:47:22 jim Exp $
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+#
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+
+instcmd="$mvprog"
+chmodcmd=""
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+
+while [ x"$1" != x ]; do
+ case $1 in
+ -c) instcmd="$cpprog"
+ shift
+ continue;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd="$stripprog"
+ shift
+ continue;;
+
+ *) if [ x"$src" = x ]
+ then
+ src=$1
+ else
+ dst=$1
+ fi
+ shift
+ continue;;
+ esac
+done
+
+if [ x"$src" = x ]
+then
+ echo "install: no input file specified"
+ exit 1
+fi
+
+if [ x"$dst" = x ]
+then
+ echo "install: no destination specified"
+ exit 1
+fi
+
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+if [ -d $dst ]
+then
+ dst="$dst"/`basename $src`
+fi
+
+# Make a temp file name in the proper directory.
+
+dstdir=`dirname $dst`
+dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+$doit $instcmd $src $dsttmp
+
+# and set any options; do chmod last to preserve setuid bits
+
+if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; fi
+if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; fi
+if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; fi
+if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; fi
+
+# Now rename the file to the real destination.
+
+$doit $rmcmd $dst
+$doit $mvcmd $dsttmp $dst
+
+
+exit 0
diff --git a/lib/32.fsize.c b/lib/32.fsize.c
new file mode 100644
index 0000000..1815fa1
--- /dev/null
+++ b/lib/32.fsize.c
@@ -0,0 +1,155 @@
+/*
+32.fsize.c - implementation of the elf{32,64}_fsize(3) functions.
+Copyright (C) 1995 - 2001 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+#include <ext_types.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: 32.fsize.c,v 1.13 2008/05/23 08:15:33 michael Exp $";
+#endif /* lint */
+
+const size_t
+_elf_fmsize[2][EV_CURRENT - EV_NONE][ELF_T_NUM][2] = {
+ /* ELFCLASS32 */
+ {
+ /* version 1 */
+ {
+ { sizeof(unsigned char), sizeof(unsigned char) },
+ { sizeof(Elf32_Addr), sizeof(__ext_Elf32_Addr) },
+ { sizeof(Elf32_Dyn), sizeof(__ext_Elf32_Dyn) },
+ { sizeof(Elf32_Ehdr), sizeof(__ext_Elf32_Ehdr) },
+ { sizeof(Elf32_Half), sizeof(__ext_Elf32_Half) },
+ { sizeof(Elf32_Off), sizeof(__ext_Elf32_Off) },
+ { sizeof(Elf32_Phdr), sizeof(__ext_Elf32_Phdr) },
+ { sizeof(Elf32_Rela), sizeof(__ext_Elf32_Rela) },
+ { sizeof(Elf32_Rel), sizeof(__ext_Elf32_Rel) },
+ { sizeof(Elf32_Shdr), sizeof(__ext_Elf32_Shdr) },
+ { sizeof(Elf32_Sword), sizeof(__ext_Elf32_Sword) },
+ { sizeof(Elf32_Sym), sizeof(__ext_Elf32_Sym) },
+ { sizeof(Elf32_Word), sizeof(__ext_Elf32_Word) },
+ { 0, 0 }, /* there is no Elf32_Sxword */
+ { 0, 0 }, /* there is no Elf32_Xword */
+ /* XXX: check Solaris values */
+ { 0, 0 }, /* Elf32_Verdef/Verdaux size varies */
+ { 0, 0 }, /* Elf32_Verneed/Vernaux size varies */
+ },
+ },
+#if __LIBELF64
+ /* ELFCLASS64 */
+ {
+ /* version 1 */
+ {
+ { sizeof(unsigned char), sizeof(unsigned char) },
+ { sizeof(Elf64_Addr), sizeof(__ext_Elf64_Addr) },
+ { sizeof(Elf64_Dyn), sizeof(__ext_Elf64_Dyn) },
+ { sizeof(Elf64_Ehdr), sizeof(__ext_Elf64_Ehdr) },
+ { sizeof(Elf64_Half), sizeof(__ext_Elf64_Half) },
+ { sizeof(Elf64_Off), sizeof(__ext_Elf64_Off) },
+ { sizeof(Elf64_Phdr), sizeof(__ext_Elf64_Phdr) },
+ { sizeof(Elf64_Rela), sizeof(__ext_Elf64_Rela) },
+ { sizeof(Elf64_Rel), sizeof(__ext_Elf64_Rel) },
+ { sizeof(Elf64_Shdr), sizeof(__ext_Elf64_Shdr) },
+ { sizeof(Elf64_Sword), sizeof(__ext_Elf64_Sword) },
+ { sizeof(Elf64_Sym), sizeof(__ext_Elf64_Sym) },
+ { sizeof(Elf64_Word), sizeof(__ext_Elf64_Word) },
+ { sizeof(Elf64_Sxword), sizeof(__ext_Elf64_Sxword) },
+ { sizeof(Elf64_Xword), sizeof(__ext_Elf64_Xword) },
+ /* XXX: check Solaris values */
+ { 0, 0 }, /* Elf64_Verdef/Verdaux size varies */
+ { 0, 0 }, /* Elf64_Verneed/Vernaux size varies */
+ },
+ },
+#endif /* __LIBELF64 */
+};
+
+static size_t
+_elf_fsize(unsigned cls, Elf_Type type, unsigned ver) {
+ size_t n = 0;
+
+ if (!valid_version(ver)) {
+ seterr(ERROR_UNKNOWN_VERSION);
+ }
+ else if (!valid_type(type)) {
+ seterr(ERROR_UNKNOWN_TYPE);
+ }
+ else if (!(n = _fsize(cls, ver, type))) {
+ seterr(ERROR_UNKNOWN_TYPE);
+ }
+ return n;
+}
+
+size_t
+elf32_fsize(Elf_Type type, size_t count, unsigned ver) {
+ return count * _elf_fsize(ELFCLASS32, type, ver);
+}
+
+#if __LIBELF64
+
+size_t
+elf64_fsize(Elf_Type type, size_t count, unsigned ver) {
+ return count * _elf_fsize(ELFCLASS64, type, ver);
+}
+
+size_t
+gelf_fsize(Elf *elf, Elf_Type type, size_t count, unsigned ver) {
+ if (elf) {
+ if (elf->e_kind != ELF_K_ELF) {
+ seterr(ERROR_NOTELF);
+ }
+ else if (valid_class(elf->e_class)) {
+ return count * _elf_fsize(elf->e_class, type, ver);
+ }
+ else {
+ seterr(ERROR_UNKNOWN_CLASS);
+ }
+ }
+ return 0;
+}
+
+/*
+ * Extension: report memory size
+ */
+size_t
+gelf_msize(Elf *elf, Elf_Type type, size_t count, unsigned ver) {
+ size_t n;
+
+ if (elf) {
+ if (elf->e_kind != ELF_K_ELF) {
+ seterr(ERROR_NOTELF);
+ }
+ else if (!valid_class(elf->e_class)) {
+ seterr(ERROR_UNKNOWN_CLASS);
+ }
+ else if (!valid_version(ver)) {
+ seterr(ERROR_UNKNOWN_VERSION);
+ }
+ else if (!valid_type(type)) {
+ seterr(ERROR_UNKNOWN_TYPE);
+ }
+ else if (!(n = _msize(elf->e_class, ver, type))) {
+ seterr(ERROR_UNKNOWN_TYPE);
+ }
+ else {
+ return count * n;
+ }
+ }
+ return 0;
+}
+
+#endif /* __LIBELF64 */
diff --git a/lib/32.getehdr.c b/lib/32.getehdr.c
new file mode 100644
index 0000000..5690dd0
--- /dev/null
+++ b/lib/32.getehdr.c
@@ -0,0 +1,56 @@
+/*
+32.getehdr.c - implementation of the elf{32,64}_getehdr(3) functions.
+Copyright (C) 1995 - 1998 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: 32.getehdr.c,v 1.9 2008/05/23 08:15:34 michael Exp $";
+#endif /* lint */
+
+char*
+_elf_getehdr(Elf *elf, unsigned cls) {
+ if (!elf) {
+ return NULL;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ if (elf->e_kind != ELF_K_ELF) {
+ seterr(ERROR_NOTELF);
+ }
+ else if (elf->e_class != cls) {
+ seterr(ERROR_CLASSMISMATCH);
+ }
+ else if (elf->e_ehdr || _elf_cook(elf)) {
+ return elf->e_ehdr;
+ }
+ return NULL;
+}
+
+Elf32_Ehdr*
+elf32_getehdr(Elf *elf) {
+ return (Elf32_Ehdr*)_elf_getehdr(elf, ELFCLASS32);
+}
+
+#if __LIBELF64
+
+Elf64_Ehdr*
+elf64_getehdr(Elf *elf) {
+ return (Elf64_Ehdr*)_elf_getehdr(elf, ELFCLASS64);
+}
+
+#endif /* __LIBELF64 */
diff --git a/lib/32.getphdr.c b/lib/32.getphdr.c
new file mode 100644
index 0000000..c34b8c7
--- /dev/null
+++ b/lib/32.getphdr.c
@@ -0,0 +1,56 @@
+/*
+32.getphdr.c - implementation of the elf{32,64}_getphdr(3) functions.
+Copyright (C) 1995 - 2000 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: 32.getphdr.c,v 1.11 2008/05/23 08:15:34 michael Exp $";
+#endif /* lint */
+
+char*
+_elf_getphdr(Elf *elf, unsigned cls) {
+ if (!elf) {
+ return NULL;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ if (elf->e_kind != ELF_K_ELF) {
+ seterr(ERROR_NOTELF);
+ }
+ else if (elf->e_class != cls) {
+ seterr(ERROR_CLASSMISMATCH);
+ }
+ else if (elf->e_ehdr || _elf_cook(elf)) {
+ return elf->e_phdr;
+ }
+ return NULL;
+}
+
+Elf32_Phdr*
+elf32_getphdr(Elf *elf) {
+ return (Elf32_Phdr*)_elf_getphdr(elf, ELFCLASS32);
+}
+
+#if __LIBELF64
+
+Elf64_Phdr*
+elf64_getphdr(Elf *elf) {
+ return (Elf64_Phdr*)_elf_getphdr(elf, ELFCLASS64);
+}
+
+#endif /* __LIBELF64 */
diff --git a/lib/32.getshdr.c b/lib/32.getshdr.c
new file mode 100644
index 0000000..498cc5a
--- /dev/null
+++ b/lib/32.getshdr.c
@@ -0,0 +1,58 @@
+/*
+32.getshdr.c - implementation of the elf{32,64}_getshdr(3) functions.
+Copyright (C) 1995 - 1998 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: 32.getshdr.c,v 1.10 2008/05/23 08:15:34 michael Exp $";
+#endif /* lint */
+
+Elf32_Shdr*
+elf32_getshdr(Elf_Scn *scn) {
+ if (!scn) {
+ return NULL;
+ }
+ elf_assert(scn->s_magic == SCN_MAGIC);
+ elf_assert(scn->s_elf);
+ elf_assert(scn->s_elf->e_magic == ELF_MAGIC);
+ if (scn->s_elf->e_class == ELFCLASS32) {
+ return &scn->s_shdr32;
+ }
+ seterr(ERROR_CLASSMISMATCH);
+ return NULL;
+}
+
+#if __LIBELF64
+
+Elf64_Shdr*
+elf64_getshdr(Elf_Scn *scn) {
+ if (!scn) {
+ return NULL;
+ }
+ elf_assert(scn->s_magic == SCN_MAGIC);
+ elf_assert(scn->s_elf);
+ elf_assert(scn->s_elf->e_magic == ELF_MAGIC);
+ if (scn->s_elf->e_class == ELFCLASS64) {
+ return &scn->s_shdr64;
+ }
+ seterr(ERROR_CLASSMISMATCH);
+ return NULL;
+}
+
+#endif /* __LIBELF64 */
diff --git a/lib/32.newehdr.c b/lib/32.newehdr.c
new file mode 100644
index 0000000..fd59fb7
--- /dev/null
+++ b/lib/32.newehdr.c
@@ -0,0 +1,80 @@
+/*
+ * 32.newehdr.c - implementation of the elf{32,64}_newehdr(3) functions.
+ * Copyright (C) 1995 - 2006 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: 32.newehdr.c,v 1.16 2008/05/23 08:15:34 michael Exp $";
+#endif /* lint */
+
+static char*
+_elf_newehdr(Elf *elf, unsigned cls) {
+ size_t size;
+
+ if (!elf) {
+ return NULL;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ if (elf->e_readable) {
+ return _elf_getehdr(elf, cls);
+ }
+ else if (!elf->e_ehdr) {
+ size = _msize(cls, _elf_version, ELF_T_EHDR);
+ elf_assert(size);
+ if ((elf->e_ehdr = (char*)malloc(size))) {
+ memset(elf->e_ehdr, 0, size);
+ elf->e_ehdr_flags |= ELF_F_DIRTY;
+ elf->e_kind = ELF_K_ELF;
+ elf->e_class = cls;
+ return elf->e_ehdr;
+ }
+ seterr(ERROR_MEM_EHDR);
+ }
+ else if (elf->e_class != cls) {
+ seterr(ERROR_CLASSMISMATCH);
+ }
+ else {
+ elf_assert(elf->e_kind == ELF_K_ELF);
+ return elf->e_ehdr;
+ }
+ return NULL;
+}
+
+Elf32_Ehdr*
+elf32_newehdr(Elf *elf) {
+ return (Elf32_Ehdr*)_elf_newehdr(elf, ELFCLASS32);
+}
+
+#if __LIBELF64
+
+Elf64_Ehdr*
+elf64_newehdr(Elf *elf) {
+ return (Elf64_Ehdr*)_elf_newehdr(elf, ELFCLASS64);
+}
+
+unsigned long
+gelf_newehdr(Elf *elf, int cls) {
+ if (!valid_class(cls) || !_msize(cls, _elf_version, ELF_T_EHDR)) {
+ seterr(ERROR_UNKNOWN_CLASS);
+ return 0;
+ }
+ return (unsigned long)_elf_newehdr(elf, cls);
+}
+
+#endif /* __LIBELF64 */
diff --git a/lib/32.newphdr.c b/lib/32.newphdr.c
new file mode 100644
index 0000000..91c63df
--- /dev/null
+++ b/lib/32.newphdr.c
@@ -0,0 +1,118 @@
+/*
+ * 32.newphdr.c - implementation of the elf{32,64}_newphdr(3) functions.
+ * Copyright (C) 1995 - 2006 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: 32.newphdr.c,v 1.16 2008/05/23 08:15:34 michael Exp $";
+#endif /* lint */
+
+static char*
+_elf_newphdr(Elf *elf, size_t count, unsigned cls) {
+ size_t extcount = 0;
+ Elf_Scn *scn = NULL;
+ char *phdr = NULL;
+ size_t size;
+
+ if (!elf) {
+ return NULL;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ if (!elf->e_ehdr && !elf->e_readable) {
+ seterr(ERROR_NOEHDR);
+ }
+ else if (elf->e_kind != ELF_K_ELF) {
+ seterr(ERROR_NOTELF);
+ }
+ else if (elf->e_class != cls) {
+ seterr(ERROR_CLASSMISMATCH);
+ }
+ else if (elf->e_ehdr || _elf_cook(elf)) {
+ size = _msize(cls, _elf_version, ELF_T_PHDR);
+ elf_assert(size);
+ if (!(scn = _elf_first_scn(elf))) {
+ return NULL;
+ }
+ if (count) {
+ if (!(phdr = (char*)malloc(count * size))) {
+ seterr(ERROR_MEM_PHDR);
+ return NULL;
+ }
+ memset(phdr, 0, count * size);
+ }
+ elf_assert(elf->e_ehdr);
+ elf->e_phnum = count;
+ if (count >= PN_XNUM) {
+ /*
+ * get NULL section (create it if necessary)
+ */
+ extcount = count;
+ count = PN_XNUM;
+ }
+ if (cls == ELFCLASS32) {
+ ((Elf32_Ehdr*)elf->e_ehdr)->e_phnum = count;
+ scn->s_shdr32.sh_info = extcount;
+ }
+#if __LIBELF64
+ else if (cls == ELFCLASS64) {
+ ((Elf64_Ehdr*)elf->e_ehdr)->e_phnum = count;
+ scn->s_shdr64.sh_info = extcount;
+ }
+#endif /* __LIBELF64 */
+ else {
+ seterr(ERROR_UNIMPLEMENTED);
+ if (phdr) {
+ free(phdr);
+ }
+ return NULL;
+ }
+ if (elf->e_phdr) {
+ free(elf->e_phdr);
+ }
+ elf->e_phdr = phdr;
+ elf->e_phdr_flags |= ELF_F_DIRTY;
+ elf->e_ehdr_flags |= ELF_F_DIRTY;
+ scn->s_scn_flags |= ELF_F_DIRTY;
+ return phdr;
+ }
+ return NULL;
+}
+
+Elf32_Phdr*
+elf32_newphdr(Elf *elf, size_t count) {
+ return (Elf32_Phdr*)_elf_newphdr(elf, count, ELFCLASS32);
+}
+
+#if __LIBELF64
+
+Elf64_Phdr*
+elf64_newphdr(Elf *elf, size_t count) {
+ return (Elf64_Phdr*)_elf_newphdr(elf, count, ELFCLASS64);
+}
+
+unsigned long
+gelf_newphdr(Elf *elf, size_t phnum) {
+ if (!valid_class(elf->e_class)) {
+ seterr(ERROR_UNKNOWN_CLASS);
+ return 0;
+ }
+ return (unsigned long)_elf_newphdr(elf, phnum, elf->e_class);
+}
+
+#endif /* __LIBELF64 */
diff --git a/lib/32.xlatetof.c b/lib/32.xlatetof.c
new file mode 100644
index 0000000..068bac5
--- /dev/null
+++ b/lib/32.xlatetof.c
@@ -0,0 +1,438 @@
+/*
+ * 32.xlatetof.c - implementation of the elf32_xlateto[fm](3) functions.
+ * Copyright (C) 1995 - 2006 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <private.h>
+#include <ext_types.h>
+#include <byteswap.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: 32.xlatetof.c,v 1.27 2008/05/23 08:15:34 michael Exp $";
+#endif /* lint */
+
+/*
+ * Ugly, ugly
+ */
+#ifdef _WIN32
+# define Cat2(a,b)a##b
+# define Cat3(a,b,c)a##b##c
+# define Ex1(m1,m2,a,b)m1##m2(a##b)
+# define Ex2(m1,m2,a,b,c)m1##m2(a,b##c)
+#else /* _WIN32 */
+# define x
+# if defined/**/x
+# define Cat2(a,b)a##b
+# define Cat3(a,b,c)a##b##c
+# define Ex1(m1,m2,a,b)m1##m2(a##b)
+# define Ex2(m1,m2,a,b,c)m1##m2(a,b##c)
+# else
+# define Cat2(a,b)a/**/b
+# define Cat3(a,b,c)a/**/b/**/c
+# define Ex1(m1,m2,a,b)m1/**/m2(a/**/b)
+# define Ex2(m1,m2,a,b,c)m1/**/m2(a,b/**/c)
+# endif
+# undef x
+#endif /* _WIN32 */
+
+/*
+ * auxiliary macros for execution order reversal
+ */
+#define seq_forw(a,b) a b
+#define seq_back(a,b) b a
+
+/*
+ * function instantiator
+ */
+#define copy_type_e_io(name,e,io,tfrom,tto,copy) \
+ static size_t \
+ Cat3(name,_,io)(unsigned char *dst, const unsigned char *src, size_t n) { \
+ n /= sizeof(tfrom); \
+ if (n && dst) { \
+ const tfrom *from = (const tfrom*)src; \
+ tto *to = (tto*)dst; \
+ size_t i; \
+ \
+ if (sizeof(tfrom) < sizeof(tto)) { \
+ from += n; \
+ to += n; \
+ for (i = 0; i < n; i++) { \
+ --from; \
+ --to; \
+ copy(e,io,seq_back) \
+ } \
+ } \
+ else { \
+ for (i = 0; i < n; i++) { \
+ copy(e,io,seq_forw) \
+ from++; \
+ to++; \
+ } \
+ } \
+ } \
+ return n * sizeof(tto); \
+ }
+
+#define copy_type_e(name,e,type,copy) \
+ copy_type_e_io(name,e,tom,Cat2(__ext_,type),type,copy) \
+ copy_type_e_io(name,e,tof,type,Cat2(__ext_,type),copy)
+
+/*
+ * master function instantiator
+ */
+#define copy_type(name,version,type,copy) \
+ copy_type_e(Cat3(name,L,version),L,type,copy) \
+ copy_type_e(Cat3(name,M,version),M,type,copy)
+
+/*
+ * scalar copying
+ */
+#define copy_scalar_tom(type) *to = Cat2(__load_,type)(*from);
+#define copy_scalar_tof(type) Cat2(__store_,type)(*to, *from);
+
+/*
+ * structure member copying
+ */
+#define copy_tom(mb,type) to->mb = Cat2(__load_,type)(from->mb);
+#define copy_tof(mb,type) Cat2(__store_,type)(to->mb, from->mb);
+
+/*
+ * structure member copying (direction independent)
+ */
+#define copy_byte(e,io,mb) to->mb = from->mb;
+#define copy_addr(e,io,mb) Ex2(copy_,io,mb,u32,e)
+#define copy_half(e,io,mb) Ex2(copy_,io,mb,u16,e)
+#define copy_off(e,io,mb) Ex2(copy_,io,mb,u32,e)
+#define copy_sword(e,io,mb) Ex2(copy_,io,mb,i32,e)
+#define copy_word(e,io,mb) Ex2(copy_,io,mb,u32,e)
+#define copy_arr(e,io,mb) \
+ array_copy(to->mb, sizeof(to->mb), from->mb, sizeof(from->mb));
+
+/*
+ * scalar copying (direction independent)
+ * these macros are used as `copy' arguments to copy_type()
+ */
+#define copy_addr_11(e,io,seq) Ex1(copy_scalar_,io,u32,e)
+#define copy_half_11(e,io,seq) Ex1(copy_scalar_,io,u16,e)
+#define copy_off_11(e,io,seq) Ex1(copy_scalar_,io,u32,e)
+#define copy_sword_11(e,io,seq) Ex1(copy_scalar_,io,i32,e)
+#define copy_word_11(e,io,seq) Ex1(copy_scalar_,io,u32,e)
+
+/*
+ * structure copying (direction independent)
+ * these macros are used as `copy' arguments to copy_type()
+ */
+#define copy_dyn_11(e,io,seq) \
+ seq(copy_sword(e,io,d_tag), \
+ seq(copy_addr(e,io,d_un.d_ptr), \
+ nullcopy))
+#define copy_ehdr_11(e,io,seq) \
+ seq(copy_arr(e,io,e_ident), \
+ seq(copy_half(e,io,e_type), \
+ seq(copy_half(e,io,e_machine), \
+ seq(copy_word(e,io,e_version), \
+ seq(copy_addr(e,io,e_entry), \
+ seq(copy_off(e,io,e_phoff), \
+ seq(copy_off(e,io,e_shoff), \
+ seq(copy_word(e,io,e_flags), \
+ seq(copy_half(e,io,e_ehsize), \
+ seq(copy_half(e,io,e_phentsize), \
+ seq(copy_half(e,io,e_phnum), \
+ seq(copy_half(e,io,e_shentsize), \
+ seq(copy_half(e,io,e_shnum), \
+ seq(copy_half(e,io,e_shstrndx), \
+ nullcopy))))))))))))))
+#define copy_phdr_11(e,io,seq) \
+ seq(copy_word(e,io,p_type), \
+ seq(copy_off(e,io,p_offset), \
+ seq(copy_addr(e,io,p_vaddr), \
+ seq(copy_addr(e,io,p_paddr), \
+ seq(copy_word(e,io,p_filesz), \
+ seq(copy_word(e,io,p_memsz), \
+ seq(copy_word(e,io,p_flags), \
+ seq(copy_word(e,io,p_align), \
+ nullcopy))))))))
+#define copy_rela_11(e,io,seq) \
+ seq(copy_addr(e,io,r_offset), \
+ seq(copy_word(e,io,r_info), \
+ seq(copy_sword(e,io,r_addend), \
+ nullcopy)))
+#define copy_rel_11(e,io,seq) \
+ seq(copy_addr(e,io,r_offset), \
+ seq(copy_word(e,io,r_info), \
+ nullcopy))
+#define copy_shdr_11(e,io,seq) \
+ seq(copy_word(e,io,sh_name), \
+ seq(copy_word(e,io,sh_type), \
+ seq(copy_word(e,io,sh_flags), \
+ seq(copy_addr(e,io,sh_addr), \
+ seq(copy_off(e,io,sh_offset), \
+ seq(copy_word(e,io,sh_size), \
+ seq(copy_word(e,io,sh_link), \
+ seq(copy_word(e,io,sh_info), \
+ seq(copy_word(e,io,sh_addralign), \
+ seq(copy_word(e,io,sh_entsize), \
+ nullcopy))))))))))
+#define copy_sym_11(e,io,seq) \
+ seq(copy_word(e,io,st_name), \
+ seq(copy_addr(e,io,st_value), \
+ seq(copy_word(e,io,st_size), \
+ seq(copy_byte(e,io,st_info), \
+ seq(copy_byte(e,io,st_other), \
+ seq(copy_half(e,io,st_shndx), \
+ nullcopy))))))
+
+#define nullcopy /**/
+
+static size_t
+byte_copy(unsigned char *dst, const unsigned char *src, size_t n) {
+ if (n && dst && dst != src) {
+#if HAVE_BROKEN_MEMMOVE
+ size_t i;
+
+ if (dst >= src + n || dst + n <= src) {
+ memcpy(dst, src, n);
+ }
+ else if (dst < src) {
+ for (i = 0; i < n; i++) {
+ dst[i] = src[i];
+ }
+ }
+ else {
+ for (i = n; --i; ) {
+ dst[i] = src[i];
+ }
+ }
+#else /* HAVE_BROKEN_MEMMOVE */
+ memmove(dst, src, n);
+#endif /* HAVE_BROKEN_MEMMOVE */
+ }
+ return n;
+}
+
+static void
+array_copy(unsigned char *dst, size_t dlen, const unsigned char *src, size_t slen) {
+ byte_copy(dst, src, dlen < slen ? dlen : slen);
+ if (dlen > slen) {
+ memset(dst + slen, 0, dlen - slen);
+ }
+}
+
+/*
+ * instantiate copy functions
+ */
+copy_type(addr_32,_,Elf32_Addr,copy_addr_11)
+copy_type(half_32,_,Elf32_Half,copy_half_11)
+copy_type(off_32,_,Elf32_Off,copy_off_11)
+copy_type(sword_32,_,Elf32_Sword,copy_sword_11)
+copy_type(word_32,_,Elf32_Word,copy_word_11)
+copy_type(dyn_32,11,Elf32_Dyn,copy_dyn_11)
+copy_type(ehdr_32,11,Elf32_Ehdr,copy_ehdr_11)
+copy_type(phdr_32,11,Elf32_Phdr,copy_phdr_11)
+copy_type(rela_32,11,Elf32_Rela,copy_rela_11)
+copy_type(rel_32,11,Elf32_Rel,copy_rel_11)
+copy_type(shdr_32,11,Elf32_Shdr,copy_shdr_11)
+copy_type(sym_32,11,Elf32_Sym,copy_sym_11)
+
+typedef size_t (*xlator)(unsigned char*, const unsigned char*, size_t);
+typedef xlator xltab[ELF_T_NUM][2];
+
+/*
+ * translation table (32-bit, version 1 -> version 1)
+ */
+#if PIC
+static xltab
+#else /* PIC */
+static const xltab
+#endif /* PIC */
+xlate32_11[/*encoding*/] = {
+ {
+ { byte_copy, byte_copy },
+ { addr_32L__tom, addr_32L__tof },
+ { dyn_32L11_tom, dyn_32L11_tof },
+ { ehdr_32L11_tom, ehdr_32L11_tof },
+ { half_32L__tom, half_32L__tof },
+ { off_32L__tom, off_32L__tof },
+ { phdr_32L11_tom, phdr_32L11_tof },
+ { rela_32L11_tom, rela_32L11_tof },
+ { rel_32L11_tom, rel_32L11_tof },
+ { shdr_32L11_tom, shdr_32L11_tof },
+ { sword_32L__tom, sword_32L__tof },
+ { sym_32L11_tom, sym_32L11_tof },
+ { word_32L__tom, word_32L__tof },
+ { 0, 0 }, /* there is no Sxword */
+ { 0, 0 }, /* there is no Xword */
+#if __LIBELF_SYMBOL_VERSIONS
+ { _elf_verdef_32L11_tom, _elf_verdef_32L11_tof },
+ { _elf_verneed_32L11_tom, _elf_verneed_32L11_tof },
+#else /* __LIBELF_SYMBOL_VERSIONS */
+ { 0, 0 },
+ { 0, 0 },
+#endif /* __LIBELF_SYMBOL_VERSIONS */
+ },
+ {
+ { byte_copy, byte_copy },
+ { addr_32M__tom, addr_32M__tof },
+ { dyn_32M11_tom, dyn_32M11_tof },
+ { ehdr_32M11_tom, ehdr_32M11_tof },
+ { half_32M__tom, half_32M__tof },
+ { off_32M__tom, off_32M__tof },
+ { phdr_32M11_tom, phdr_32M11_tof },
+ { rela_32M11_tom, rela_32M11_tof },
+ { rel_32M11_tom, rel_32M11_tof },
+ { shdr_32M11_tom, shdr_32M11_tof },
+ { sword_32M__tom, sword_32M__tof },
+ { sym_32M11_tom, sym_32M11_tof },
+ { word_32M__tom, word_32M__tof },
+ { 0, 0 }, /* there is no Sxword */
+ { 0, 0 }, /* there is no Xword */
+#if __LIBELF_SYMBOL_VERSIONS
+ { _elf_verdef_32M11_tom, _elf_verdef_32M11_tof },
+ { _elf_verneed_32M11_tom, _elf_verneed_32M11_tof },
+#else /* __LIBELF_SYMBOL_VERSIONS */
+ { 0, 0 },
+ { 0, 0 },
+#endif /* __LIBELF_SYMBOL_VERSIONS */
+ },
+};
+
+/*
+ * main translation table (32-bit)
+ */
+#if PIC
+static xltab*
+#else /* PIC */
+static const xltab *const
+#endif /* PIC */
+xlate32[EV_CURRENT - EV_NONE][EV_CURRENT - EV_NONE] = {
+ { xlate32_11, },
+};
+
+#define translator(sv,dv,enc,type,d) \
+ (xlate32[(sv) - EV_NONE - 1] \
+ [(dv) - EV_NONE - 1] \
+ [(enc) - ELFDATA2LSB] \
+ [(type) - ELF_T_BYTE] \
+ [d])
+
+/*
+ * destination buffer size
+ */
+size_t
+_elf32_xltsize(const Elf_Data *src, unsigned dv, unsigned encode, int tof) {
+ Elf_Type type = src->d_type;
+ unsigned sv = src->d_version;
+ xlator op;
+
+ if (!valid_version(sv) || !valid_version(dv)) {
+ seterr(ERROR_UNKNOWN_VERSION);
+ return (size_t)-1;
+ }
+ if (tof) {
+ /*
+ * Encoding doesn't really matter (the translator only looks at
+ * the source, which resides in memory), but we need a proper
+ * encoding to select a translator...
+ */
+ encode = ELFDATA2LSB;
+ }
+ else if (!valid_encoding(encode)) {
+ seterr(ERROR_UNKNOWN_ENCODING);
+ return (size_t)-1;
+ }
+ if (!valid_type(type)) {
+ seterr(ERROR_UNKNOWN_TYPE);
+ return (size_t)-1;
+ }
+ if (!(op = translator(sv, dv, encode, type, tof))) {
+ seterr(ERROR_UNKNOWN_TYPE);
+ return (size_t)-1;
+ }
+ return (*op)(NULL, src->d_buf, src->d_size);
+}
+
+/*
+ * direction-independent translation
+ */
+static Elf_Data*
+elf32_xlate(Elf_Data *dst, const Elf_Data *src, unsigned encode, int tof) {
+ Elf_Type type;
+ int dv;
+ int sv;
+ size_t dsize;
+ size_t tmp;
+ xlator op;
+
+ if (!src || !dst) {
+ return NULL;
+ }
+ if (!src->d_buf || !dst->d_buf) {
+ seterr(ERROR_NULLBUF);
+ return NULL;
+ }
+ if (!valid_encoding(encode)) {
+ seterr(ERROR_UNKNOWN_ENCODING);
+ return NULL;
+ }
+ sv = src->d_version;
+ dv = dst->d_version;
+ if (!valid_version(sv) || !valid_version(dv)) {
+ seterr(ERROR_UNKNOWN_VERSION);
+ return NULL;
+ }
+ type = src->d_type;
+ if (!valid_type(type)) {
+ seterr(ERROR_UNKNOWN_TYPE);
+ return NULL;
+ }
+ op = translator(sv, dv, encode, type, tof);
+ if (!op) {
+ seterr(ERROR_UNKNOWN_TYPE);
+ return NULL;
+ }
+ dsize = (*op)(NULL, src->d_buf, src->d_size);
+ if (dsize == (size_t)-1) {
+ return NULL;
+ }
+ if (dst->d_size < dsize) {
+ seterr(ERROR_DST2SMALL);
+ return NULL;
+ }
+ if (dsize) {
+ tmp = (*op)(dst->d_buf, src->d_buf, src->d_size);
+ if (tmp == (size_t)-1) {
+ return NULL;
+ }
+ elf_assert(tmp == dsize);
+ }
+ dst->d_size = dsize;
+ dst->d_type = type;
+ return dst;
+}
+
+/*
+ * finally, the "official" translation functions
+ */
+Elf_Data*
+elf32_xlatetom(Elf_Data *dst, const Elf_Data *src, unsigned encode) {
+ return elf32_xlate(dst, src, encode, 0);
+}
+
+Elf_Data*
+elf32_xlatetof(Elf_Data *dst, const Elf_Data *src, unsigned encode) {
+ return elf32_xlate(dst, src, encode, 1);
+}
diff --git a/lib/64.xlatetof.c b/lib/64.xlatetof.c
new file mode 100644
index 0000000..c66f000
--- /dev/null
+++ b/lib/64.xlatetof.c
@@ -0,0 +1,512 @@
+/*
+ * 64.xlatetof.c - implementation of the elf64_xlateto[fm](3) functions.
+ * Copyright (C) 1995 - 2006 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <private.h>
+#include <ext_types.h>
+#include <byteswap.h>
+
+#if __LIBELF64
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: 64.xlatetof.c,v 1.27 2008/05/23 08:15:34 michael Exp $";
+#endif /* lint */
+
+/*
+ * Ugly, ugly
+ */
+#ifdef _WIN32
+# define Cat2(a,b)a##b
+# define Cat3(a,b,c)a##b##c
+# define Ex1(m1,m2,a,b)m1##m2(a##b)
+# define Ex2(m1,m2,a,b,c)m1##m2(a,b##c)
+#else /* _WIN32 */
+# define x
+# if defined/**/x
+# define Cat2(a,b)a##b
+# define Cat3(a,b,c)a##b##c
+# define Ex1(m1,m2,a,b)m1##m2(a##b)
+# define Ex2(m1,m2,a,b,c)m1##m2(a,b##c)
+# else
+# define Cat2(a,b)a/**/b
+# define Cat3(a,b,c)a/**/b/**/c
+# define Ex1(m1,m2,a,b)m1/**/m2(a/**/b)
+# define Ex2(m1,m2,a,b,c)m1/**/m2(a,b/**/c)
+# endif
+# undef x
+#endif /* _WIN32 */
+
+/*
+ * auxiliary macros for execution order reversal
+ */
+#define seq_forw(a,b) a b
+#define seq_back(a,b) b a
+
+/*
+ * function instantiator
+ */
+#define copy_type_e_io(name,e,io,tfrom,tto,copy) \
+ static size_t \
+ Cat3(name,_,io)(unsigned char *dst, const unsigned char *src, size_t n) { \
+ n /= sizeof(tfrom); \
+ if (n && dst) { \
+ const tfrom *from = (const tfrom*)src; \
+ tto *to = (tto*)dst; \
+ size_t i; \
+ \
+ if (sizeof(tfrom) < sizeof(tto)) { \
+ from += n; \
+ to += n; \
+ for (i = 0; i < n; i++) { \
+ --from; \
+ --to; \
+ copy(e,io,seq_back) \
+ } \
+ } \
+ else { \
+ for (i = 0; i < n; i++) { \
+ copy(e,io,seq_forw) \
+ from++; \
+ to++; \
+ } \
+ } \
+ } \
+ return n * sizeof(tto); \
+ }
+
+#define copy_type_e(name,e,type,copy) \
+ copy_type_e_io(name,e,tom,Cat2(__ext_,type),type,copy) \
+ copy_type_e_io(name,e,tof,type,Cat2(__ext_,type),copy)
+
+/*
+ * master function instantiator
+ */
+#define copy_type(name,version,type,copy) \
+ copy_type_e(Cat3(name,L,version),L,type,copy) \
+ copy_type_e(Cat3(name,M,version),M,type,copy)
+
+/*
+ * scalar copying
+ */
+#define copy_scalar_tom(type) *to = Cat2(__load_,type)(*from);
+#define copy_scalar_tof(type) Cat2(__store_,type)(*to, *from);
+
+/*
+ * structure member copying
+ */
+#define copy_tom(mb,type) to->mb = Cat2(__load_,type)(from->mb);
+#define copy_tof(mb,type) Cat2(__store_,type)(to->mb, from->mb);
+
+/*
+ * structure member copying (direction independent)
+ */
+#define copy_byte(e,io,mb) to->mb = from->mb;
+#define copy_addr(e,io,mb) Ex2(copy_,io,mb,u64,e)
+#define copy_half(e,io,mb) Ex2(copy_,io,mb,u16,e)
+#define copy_off(e,io,mb) Ex2(copy_,io,mb,u64,e)
+#define copy_sword(e,io,mb) Ex2(copy_,io,mb,i32,e)
+#define copy_word(e,io,mb) Ex2(copy_,io,mb,u32,e)
+#define copy_sxword(e,io,mb) Ex2(copy_,io,mb,i64,e)
+#define copy_xword(e,io,mb) Ex2(copy_,io,mb,u64,e)
+#define copy_arr(e,io,mb) \
+ array_copy(to->mb, sizeof(to->mb), from->mb, sizeof(from->mb));
+
+/*
+ * scalar copying (direction independent)
+ * these macros are used as `copy' arguments to copy_type()
+ */
+#define copy_addr_11(e,io,seq) Ex1(copy_scalar_,io,u64,e)
+#define copy_half_11(e,io,seq) Ex1(copy_scalar_,io,u16,e)
+#define copy_off_11(e,io,seq) Ex1(copy_scalar_,io,u64,e)
+#define copy_sword_11(e,io,seq) Ex1(copy_scalar_,io,i32,e)
+#define copy_word_11(e,io,seq) Ex1(copy_scalar_,io,u32,e)
+#define copy_sxword_11(e,io,seq)Ex1(copy_scalar_,io,i64,e)
+#define copy_xword_11(e,io,seq) Ex1(copy_scalar_,io,u64,e)
+
+/*
+ * structure copying (direction independent)
+ * these macros are used as `copy' arguments to copy_type()
+ */
+#define copy_dyn_11(e,io,seq) \
+ seq(copy_xword(e,io,d_tag), \
+ seq(copy_addr(e,io,d_un.d_ptr), \
+ nullcopy))
+#define copy_ehdr_11(e,io,seq) \
+ seq(copy_arr(e,io,e_ident), \
+ seq(copy_half(e,io,e_type), \
+ seq(copy_half(e,io,e_machine), \
+ seq(copy_word(e,io,e_version), \
+ seq(copy_addr(e,io,e_entry), \
+ seq(copy_off(e,io,e_phoff), \
+ seq(copy_off(e,io,e_shoff), \
+ seq(copy_word(e,io,e_flags), \
+ seq(copy_half(e,io,e_ehsize), \
+ seq(copy_half(e,io,e_phentsize), \
+ seq(copy_half(e,io,e_phnum), \
+ seq(copy_half(e,io,e_shentsize), \
+ seq(copy_half(e,io,e_shnum), \
+ seq(copy_half(e,io,e_shstrndx), \
+ nullcopy))))))))))))))
+#define copy_phdr_11(e,io,seq) \
+ seq(copy_word(e,io,p_type), \
+ seq(copy_word(e,io,p_flags), \
+ seq(copy_off(e,io,p_offset), \
+ seq(copy_addr(e,io,p_vaddr), \
+ seq(copy_addr(e,io,p_paddr), \
+ seq(copy_xword(e,io,p_filesz), \
+ seq(copy_xword(e,io,p_memsz), \
+ seq(copy_xword(e,io,p_align), \
+ nullcopy))))))))
+#if __LIBELF64_IRIX
+#define copy_rela_11(e,io,seq) \
+ seq(copy_addr(e,io,r_offset), \
+ seq(copy_word(e,io,r_sym), \
+ seq(copy_byte(e,io,r_ssym), \
+ seq(copy_byte(e,io,r_type3), \
+ seq(copy_byte(e,io,r_type2), \
+ seq(copy_byte(e,io,r_type), \
+ seq(copy_sxword(e,io,r_addend), \
+ nullcopy)))))))
+#define copy_rel_11(e,io,seq) \
+ seq(copy_addr(e,io,r_offset), \
+ seq(copy_word(e,io,r_sym), \
+ seq(copy_byte(e,io,r_ssym), \
+ seq(copy_byte(e,io,r_type3), \
+ seq(copy_byte(e,io,r_type2), \
+ seq(copy_byte(e,io,r_type), \
+ nullcopy))))))
+#else /* __LIBELF64_IRIX */
+#define copy_rela_11(e,io,seq) \
+ seq(copy_addr(e,io,r_offset), \
+ seq(copy_xword(e,io,r_info), \
+ seq(copy_sxword(e,io,r_addend), \
+ nullcopy)))
+#define copy_rel_11(e,io,seq) \
+ seq(copy_addr(e,io,r_offset), \
+ seq(copy_xword(e,io,r_info), \
+ nullcopy))
+#endif /* __LIBELF64_IRIX */
+#define copy_shdr_11(e,io,seq) \
+ seq(copy_word(e,io,sh_name), \
+ seq(copy_word(e,io,sh_type), \
+ seq(copy_xword(e,io,sh_flags), \
+ seq(copy_addr(e,io,sh_addr), \
+ seq(copy_off(e,io,sh_offset), \
+ seq(copy_xword(e,io,sh_size), \
+ seq(copy_word(e,io,sh_link), \
+ seq(copy_word(e,io,sh_info), \
+ seq(copy_xword(e,io,sh_addralign), \
+ seq(copy_xword(e,io,sh_entsize), \
+ nullcopy))))))))))
+#define copy_sym_11(e,io,seq) \
+ seq(copy_word(e,io,st_name), \
+ seq(copy_byte(e,io,st_info), \
+ seq(copy_byte(e,io,st_other), \
+ seq(copy_half(e,io,st_shndx), \
+ seq(copy_addr(e,io,st_value), \
+ seq(copy_xword(e,io,st_size), \
+ nullcopy))))))
+
+#define nullcopy /**/
+
+static size_t
+byte_copy(unsigned char *dst, const unsigned char *src, size_t n) {
+ if (n && dst && dst != src) {
+#if HAVE_BROKEN_MEMMOVE
+ size_t i;
+
+ if (dst >= src + n || dst + n <= src) {
+ memcpy(dst, src, n);
+ }
+ else if (dst < src) {
+ for (i = 0; i < n; i++) {
+ dst[i] = src[i];
+ }
+ }
+ else {
+ for (i = n; --i; ) {
+ dst[i] = src[i];
+ }
+ }
+#else /* HAVE_BROKEN_MEMMOVE */
+ memmove(dst, src, n);
+#endif /* HAVE_BROKEN_MEMMOVE */
+ }
+ return n;
+}
+
+static void
+array_copy(unsigned char *dst, size_t dlen, const unsigned char *src, size_t slen) {
+ byte_copy(dst, src, dlen < slen ? dlen : slen);
+ if (dlen > slen) {
+ memset(dst + slen, 0, dlen - slen);
+ }
+}
+
+/*
+ * instantiate copy functions
+ */
+copy_type(addr_64,_,Elf64_Addr,copy_addr_11)
+copy_type(half_64,_,Elf64_Half,copy_half_11)
+copy_type(off_64,_,Elf64_Off,copy_off_11)
+copy_type(sword_64,_,Elf64_Sword,copy_sword_11)
+copy_type(word_64,_,Elf64_Word,copy_word_11)
+copy_type(sxword_64,_,Elf64_Sxword,copy_sxword_11)
+copy_type(xword_64,_,Elf64_Xword,copy_xword_11)
+copy_type(dyn_64,11,Elf64_Dyn,copy_dyn_11)
+copy_type(ehdr_64,11,Elf64_Ehdr,copy_ehdr_11)
+copy_type(phdr_64,11,Elf64_Phdr,copy_phdr_11)
+copy_type(rela_64,11,Elf64_Rela,copy_rela_11)
+copy_type(rel_64,11,Elf64_Rel,copy_rel_11)
+copy_type(shdr_64,11,Elf64_Shdr,copy_shdr_11)
+copy_type(sym_64,11,Elf64_Sym,copy_sym_11)
+
+typedef size_t (*xlator)(unsigned char*, const unsigned char*, size_t);
+typedef xlator xltab[ELF_T_NUM][2];
+
+/*
+ * translation table (64-bit, version 1 -> version 1)
+ */
+#if PIC
+static xltab
+#else /* PIC */
+static const xltab
+#endif /* PIC */
+xlate64_11[/*encoding*/] = {
+ {
+ { byte_copy, byte_copy },
+ { addr_64L__tom, addr_64L__tof },
+ { dyn_64L11_tom, dyn_64L11_tof },
+ { ehdr_64L11_tom, ehdr_64L11_tof },
+ { half_64L__tom, half_64L__tof },
+ { off_64L__tom, off_64L__tof },
+ { phdr_64L11_tom, phdr_64L11_tof },
+ { rela_64L11_tom, rela_64L11_tof },
+ { rel_64L11_tom, rel_64L11_tof },
+ { shdr_64L11_tom, shdr_64L11_tof },
+ { sword_64L__tom, sword_64L__tof },
+ { sym_64L11_tom, sym_64L11_tof },
+ { word_64L__tom, word_64L__tof },
+ { sxword_64L__tom, sxword_64L__tof },
+ { xword_64L__tom, xword_64L__tof },
+#if __LIBELF_SYMBOL_VERSIONS
+ { _elf_verdef_64L11_tom, _elf_verdef_64L11_tof },
+ { _elf_verneed_64L11_tom, _elf_verneed_64L11_tof },
+#else /* __LIBELF_SYMBOL_VERSIONS */
+ { 0, 0 },
+ { 0, 0 },
+#endif /* __LIBELF_SYMBOL_VERSIONS */
+ },
+ {
+ { byte_copy, byte_copy },
+ { addr_64M__tom, addr_64M__tof },
+ { dyn_64M11_tom, dyn_64M11_tof },
+ { ehdr_64M11_tom, ehdr_64M11_tof },
+ { half_64M__tom, half_64M__tof },
+ { off_64M__tom, off_64M__tof },
+ { phdr_64M11_tom, phdr_64M11_tof },
+ { rela_64M11_tom, rela_64M11_tof },
+ { rel_64M11_tom, rel_64M11_tof },
+ { shdr_64M11_tom, shdr_64M11_tof },
+ { sword_64M__tom, sword_64M__tof },
+ { sym_64M11_tom, sym_64M11_tof },
+ { word_64M__tom, word_64M__tof },
+ { sxword_64M__tom, sxword_64M__tof },
+ { xword_64M__tom, xword_64M__tof },
+#if __LIBELF_SYMBOL_VERSIONS
+ { _elf_verdef_64M11_tom, _elf_verdef_64M11_tof },
+ { _elf_verneed_64M11_tom, _elf_verneed_64M11_tof },
+#else /* __LIBELF_SYMBOL_VERSIONS */
+ { 0, 0 },
+ { 0, 0 },
+#endif /* __LIBELF_SYMBOL_VERSIONS */
+ },
+};
+
+/*
+ * main translation table (64-bit)
+ */
+#if PIC
+static xltab*
+#else /* PIC */
+static const xltab *const
+#endif /* PIC */
+xlate64[EV_CURRENT - EV_NONE][EV_CURRENT - EV_NONE] = {
+ { xlate64_11, },
+};
+
+#define translator(sv,dv,enc,type,d) \
+ (xlate64[(sv) - EV_NONE - 1] \
+ [(dv) - EV_NONE - 1] \
+ [(enc) - ELFDATA2LSB] \
+ [(type) - ELF_T_BYTE] \
+ [d])
+
+/*
+ * destination buffer size
+ */
+size_t
+_elf64_xltsize(const Elf_Data *src, unsigned dv, unsigned encode, int tof) {
+ Elf_Type type = src->d_type;
+ unsigned sv = src->d_version;
+ xlator op;
+
+ if (!valid_version(sv) || !valid_version(dv)) {
+ seterr(ERROR_UNKNOWN_VERSION);
+ return (size_t)-1;
+ }
+ if (tof) {
+ /*
+ * Encoding doesn't really matter (the translator only looks at
+ * the source, which resides in memory), but we need a proper
+ * encoding to select a translator...
+ */
+ encode = ELFDATA2LSB;
+ }
+ else if (!valid_encoding(encode)) {
+ seterr(ERROR_UNKNOWN_ENCODING);
+ return (size_t)-1;
+ }
+ if (!valid_type(type)) {
+ seterr(ERROR_UNKNOWN_TYPE);
+ return (size_t)-1;
+ }
+ if (!(op = translator(sv, dv, encode, type, tof))) {
+ seterr(ERROR_UNKNOWN_TYPE);
+ return (size_t)-1;
+ }
+ return (*op)(NULL, src->d_buf, src->d_size);
+}
+
+/*
+ * direction-independent translation
+ */
+static Elf_Data*
+elf64_xlate(Elf_Data *dst, const Elf_Data *src, unsigned encode, int tof) {
+ Elf_Type type;
+ int dv;
+ int sv;
+ size_t dsize;
+ size_t tmp;
+ xlator op;
+
+ if (!src || !dst) {
+ return NULL;
+ }
+ if (!src->d_buf || !dst->d_buf) {
+ seterr(ERROR_NULLBUF);
+ return NULL;
+ }
+ if (!valid_encoding(encode)) {
+ seterr(ERROR_UNKNOWN_ENCODING);
+ return NULL;
+ }
+ sv = src->d_version;
+ dv = dst->d_version;
+ if (!valid_version(sv) || !valid_version(dv)) {
+ seterr(ERROR_UNKNOWN_VERSION);
+ return NULL;
+ }
+ type = src->d_type;
+ if (!valid_type(type)) {
+ seterr(ERROR_UNKNOWN_TYPE);
+ return NULL;
+ }
+ op = translator(sv, dv, encode, type, tof);
+ if (!op) {
+ seterr(ERROR_UNKNOWN_TYPE);
+ return NULL;
+ }
+ dsize = (*op)(NULL, src->d_buf, src->d_size);
+ if (dsize == (size_t)-1) {
+ return NULL;
+ }
+ if (dst->d_size < dsize) {
+ seterr(ERROR_DST2SMALL);
+ return NULL;
+ }
+ if (dsize) {
+ tmp = (*op)(dst->d_buf, src->d_buf, src->d_size);
+ if (tmp == (size_t)-1) {
+ return NULL;
+ }
+ elf_assert(tmp == dsize);
+ }
+ dst->d_size = dsize;
+ dst->d_type = type;
+ return dst;
+}
+
+/*
+ * finally, the "official" translation functions
+ */
+Elf_Data*
+elf64_xlatetom(Elf_Data *dst, const Elf_Data *src, unsigned encode) {
+ return elf64_xlate(dst, src, encode, 0);
+}
+
+Elf_Data*
+elf64_xlatetof(Elf_Data *dst, const Elf_Data *src, unsigned encode) {
+ return elf64_xlate(dst, src, encode, 1);
+}
+
+Elf_Data*
+gelf_xlatetom(Elf *elf, Elf_Data *dst, const Elf_Data *src, unsigned encode) {
+ if (elf) {
+ if (elf->e_kind != ELF_K_ELF) {
+ seterr(ERROR_NOTELF);
+ }
+ else if (elf->e_class == ELFCLASS32) {
+ return elf32_xlatetom(dst, src, encode);
+ }
+ else if (elf->e_class == ELFCLASS64) {
+ return elf64_xlatetom(dst, src, encode);
+ }
+ else if (valid_class(elf->e_class)) {
+ seterr(ERROR_UNIMPLEMENTED);
+ }
+ else {
+ seterr(ERROR_UNKNOWN_CLASS);
+ }
+ }
+ return NULL;
+}
+
+Elf_Data*
+gelf_xlatetof(Elf *elf, Elf_Data *dst, const Elf_Data *src, unsigned encode) {
+ if (elf) {
+ if (elf->e_kind != ELF_K_ELF) {
+ seterr(ERROR_NOTELF);
+ }
+ else if (elf->e_class == ELFCLASS32) {
+ return elf32_xlatetof(dst, src, encode);
+ }
+ else if (elf->e_class == ELFCLASS64) {
+ return elf64_xlatetof(dst, src, encode);
+ }
+ else if (valid_class(elf->e_class)) {
+ seterr(ERROR_UNIMPLEMENTED);
+ }
+ else {
+ seterr(ERROR_UNKNOWN_CLASS);
+ }
+ }
+ return NULL;
+}
+
+#endif /* __LIBELF64__ */
diff --git a/lib/Makefile.in b/lib/Makefile.in
new file mode 100644
index 0000000..92a129f
--- /dev/null
+++ b/lib/Makefile.in
@@ -0,0 +1,278 @@
+# lib/Makefile for libelf.
+# Copyright (C) 1995 - 2009 Michael Riepe
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+# @(#) $Id: Makefile.in,v 1.40 2009/11/01 13:04:19 michael Exp $
+
+instroot =
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+libdir = @libdir@
+includedir = @includedir@
+installdirs = $(libdir) $(includedir) $(includedir)/libelf
+
+CC = @CC@
+LD = @LD@
+AR = ar
+MV = mv -f
+RM = rm -f
+LN_S = @LN_S@
+RANLIB = @RANLIB@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+DEFS = -DHAVE_CONFIG_H
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+DEPSHLIBS = @DEPSHLIBS@
+
+DO_SHLIB = @DO_SHLIB@
+PICFLAGS = @PICFLAGS@
+SHLIB_SFX = @SHLIB_SFX@
+SHLINK_SFX = @SHLINK_SFX@
+SONAME_SFX = @SONAME_SFX@
+LINK_SHLIB = @LINK_SHLIB@
+INSTALL_SHLIB = @INSTALL_SHLIB@
+
+SHLIB = libelf$(SHLIB_SFX)
+SHLINK = libelf$(SHLINK_SFX)
+SONAME = libelf$(SONAME_SFX)
+
+# install includes in includedir?
+DO_COMPAT = @DO_COMPAT@
+
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS)
+
+# no user serviceable parts below
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+MAJOR = @MAJOR@
+
+SHELL = /bin/sh
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+
+topdir = ..
+subdir = lib
+
+.SUFFIXES:
+.SUFFIXES: .c .o
+.c.o:
+ @$(RM) $@ $(@:.o=.os)
+ if test -n "$(PICFLAGS)"; then \
+ $(COMPILE) $(PICFLAGS) $< && $(MV) $@ $(@:.o=.os); \
+ else true; fi
+ $(COMPILE) $<
+
+INCLUDES = -I$(topdir) -I. -I$(srcdir)
+
+# generic sources
+SRCS1 = begin.c cntl.c end.c errmsg.c errno.c fill.c flag.c getarhdr.c \
+ getarsym.c getbase.c getdata.c getident.c getscn.c hash.c kind.c \
+ ndxscn.c newdata.c newscn.c next.c nextscn.c rand.c rawdata.c \
+ rawfile.c strptr.c update.c version.c checksum.c getaroff.c
+OBJS1 = begin.o cntl.o end.o errmsg.o errno.o fill.o flag.o getarhdr.o \
+ getarsym.o getbase.o getdata.o getident.o getscn.o hash.o kind.o \
+ ndxscn.o newdata.o newscn.o next.o nextscn.o rand.o rawdata.o \
+ rawfile.o strptr.o update.o version.o checksum.o getaroff.o
+
+# 32-bit sources
+SRCS2 = 32.fsize.c 32.getehdr.c 32.getphdr.c 32.getshdr.c 32.newehdr.c \
+ 32.newphdr.c 32.xlatetof.c
+OBJS2 = 32.fsize.o 32.getehdr.o 32.getphdr.o 32.getshdr.o 32.newehdr.o \
+ 32.newphdr.o 32.xlatetof.o
+
+# support
+SRCS3 = cook.c data.c input.c assert.c
+OBJS3 = cook.o data.o input.o assert.o
+
+# nlist
+SRCS4 = nlist.c
+OBJS4 = nlist.o
+
+# opt
+SRCS5 = opt.delscn.c x.remscn.c x.movscn.c x.elfext.c
+OBJS5 = opt.delscn.o x.remscn.o x.movscn.o x.elfext.o
+
+# 64-bit sources
+SRCS64 = 64.xlatetof.c gelfehdr.c gelfphdr.c gelfshdr.c gelftrans.c swap64.c
+OBJS64 = 64.xlatetof.o gelfehdr.o gelfphdr.o gelfshdr.o gelftrans.o swap64.o
+
+# Versioning sources
+SRCS_V = verdef_32_tof.c verdef_32_tom.c verdef_64_tof.c verdef_64_tom.c
+OBJS_V = verdef_32_tof.o verdef_32_tom.o verdef_64_tof.o verdef_64_tom.o
+HDRS_V = verdef.h verneed.h
+
+SRCS = $(SRCS1) $(SRCS2) $(SRCS3) $(SRCS4) $(SRCS5) $(SRCS64) $(SRCS_V)
+OBJS = $(OBJS1) $(OBJS2) $(OBJS3) $(OBJS4) $(OBJS5) $(OBJS64) $(OBJS_V)
+
+# missing functions
+LIBSRCS = memset.c
+LIBOBJS = @LIBOBJS@
+
+# public header files
+HDRS = libelf.h nlist.h gelf.h
+
+# public header files (created by configure)
+AUXHDRS = sys_elf.h
+
+# private header files
+PRIVHDRS = byteswap.h errors.h ext_types.h private.h elf_repl.h \
+ $(HDRS_V)
+
+DISTFILES = $(SRCS) $(LIBSRCS) $(HDRS) $(PRIVHDRS) Makefile.in sys_elf.h.in \
+ Makefile.w32 build.bat config.h.w32 libelf.def sys_elf.h.w32
+
+all: libelf.a shared-$(DO_SHLIB)
+
+check:
+
+shared-yes: $(SHLIB)
+shared-no:
+
+libelf.a: $(OBJS) $(LIBOBJS)
+ @$(RM) $@
+ $(AR) rcv $@ $(OBJS) $(LIBOBJS)
+ $(RANLIB) $@
+
+$(SHLIB): libelf.a
+ @$(RM) $(SHLIB)
+ $(LINK_SHLIB) -o $(SHLIB) $(OBJS:.o=.os) $(LIBOBJS:.o=.os) $(DEPSHLIBS)
+ if test "$(SONAME)" = "$(SHLIB)"; then true; else \
+ $(RM) $(SONAME) && $(LN_S) $(SHLIB) $(SONAME); \
+ fi
+ if test "$(SHLINK)" = "$(SHLIB)"; then true; else \
+ $(RM) $(SHLINK) && $(LN_S) $(SHLIB) $(SHLINK); \
+ fi
+
+install: install-data \
+ install-shared-$(DO_SHLIB) install-compat-$(DO_COMPAT)
+
+installdirs: $(top_srcdir)/mkinstalldirs
+ dirs="$(installdirs)"; for dir in $$dirs; do \
+ $(SHELL) $(top_srcdir)/mkinstalldirs $(instroot)$$dir; \
+ done
+
+install-data: all installdirs
+ $(INSTALL_DATA) libelf.a $(instroot)$(libdir)
+ -cd $(instroot)$(libdir) && $(RANLIB) libelf.a
+ files="$(HDRS) $(AUXHDRS) elf_repl.h"; for file in $$files; do \
+ if test -r $$file; then \
+ $(INSTALL_DATA) $$file $(instroot)$(includedir)/libelf; \
+ else \
+ $(INSTALL_DATA) $(srcdir)/$$file $(instroot)$(includedir)/libelf; \
+ fi; \
+ done
+
+uninstall: uninstall-data \
+ uninstall-shared-$(DO_SHLIB) uninstall-compat-$(DO_COMPAT)
+
+uninstall-data:
+ $(RM) $(instroot)$(libdir)/libelf.a
+ $(RM) -r $(instroot)$(includedir)/libelf
+
+install-shared-yes: install-shared
+install-shared-no:
+install-shared: installdirs $(SHLIB)
+ $(INSTALL_SHLIB) $(SHLIB) $(instroot)$(libdir)
+ if test "$(SONAME)" = "$(SHLIB)"; then true; else \
+ cd $(instroot)$(libdir) && $(RM) $(SONAME) && $(LN_S) $(SHLIB) $(SONAME); \
+ fi
+ if test "$(SHLINK)" = "$(SHLIB)"; then true; else \
+ cd $(instroot)$(libdir) && $(RM) $(SHLINK) && $(LN_S) $(SHLIB) $(SHLINK); \
+ fi
+
+uninstall-shared-yes: uninstall-shared
+uninstall-shared-no:
+uninstall-shared:
+ cd $(instroot)$(libdir) && $(RM) $(SHLIB) $(SONAME) $(SHLINK)
+
+install-compat-yes: install-compat
+install-compat-no:
+install-compat: installdirs
+ files="$(HDRS)"; for file in $$files; do \
+ if test -f $(instroot)$(includedir)/$$file; then true; else \
+ echo "#include <libelf/$$file>" > $(instroot)$(includedir)/$$file; \
+ fi; \
+ done
+
+uninstall-compat-yes: uninstall-compat
+uninstall-compat-no:
+uninstall-compat:
+ files="$(HDRS)"; for file in $$files; do \
+ if grep "^#include <libelf/$$file>\$$" $(instroot)$(includedir)/$$file >/dev/null 2>&1; then \
+ $(RM) $(instroot)$(includedir)/$$file; \
+ else true; fi; \
+ done
+
+mostlyclean:
+ $(RM) *.o *.a *.os $(SHLIB) $(SONAME) $(SHLINK)
+ $(RM) *~ core a.out errlist
+
+clean: mostlyclean
+
+distclean: clean
+ $(RM) stamp-h $(AUXHDRS)
+ $(RM) Makefile
+
+maintainer-clean: distclean
+
+# maintainer only
+
+MAINT = @MAINT@
+
+distdir = $(PACKAGE)-$(VERSION)
+distsubdir = $(topdir)/$(distdir)/$(subdir)
+$(MAINT)dist: $(DISTFILES)
+ if test -d $(distsubdir); then true; else mkdir $(distsubdir); fi
+ files="$(DISTFILES)"; for file in $$files; do \
+ ln $(srcdir)/$$file $(distsubdir) || \
+ cp -p $(srcdir)/$$file $(distsubdir) || exit 1; \
+ done
+
+# For the justification of the following Makefile rules, see node
+# `Automatic Remaking' in GNU Autoconf documentation.
+
+$(MAINT)Makefile: Makefile.in $(topdir)/config.status
+ cd $(topdir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./config.status
+
+$(MAINT)sys_elf.h: stamp-h
+$(MAINT)stamp-h: sys_elf.h.in $(topdir)/config.status
+ cd $(topdir) && CONFIG_FILES= CONFIG_HEADERS=$(subdir)/sys_elf.h ./config.status
+ $(RM) stamp-h && echo timestamp > stamp-h
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
+
+# dependencies
+$(OBJS): private.h $(topdir)/config.h libelf.h gelf.h errors.h $(AUXHDRS)
+32.fsize.o: ext_types.h
+32.xlatetof.o: byteswap.h ext_types.h
+64.xlatetof.o: byteswap.h ext_types.h
+getarsym.o: byteswap.h
+memset.o: $(topdir)/config.h
+nlist.o: nlist.h
+swap64.o: byteswap.h
+$(OBJS_V): byteswap.h ext_types.h $(HDRS_V)
diff --git a/lib/Makefile.w32 b/lib/Makefile.w32
new file mode 100644
index 0000000..7ee810c
--- /dev/null
+++ b/lib/Makefile.w32
@@ -0,0 +1,166 @@
+# lib/Makefile.w32 - Makefile for W32 port.
+# Copyright (C) 1995 - 2009 Michael Riepe
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+# @(#) $Id: Makefile.w32,v 1.3 2009/11/01 13:04:19 michael Exp $
+
+instroot =
+
+prefix =
+exec_prefix =
+libdir =
+includedir =
+installdirs = $(libdir) $(includedir) $(includedir)/libelf
+
+CC = cl /nologo
+LD = link /nologo
+AR =
+MV =
+RM = del
+LN_S =
+RANLIB =
+INSTALL =
+INSTALL_DATA =
+INSTALL_PROGRAM =
+
+CFLAGS = /O2 /W2 /TC /MD
+CPPFLAGS =
+DEFS = /DHAVE_CONFIG_H
+LDFLAGS =
+LIBS =
+DEPSHLIBS =
+
+DO_SHLIB =
+PICFLAGS =
+SHLIB_SFX = .dll
+SHLINK_SFX =
+SONAME_SFX =
+LINK_SHLIB = $(LD) /DLL $(LDFLAGS)
+
+SHLIB = libelf$(SHLIB_SFX)
+SHLINK = libelf$(SHLINK_SFX)
+SONAME = libelf$(SONAME_SFX)
+
+# install includes in includedir?
+DO_COMPAT =
+
+INCLUDES = /I.
+
+COMPILE = $(CC) /c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS)
+
+# no user serviceable parts below
+
+PACKAGE = libelf
+VERSION = 0.8.9
+MAJOR = 0
+
+SHELL = /bin/sh
+
+srcdir = .
+top_srcdir = ..
+
+topdir = ..
+subdir = lib
+
+.SUFFIXES:
+.SUFFIXES: .obj .c
+.c.obj:
+ $(COMPILE) $<
+
+# generic sources
+SRCS1 = begin.c cntl.c end.c errmsg.c errno.c fill.c flag.c getarhdr.c \
+ getarsym.c getbase.c getdata.c getident.c getscn.c hash.c kind.c \
+ ndxscn.c newdata.c newscn.c next.c nextscn.c rand.c rawdata.c \
+ rawfile.c strptr.c update.c version.c checksum.c getaroff.c
+OBJS1 = $(SRCS1:.c=.obj)
+
+# 32-bit sources
+SRCS2 = 32.fsize.c 32.getehdr.c 32.getphdr.c 32.getshdr.c 32.newehdr.c \
+ 32.newphdr.c 32.xlatetof.c
+OBJS2 = $(SRCS2:.c=.obj)
+
+# support
+SRCS3 = cook.c data.c input.c assert.c
+OBJS3 = $(SRCS3:.c=.obj)
+
+# nlist
+SRCS4 = nlist.c
+OBJS4 = $(SRCS4:.c=.obj)
+
+# opt
+SRCS5 = opt.delscn.c x.remscn.c x.movscn.c x.elfext.c
+OBJS5 = $(SRCS5:.c=.obj)
+
+# 64-bit sources
+SRCS64 = 64.xlatetof.c gelfehdr.c gelfphdr.c gelfshdr.c gelftrans.c swap64.c
+OBJS64 = $(SRCS64:.c=.obj)
+
+# Versioning sources
+SRCS_V = verdef_32_tof.c verdef_32_tom.c verdef_64_tof.c verdef_64_tom.c
+OBJS_V = $(SRCS_V:.c=.obj)
+HDRS_V = verdef.h verneed.h
+
+SRCS = $(SRCS1) $(SRCS2) $(SRCS3) $(SRCS4) $(SRCS5) $(SRCS64) $(SRCS_V)
+OBJS = $(OBJS1) $(OBJS2) $(OBJS3) $(OBJS4) $(OBJS5) $(OBJS64) $(OBJS_V)
+
+# missing functions
+LIBSRCS = memset.c
+LIBOBJS =
+
+# public header files
+HDRS = libelf.h nlist.h gelf.h
+
+# public header files (created by configure)
+AUXHDRS = sys_elf.h
+
+# private header files
+PRIVHDRS = byteswap.h errors.h ext_types.h private.h elf_repl.h $(HDRS_V)
+
+DISTFILES = $(SRCS) $(LIBSRCS) $(HDRS) $(PRIVHDRS) Makefile.in sys_elf.h.in
+
+all: $(OBJS) $(SHLIB)
+
+check:
+
+$(SHLIB): libelf.def $(OBJS) $(LIBOBJS)
+ -@$(RM) $(SHLIB)
+ $(LINK_SHLIB) /OUT:"$(SHLIB)" /DEF:"libelf.def" $(OBJS) $(LIBOBJS) kernel32.lib
+
+install:
+
+mostlyclean:
+ -$(RM) *.obj
+ -$(RM) $(SHLIB)
+ -$(RM) libelf.lib
+ -$(RM) libelf.exp
+
+clean: mostlyclean
+
+distclean: clean
+ -$(RM) $(AUXHDRS)
+
+maintainer-clean: distclean
+
+# dependencies
+$(OBJS): private.h config.h libelf.h gelf.h errors.h $(AUXHDRS)
+32.fsize.obj: ext_types.h
+32.xlatetof.obj: byteswap.h ext_types.h
+64.xlatetof.obj: byteswap.h ext_types.h
+getarsym.obj: byteswap.h
+memset.obj: config.h
+nlist.obj: nlist.h
+swap64.obj: byteswap.h
+$(OBJS_V): byteswap.h ext_types.h $(HDRS_V)
diff --git a/lib/assert.c b/lib/assert.c
new file mode 100644
index 0000000..18bd041
--- /dev/null
+++ b/lib/assert.c
@@ -0,0 +1,33 @@
+/*
+assert.c - assert function for libelf.
+Copyright (C) 1999 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: assert.c,v 1.5 2008/05/23 08:15:34 michael Exp $";
+#endif /* lint */
+
+#include <stdio.h>
+
+void
+__elf_assert(const char *file, unsigned line, const char *cond) {
+ fprintf(stderr, "%s:%u: libelf assertion failure: %s\n",
+ file, line, cond);
+ abort();
+}
diff --git a/lib/begin.c b/lib/begin.c
new file mode 100644
index 0000000..1a7a229
--- /dev/null
+++ b/lib/begin.c
@@ -0,0 +1,429 @@
+/*
+ * begin.c - implementation of the elf_begin(3) and elf_memory(3) functions.
+ * Copyright (C) 1995 - 2004 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: begin.c,v 1.22 2009/11/01 13:04:19 michael Exp $";
+#endif /* lint */
+
+static const Elf _elf_init = INIT_ELF;
+static const char fmag[] = ARFMAG;
+
+static unsigned long
+getnum(const char *str, size_t len, int base, size_t *err) {
+ unsigned long result = 0;
+
+ while (len && *str == ' ') {
+ str++; len--;
+ }
+ while (len && *str >= '0' && (*str - '0') < base) {
+ result = base * result + *str++ - '0'; len--;
+ }
+ while (len && *str == ' ') {
+ str++; len--;
+ }
+ if (len) {
+ *err = len;
+ }
+ return result;
+}
+
+static void
+_elf_init_ar(Elf *elf) {
+ struct ar_hdr *hdr;
+ size_t offset;
+ size_t size;
+ size_t err = 0;
+
+ elf->e_kind = ELF_K_AR;
+ elf->e_idlen = SARMAG;
+ elf->e_off = SARMAG;
+
+ /* process special members */
+ offset = SARMAG;
+ while (!elf->e_strtab && offset + sizeof(*hdr) <= elf->e_size) {
+ hdr = (struct ar_hdr*)(elf->e_data + offset);
+ if (memcmp(hdr->ar_fmag, fmag, sizeof(fmag) - 1)) {
+ break;
+ }
+ if (hdr->ar_name[0] != '/') {
+ break;
+ }
+ size = getnum(hdr->ar_size, sizeof(hdr->ar_size), 10, &err);
+ if (err || !size) {
+ break;
+ }
+ offset += sizeof(*hdr);
+ if (offset + size > elf->e_size) {
+ break;
+ }
+ if (hdr->ar_name[1] == '/' && hdr->ar_name[2] == ' ') {
+ elf->e_strtab = elf->e_data + offset;
+ elf->e_strlen = size;
+ break;
+ }
+ if (hdr->ar_name[1] != ' ') {
+ break;
+ }
+ /*
+ * Windows (.lib) archives provide two symbol tables
+ * The first one is the one we want.
+ */
+ if (!elf->e_symtab) {
+ elf->e_symtab = elf->e_data + offset;
+ elf->e_symlen = size;
+ }
+ offset += size + (size & 1);
+ }
+}
+
+static Elf_Arhdr*
+_elf_arhdr(Elf *arf) {
+ struct ar_hdr *hdr;
+ Elf_Arhdr *arhdr;
+ size_t namelen;
+ size_t tmp;
+ char *name;
+ size_t err = 0;
+
+ if (arf->e_off == arf->e_size) {
+ /* no error! */
+ return NULL;
+ }
+ if (arf->e_off < 0 || arf->e_off > arf->e_size) {
+ seterr(ERROR_OUTSIDE);
+ return NULL;
+ }
+ if (arf->e_off + sizeof(*hdr) > arf->e_size) {
+ seterr(ERROR_TRUNC_ARHDR);
+ return NULL;
+ }
+ elf_assert(arf->e_data != NULL);
+ hdr = (struct ar_hdr*)(arf->e_data + arf->e_off);
+ if (memcmp(hdr->ar_fmag, fmag, sizeof(fmag) - 1)) {
+ seterr(ERROR_ARFMAG);
+ return NULL;
+ }
+
+ name = hdr->ar_name;
+ for (namelen = sizeof(hdr->ar_name); namelen > 0; namelen--) {
+ if (name[namelen - 1] != ' ') {
+ break;
+ }
+ }
+ if (name[0] == '/') {
+ if (name[1] >= '0' && name[1] <= '9') {
+ if (!arf->e_strtab) {
+ seterr(ERROR_ARSTRTAB);
+ return NULL;
+ }
+ tmp = getnum(&name[1], namelen - 1, 10, &err);
+ if (err) {
+ seterr(ERROR_ARSPECIAL);
+ return NULL;
+ }
+ if (tmp < 0 || tmp >= arf->e_strlen) {
+ seterr(ERROR_ARSTRTAB);
+ return NULL;
+ }
+ for (namelen = tmp; namelen < arf->e_strlen; namelen++) {
+ if (arf->e_strtab[namelen] == '/') {
+ break;
+ }
+ }
+ if (namelen == arf->e_strlen) {
+ seterr(ERROR_ARSTRTAB);
+ return NULL;
+ }
+ name = arf->e_strtab + tmp;
+ namelen -= tmp;
+ }
+ else if (namelen != 1 && !(namelen == 2 && name[1] == '/')) {
+ seterr(ERROR_ARSPECIAL);
+ return NULL;
+ }
+ }
+ else if (namelen > 0 && name[namelen - 1] == '/') {
+ namelen--;
+ }
+ /* XXX some broken software omits the trailing slash
+ else {
+ namelen = 0;
+ }
+ */
+
+ if (!(arhdr = (Elf_Arhdr*)malloc(sizeof(*arhdr) +
+ sizeof(hdr->ar_name) + namelen + 2))) {
+ seterr(ERROR_MEM_ARHDR);
+ return NULL;
+ }
+
+ arhdr->ar_name = NULL;
+ arhdr->ar_rawname = (char*)(arhdr + 1);
+ arhdr->ar_date = getnum(hdr->ar_date, sizeof(hdr->ar_date), 10, &err);
+ arhdr->ar_uid = getnum(hdr->ar_uid, sizeof(hdr->ar_uid), 10, &err);
+ arhdr->ar_gid = getnum(hdr->ar_gid, sizeof(hdr->ar_gid), 10, &err);
+ arhdr->ar_mode = getnum(hdr->ar_mode, sizeof(hdr->ar_mode), 8, &err);
+ arhdr->ar_size = getnum(hdr->ar_size, sizeof(hdr->ar_size), 10, &err);
+ if (err) {
+ free(arhdr);
+ seterr(ERROR_ARHDR);
+ return NULL;
+ }
+ if (arf->e_off + sizeof(struct ar_hdr) + arhdr->ar_size > arf->e_size) {
+ free(arhdr);
+ seterr(ERROR_TRUNC_MEMBER);
+ return NULL;
+ }
+
+ memcpy(arhdr->ar_rawname, hdr->ar_name, sizeof(hdr->ar_name));
+ arhdr->ar_rawname[sizeof(hdr->ar_name)] = '\0';
+
+ if (namelen) {
+ arhdr->ar_name = arhdr->ar_rawname + sizeof(hdr->ar_name) + 1;
+ memcpy(arhdr->ar_name, name, namelen);
+ arhdr->ar_name[namelen] = '\0';
+ }
+
+ return arhdr;
+}
+
+static void
+_elf_check_type(Elf *elf, size_t size) {
+ elf->e_idlen = size;
+ if (size >= EI_NIDENT && !memcmp(elf->e_data, ELFMAG, SELFMAG)) {
+ elf->e_kind = ELF_K_ELF;
+ elf->e_idlen = EI_NIDENT;
+ elf->e_class = elf->e_data[EI_CLASS];
+ elf->e_encoding = elf->e_data[EI_DATA];
+ elf->e_version = elf->e_data[EI_VERSION];
+ }
+ else if (size >= SARMAG && !memcmp(elf->e_data, ARMAG, SARMAG)) {
+ _elf_init_ar(elf);
+ }
+}
+
+Elf*
+elf_begin(int fd, Elf_Cmd cmd, Elf *ref) {
+ Elf_Arhdr *arhdr = NULL;
+ size_t size = 0;
+ off_t off;
+ Elf *elf;
+
+ elf_assert(_elf_init.e_magic == ELF_MAGIC);
+ if (_elf_version == EV_NONE) {
+ seterr(ERROR_VERSION_UNSET);
+ return NULL;
+ }
+ else if (cmd == ELF_C_NULL) {
+ return NULL;
+ }
+ else if (cmd == ELF_C_WRITE) {
+ ref = NULL;
+ }
+ else if (cmd != ELF_C_READ && cmd != ELF_C_RDWR) {
+ seterr(ERROR_INVALID_CMD);
+ return NULL;
+ }
+ else if (ref) {
+ elf_assert(ref->e_magic == ELF_MAGIC);
+ if (!ref->e_readable || (cmd == ELF_C_RDWR && !ref->e_writable)) {
+ seterr(ERROR_CMDMISMATCH);
+ return NULL;
+ }
+ if (ref->e_kind != ELF_K_AR) {
+ ref->e_count++;
+ return ref;
+ }
+ if (cmd == ELF_C_RDWR) {
+ seterr(ERROR_MEMBERWRITE);
+ return NULL;
+ }
+ if (ref->e_memory) {
+ fd = ref->e_fd;
+ }
+ else if (fd != ref->e_fd) {
+ seterr(ERROR_FDMISMATCH);
+ return NULL;
+ }
+ if (!(arhdr = _elf_arhdr(ref))) {
+ return NULL;
+ }
+ size = arhdr->ar_size;
+ }
+ else if ((off = lseek(fd, (off_t)0, SEEK_END)) == (off_t)-1
+ || (off_t)(size = off) != off) {
+ seterr(ERROR_IO_GETSIZE);
+ return NULL;
+ }
+
+ if (!(elf = (Elf*)malloc(sizeof(Elf)))) {
+ seterr(ERROR_MEM_ELF);
+ return NULL;
+ }
+ *elf = _elf_init;
+ elf->e_fd = fd;
+ elf->e_parent = ref;
+ elf->e_size = elf->e_dsize = size;
+
+ if (cmd != ELF_C_READ) {
+ elf->e_writable = 1;
+ }
+ if (cmd != ELF_C_WRITE) {
+ elf->e_readable = 1;
+ }
+ else {
+ return elf;
+ }
+
+ if (ref) {
+ size_t offset = ref->e_off + sizeof(struct ar_hdr);
+ Elf *xelf;
+
+ elf_assert(arhdr);
+ elf->e_arhdr = arhdr;
+ elf->e_base = ref->e_base + offset;
+ /*
+ * Share the archive's memory image. To avoid
+ * multiple independent elf descriptors if the
+ * same member is requested twice, scan the list
+ * of open members for duplicates.
+ *
+ * I don't know how SVR4 handles this case. Don't rely on it.
+ */
+ for (xelf = ref->e_members; xelf; xelf = xelf->e_link) {
+ elf_assert(xelf->e_parent == ref);
+ if (xelf->e_base == elf->e_base) {
+ free(arhdr);
+ free(elf);
+ xelf->e_count++;
+ return xelf;
+ }
+ }
+ if (size == 0) {
+ elf->e_data = NULL;
+ }
+#if 1
+ else {
+ /*
+ * Archive members may be misaligned. Freezing them will
+ * cause libelf to allocate buffers for translated data,
+ * which should be properly aligned in all cases.
+ */
+ elf_assert(!ref->e_cooked);
+ elf->e_data = elf->e_rawdata = ref->e_data + offset;
+ }
+#else
+ else if (ref->e_data == ref->e_rawdata) {
+ elf_assert(!ref->e_cooked);
+ /*
+ * archive is frozen - freeze member, too
+ */
+ elf->e_data = elf->e_rawdata = ref->e_data + offset;
+ }
+ else {
+ elf_assert(!ref->e_memory);
+ elf->e_data = ref->e_data + offset;
+ /*
+ * The member's memory image may have been modified if
+ * the member has been processed before. Since we need the
+ * original image, we have to re-read the archive file.
+ * Will fail if the archive's file descriptor is disabled.
+ */
+ if (!ref->e_cooked) {
+ ref->e_cooked = 1;
+ }
+ else if (!_elf_read(ref, elf->e_data, offset, size)) {
+ free(arhdr);
+ free(elf);
+ return NULL;
+ }
+ }
+#endif
+ elf->e_next = offset + size + (size & 1);
+ elf->e_disabled = ref->e_disabled;
+ elf->e_memory = ref->e_memory;
+ /* parent/child linking */
+ elf->e_link = ref->e_members;
+ ref->e_members = elf;
+ ref->e_count++;
+ /* Slowaris compatibility - do not rely on this! */
+ ref->e_off = elf->e_next;
+ }
+ else if (size) {
+#if HAVE_MMAP
+ /*
+ * Using mmap on writable files will interfere with elf_update
+ */
+ if (!elf->e_writable && (elf->e_data = _elf_mmap(elf))) {
+ elf->e_unmap_data = 1;
+ }
+ else
+#endif /* HAVE_MMAP */
+ if (!(elf->e_data = _elf_read(elf, NULL, 0, size))) {
+ free(elf);
+ return NULL;
+ }
+ }
+
+ _elf_check_type(elf, size);
+ return elf;
+}
+
+Elf*
+elf_memory(char *image, size_t size) {
+ Elf *elf;
+
+ elf_assert(_elf_init.e_magic == ELF_MAGIC);
+ if (_elf_version == EV_NONE) {
+ seterr(ERROR_VERSION_UNSET);
+ return NULL;
+ }
+ else if (size == 0 || image == NULL) {
+ /* TODO: set error code? */
+ return NULL;
+ }
+
+ if (!(elf = (Elf*)malloc(sizeof(Elf)))) {
+ seterr(ERROR_MEM_ELF);
+ return NULL;
+ }
+ *elf = _elf_init;
+ elf->e_size = elf->e_dsize = size;
+ elf->e_data = elf->e_rawdata = image;
+ elf->e_readable = 1;
+ elf->e_disabled = 1;
+ elf->e_memory = 1;
+
+ _elf_check_type(elf, size);
+ return elf;
+}
+
+#if __LIBELF64
+
+int
+gelf_getclass(Elf *elf) {
+ if (elf && elf->e_kind == ELF_K_ELF && valid_class(elf->e_class)) {
+ return elf->e_class;
+ }
+ return ELFCLASSNONE;
+}
+
+#endif /* __LIBELF64 */
diff --git a/lib/build.bat b/lib/build.bat
new file mode 100644
index 0000000..d930d71
--- /dev/null
+++ b/lib/build.bat
@@ -0,0 +1,36 @@
+@echo off
+
+rem lib/build.bat - build script for W32 port
+rem Copyright (C) 2004 - 2006 Michael Riepe
+rem
+rem This library is free software; you can redistribute it and/or
+rem modify it under the terms of the GNU Library General Public
+rem License as published by the Free Software Foundation; either
+rem version 2 of the License, or (at your option) any later version.
+rem
+rem This library is distributed in the hope that it will be useful,
+rem but WITHOUT ANY WARRANTY; without even the implied warranty of
+rem MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+rem Library General Public License for more details.
+rem
+rem You should have received a copy of the GNU Library General Public
+rem License along with this library; if not, write to the Free Software
+rem Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+rem @(#) $Id: build.bat,v 1.1 2006/08/21 18:03:48 michael Exp $
+
+rem *** BEGIN EDIT HERE ***
+rem Please uncomment the line that suits your system:
+rem call "C:\Program Files\Microsoft Visual Studio\VC98\bin\vcvars32.bat"
+rem call "C:\Program Files\Microsoft Visual Studio 8\VC\bin\vcvars32.bat"
+rem call "C:\Programme\Microsoft Visual Studio\VC98\bin\vcvars32.bat"
+rem call "C:\Programme\Microsoft Visual Studio 8\VC\bin\vcvars32.bat"
+rem OR, if you have to set the path to the compiler directly:
+rem set PATH="C:\PATH\TO\COMPILER\BINARY;%PATH%"
+rem Of course, you'll have to enter the correct path above.
+rem You may also have to change CC (default: cl.exe) in Makefile.w32.
+rem *** END EDIT HERE ***
+
+copy config.h.w32 config.h
+copy sys_elf.h.w32 sys_elf.h
+nmake /nologo /f Makefile.w32 %1
diff --git a/lib/byteswap.h b/lib/byteswap.h
new file mode 100644
index 0000000..7526d12
--- /dev/null
+++ b/lib/byteswap.h
@@ -0,0 +1,95 @@
+/*
+byteswap.h - functions and macros for byte swapping.
+Copyright (C) 1995 - 2001 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+/* @(#) $Id: byteswap.h,v 1.7 2008/05/23 08:15:34 michael Exp $ */
+
+#ifndef _BYTESWAP_H
+#define _BYTESWAP_H
+
+#define lu(from,i,s) (((__libelf_u32_t)((unsigned char*)(from))[i])<<(s))
+#define li(from,i,s) (((__libelf_i32_t)(( signed char*)(from))[i])<<(s))
+
+#define __load_u16L(from) ((__libelf_u32_t) \
+ (lu(from,1,8) | lu(from,0,0)))
+#define __load_u16M(from) ((__libelf_u32_t) \
+ (lu(from,0,8) | lu(from,1,0)))
+#define __load_i16L(from) ((__libelf_i32_t) \
+ (li(from,1,8) | lu(from,0,0)))
+#define __load_i16M(from) ((__libelf_i32_t) \
+ (li(from,0,8) | lu(from,1,0)))
+
+#define __load_u32L(from) ((__libelf_u32_t) \
+ (lu(from,3,24) | lu(from,2,16) | lu(from,1,8) | lu(from,0,0)))
+#define __load_u32M(from) ((__libelf_u32_t) \
+ (lu(from,0,24) | lu(from,1,16) | lu(from,2,8) | lu(from,3,0)))
+#define __load_i32L(from) ((__libelf_i32_t) \
+ (li(from,3,24) | lu(from,2,16) | lu(from,1,8) | lu(from,0,0)))
+#define __load_i32M(from) ((__libelf_i32_t) \
+ (li(from,0,24) | lu(from,1,16) | lu(from,2,8) | lu(from,3,0)))
+
+#define su(to,i,v,s) (((char*)(to))[i]=((__libelf_u32_t)(v)>>(s)))
+#define si(to,i,v,s) (((char*)(to))[i]=((__libelf_i32_t)(v)>>(s)))
+
+#define __store_u16L(to,v) \
+ (su(to,1,v,8), su(to,0,v,0))
+#define __store_u16M(to,v) \
+ (su(to,0,v,8), su(to,1,v,0))
+#define __store_i16L(to,v) \
+ (si(to,1,v,8), si(to,0,v,0))
+#define __store_i16M(to,v) \
+ (si(to,0,v,8), si(to,1,v,0))
+
+#define __store_u32L(to,v) \
+ (su(to,3,v,24), su(to,2,v,16), su(to,1,v,8), su(to,0,v,0))
+#define __store_u32M(to,v) \
+ (su(to,0,v,24), su(to,1,v,16), su(to,2,v,8), su(to,3,v,0))
+#define __store_i32L(to,v) \
+ (si(to,3,v,24), si(to,2,v,16), si(to,1,v,8), si(to,0,v,0))
+#define __store_i32M(to,v) \
+ (si(to,0,v,24), si(to,1,v,16), si(to,2,v,8), si(to,3,v,0))
+
+#if __LIBELF64
+
+/*
+ * conversion functions from swap64.c
+ */
+extern __libelf_u64_t _elf_load_u64L(const unsigned char *from);
+extern __libelf_u64_t _elf_load_u64M(const unsigned char *from);
+extern __libelf_i64_t _elf_load_i64L(const unsigned char *from);
+extern __libelf_i64_t _elf_load_i64M(const unsigned char *from);
+extern void _elf_store_u64L(unsigned char *to, __libelf_u64_t v);
+extern void _elf_store_u64M(unsigned char *to, __libelf_u64_t v);
+extern void _elf_store_i64L(unsigned char *to, __libelf_u64_t v);
+extern void _elf_store_i64M(unsigned char *to, __libelf_u64_t v);
+
+/*
+ * aliases for existing conversion code
+ */
+#define __load_u64L _elf_load_u64L
+#define __load_u64M _elf_load_u64M
+#define __load_i64L _elf_load_i64L
+#define __load_i64M _elf_load_i64M
+#define __store_u64L _elf_store_u64L
+#define __store_u64M _elf_store_u64M
+#define __store_i64L _elf_store_i64L
+#define __store_i64M _elf_store_i64M
+
+#endif /* __LIBELF64 */
+
+#endif /* _BYTESWAP_H */
diff --git a/lib/checksum.c b/lib/checksum.c
new file mode 100644
index 0000000..f9e964b
--- /dev/null
+++ b/lib/checksum.c
@@ -0,0 +1,178 @@
+/*
+checksum.c - implementation of the elf{32,64}_checksum(3) functions.
+Copyright (C) 1995 - 2001 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: checksum.c,v 1.7 2008/05/23 08:15:34 michael Exp $";
+#endif /* lint */
+
+/*
+ * Compatibility note:
+ *
+ * The algorithm used in {elf32,elf64,gelf}_checksum() does not seem to
+ * be documented. I hope I got it right. My implementation does the
+ * following:
+ *
+ * - skip sections that do not have the SHF_ALLOC flag set
+ * - skip sections of type SHT_NULL, SHT_NOBITS, SHT_DYNSYM and
+ * SHT_DYNAMIC
+ * - add all data bytes from the remaining sections, modulo 2**32
+ * - add upper and lower half of the result
+ * - subtract 0xffff if the result is > 0xffff
+ * - if any error occurs, return 0L
+ */
+
+static int
+skip_section(Elf_Scn *scn, unsigned cls) {
+ if (cls == ELFCLASS32) {
+ Elf32_Shdr *shdr = &scn->s_shdr32;
+
+ if (!(shdr->sh_flags & SHF_ALLOC)) {
+ return 1;
+ }
+ switch (shdr->sh_type) {
+ case SHT_NULL:
+ case SHT_NOBITS:
+ /* Solaris seems to ignore these, too */
+ case SHT_DYNSYM:
+ case SHT_DYNAMIC:
+ return 1;
+ }
+ }
+#if __LIBELF64
+ else if (cls == ELFCLASS64) {
+ Elf64_Shdr *shdr = &scn->s_shdr64;
+
+ if (!(shdr->sh_flags & SHF_ALLOC)) {
+ return 1;
+ }
+ switch (shdr->sh_type) {
+ case SHT_NULL:
+ case SHT_NOBITS:
+ /* Solaris seems to ignore these, too */
+ case SHT_DYNSYM:
+ case SHT_DYNAMIC:
+ return 1;
+ }
+ }
+#endif /* __LIBELF64 */
+ else {
+ seterr(ERROR_UNIMPLEMENTED);
+ }
+ return 0;
+}
+
+static long
+add_bytes(unsigned char *ptr, size_t len) {
+ long csum = 0;
+
+ while (len--) {
+ csum += *ptr++;
+ }
+ return csum;
+}
+
+static long
+_elf_csum(Elf *elf) {
+ long csum = 0;
+ Elf_Data *data;
+ Elf_Scn *scn;
+
+ if (!elf->e_ehdr && !_elf_cook(elf)) {
+ /* propagate errors from _elf_cook */
+ return 0L;
+ }
+ seterr(0);
+ for (scn = elf->e_scn_1; scn; scn = scn->s_link) {
+ if (scn->s_index == SHN_UNDEF || skip_section(scn, elf->e_class)) {
+ continue;
+ }
+ data = NULL;
+ while ((data = elf_getdata(scn, data))) {
+ if (data->d_size) {
+ if (data->d_buf == NULL) {
+ seterr(ERROR_NULLBUF);
+ return 0L;
+ }
+ csum += add_bytes(data->d_buf, data->d_size);
+ }
+ }
+ }
+ if (_elf_errno) {
+ return 0L;
+ }
+ csum = (csum & 0xffff) + ((csum >> 16) & 0xffff);
+ if (csum > 0xffff) {
+ csum -= 0xffff;
+ }
+ return csum;
+}
+
+long
+elf32_checksum(Elf *elf) {
+ if (elf) {
+ if (elf->e_kind != ELF_K_ELF) {
+ seterr(ERROR_NOTELF);
+ }
+ else if (elf->e_class != ELFCLASS32) {
+ seterr(ERROR_CLASSMISMATCH);
+ }
+ else {
+ return _elf_csum(elf);
+ }
+ }
+ return 0L;
+}
+
+#if __LIBELF64
+
+long
+elf64_checksum(Elf *elf) {
+ if (elf) {
+ if (elf->e_kind != ELF_K_ELF) {
+ seterr(ERROR_NOTELF);
+ }
+ else if (elf->e_class != ELFCLASS64) {
+ seterr(ERROR_CLASSMISMATCH);
+ }
+ else {
+ return _elf_csum(elf);
+ }
+ }
+ return 0L;
+}
+
+long
+gelf_checksum(Elf *elf) {
+ if (elf) {
+ if (elf->e_kind != ELF_K_ELF) {
+ seterr(ERROR_NOTELF);
+ }
+ else if (!valid_class(elf->e_class)) {
+ seterr(ERROR_UNKNOWN_CLASS);
+ }
+ else {
+ return _elf_csum(elf);
+ }
+ }
+ return 0L;
+}
+
+#endif /* __LIBELF64 */
diff --git a/lib/cntl.c b/lib/cntl.c
new file mode 100644
index 0000000..3f7c5d4
--- /dev/null
+++ b/lib/cntl.c
@@ -0,0 +1,71 @@
+/*
+cntl.c - implementation of the elf_cntl(3) function.
+Copyright (C) 1995 - 1998 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: cntl.c,v 1.7 2008/05/23 08:15:34 michael Exp $";
+#endif /* lint */
+
+int
+elf_cntl(Elf *elf, Elf_Cmd cmd) {
+ Elf_Scn *scn;
+ Elf *child;
+
+ if (!elf) {
+ return -1;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ if (cmd == ELF_C_FDREAD) {
+ if (!elf->e_readable) {
+ seterr(ERROR_WRONLY);
+ return -1;
+ }
+ }
+ else if (cmd != ELF_C_FDDONE) {
+ seterr(ERROR_INVALID_CMD);
+ return -1;
+ }
+ if (elf->e_disabled) {
+ return 0;
+ }
+ if (elf->e_kind == ELF_K_AR) {
+ for (child = elf->e_members; child; child = child->e_link) {
+ elf_assert(elf == child->e_parent);
+ if (elf_cntl(child, cmd)) {
+ return -1;
+ }
+ }
+ }
+ else if (elf->e_kind == ELF_K_ELF && cmd == ELF_C_FDREAD) {
+ if (!elf->e_ehdr && !_elf_cook(elf)) {
+ return -1;
+ }
+ for (scn = elf->e_scn_1; scn; scn = scn->s_link) {
+ if (scn->s_index == SHN_UNDEF || scn->s_type == SHT_NULL) {
+ continue;
+ }
+ else if (!elf_getdata(scn, NULL)) {
+ return -1;
+ }
+ }
+ }
+ elf->e_disabled = 1;
+ return 0;
+}
diff --git a/lib/config.h.w32 b/lib/config.h.w32
new file mode 100644
index 0000000..c4ec0f7
--- /dev/null
+++ b/lib/config.h.w32
@@ -0,0 +1,161 @@
+/*
+ * lib/config.h.w32 - configuration file for W32 port
+ * Copyright (C) 2004 - 2006 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * @(#) $Id: config.h.w32,v 1.2 2006/09/07 15:55:42 michael Exp $
+ */
+
+/* Define to empty if the keyword does not work. */
+#undef const
+
+/* Define if you have a working `mmap' system call. */
+#undef HAVE_MMAP
+
+/* Define to `long' if <sys/types.h> doesn't define. */
+#undef off_t
+
+/* Define to `unsigned' if <sys/types.h> doesn't define. */
+#undef size_t
+
+/* Define if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Define if you want to include extra debugging code */
+#define ENABLE_DEBUG 1
+
+/* Define if memmove() does not copy overlapping arrays correctly */
+#undef HAVE_BROKEN_MEMMOVE
+
+/* Define if you have the catgets function. */
+#undef HAVE_CATGETS
+
+/* Define if you have the dgettext function. */
+#undef HAVE_DGETTEXT
+
+/* Define if you have the memset function. */
+#define HAVE_MEMSET 1
+
+/* Define if struct nlist is declared in <elf.h> or <sys/elf.h> */
+#undef HAVE_STRUCT_NLIST_DECLARATION
+
+/* Define if Elf32_Dyn is declared in <link.h> */
+#undef __LIBELF_NEED_LINK_H
+
+/* Define if Elf32_Dyn is declared in <sys/link.h> */
+#undef __LIBELF_NEED_SYS_LINK_H
+
+/* Define to `<elf.h>' or `<sys/elf.h>' if one of them is present */
+#undef __LIBELF_HEADER_ELF_H
+
+/* Define if you want 64-bit support (and your system supports it) */
+#define __LIBELF64 1
+
+/* Define if you want 64-bit support, and are running IRIX */
+#undef __LIBELF64_IRIX
+
+/* Define if you want 64-bit support, and are running Linux */
+#undef __LIBELF64_LINUX
+
+/* Define if you want symbol versioning (and your system supports it) */
+#define __LIBELF_SYMBOL_VERSIONS 1
+
+/* Define if symbol versioning uses Sun section type (SHT_SUNW_*) */
+#define __LIBELF_SUN_SYMBOL_VERSIONS 1
+
+/* Define if symbol versioning uses GNU section types (SHT_GNU_*) */
+#undef __LIBELF_GNU_SYMBOL_VERSIONS
+
+/* Define to a 64-bit signed integer type if one exists */
+#define __libelf_i64_t __int64
+
+/* Define to a 64-bit unsigned integer type if one exists */
+#define __libelf_u64_t unsigned __int64
+
+/* Define to a 32-bit signed integer type if one exists */
+#define __libelf_i32_t int
+
+/* Define to a 32-bit unsigned integer type if one exists */
+#define __libelf_u32_t unsigned int
+
+/* Define to a 16-bit signed integer type if one exists */
+#define __libelf_i16_t short int
+
+/* Define to a 16-bit unsigned integer type if one exists */
+#define __libelf_u16_t unsigned short int
+
+/* The number of bytes in a __int64. */
+#define SIZEOF___INT64 8
+
+/* The number of bytes in a int. */
+#define SIZEOF_INT 4
+
+/* The number of bytes in a long. */
+#define SIZEOF_LONG 4
+
+/* The number of bytes in a long long. */
+#define SIZEOF_LONG_LONG 0
+
+/* The number of bytes in a short. */
+#define SIZEOF_SHORT 2
+
+/* Define if you have the ftruncate function. */
+#undef HAVE_FTRUNCATE
+
+/* Define if you have the getpagesize function. */
+#undef HAVE_GETPAGESIZE
+
+/* Define if you have the memcmp function. */
+#define HAVE_MEMCMP 1
+
+/* Define if you have the memcpy function. */
+#define HAVE_MEMCPY 1
+
+/* Define if you have the memmove function. */
+#define HAVE_MEMMOVE 1
+
+/* Define if you have the memset function. */
+#define HAVE_MEMSET 1
+
+/* Define if you have the <ar.h> header file. */
+#undef HAVE_AR_H
+
+/* Define if you have the <elf.h> header file. */
+#undef HAVE_ELF_H
+
+/* Define if you have the <fcntl.h> header file. */
+#undef HAVE_FCNTL_H
+
+/* Define if you have the <gelf.h> header file. */
+#undef HAVE_GELF_H
+
+/* Define if you have the <libelf.h> header file. */
+#undef HAVE_LIBELF_H
+
+/* Define if you have the <link.h> header file. */
+#undef HAVE_LINK_H
+
+/* Define if you have the <nlist.h> header file. */
+#undef HAVE_NLIST_H
+
+/* Define if you have the <sys/elf.h> header file. */
+#undef HAVE_SYS_ELF_H
+
+/* Define if you have the <sys/link.h> header file. */
+#undef HAVE_SYS_LINK_H
+
+/* Define if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
diff --git a/lib/cook.c b/lib/cook.c
new file mode 100644
index 0000000..066b6f2
--- /dev/null
+++ b/lib/cook.c
@@ -0,0 +1,501 @@
+/*
+ * cook.c - read and translate ELF files.
+ * Copyright (C) 1995 - 2006 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: cook.c,v 1.29 2008/05/23 08:15:34 michael Exp $";
+#endif /* lint */
+
+const Elf_Scn _elf_scn_init = INIT_SCN;
+const Scn_Data _elf_data_init = INIT_DATA;
+
+Elf_Type
+_elf_scn_type(unsigned t) {
+ switch (t) {
+ case SHT_DYNAMIC: return ELF_T_DYN;
+ case SHT_DYNSYM: return ELF_T_SYM;
+ case SHT_HASH: return ELF_T_WORD;
+ case SHT_REL: return ELF_T_REL;
+ case SHT_RELA: return ELF_T_RELA;
+ case SHT_SYMTAB: return ELF_T_SYM;
+ case SHT_SYMTAB_SHNDX: return ELF_T_WORD; /* XXX: really? */
+#if __LIBELF_SYMBOL_VERSIONS
+#if __LIBELF_SUN_SYMBOL_VERSIONS
+ case SHT_SUNW_verdef: return ELF_T_VDEF;
+ case SHT_SUNW_verneed: return ELF_T_VNEED;
+ case SHT_SUNW_versym: return ELF_T_HALF;
+#else /* __LIBELF_SUN_SYMBOL_VERSIONS */
+ case SHT_GNU_verdef: return ELF_T_VDEF;
+ case SHT_GNU_verneed: return ELF_T_VNEED;
+ case SHT_GNU_versym: return ELF_T_HALF;
+#endif /* __LIBELF_SUN_SYMBOL_VERSIONS */
+#endif /* __LIBELF_SYMBOL_VERSIONS */
+ }
+ return ELF_T_BYTE;
+}
+
+/*
+ * Check for overflow on 32-bit systems
+ */
+#define overflow(a,b,t) (sizeof(a) < sizeof(t) && (t)(a) != (b))
+
+#define truncerr(t) ((t)==ELF_T_EHDR?ERROR_TRUNC_EHDR: \
+ ((t)==ELF_T_PHDR?ERROR_TRUNC_PHDR: \
+ ERROR_INTERNAL))
+#define memerr(t) ((t)==ELF_T_EHDR?ERROR_MEM_EHDR: \
+ ((t)==ELF_T_PHDR?ERROR_MEM_PHDR: \
+ ERROR_INTERNAL))
+
+Elf_Data*
+_elf_xlatetom(const Elf *elf, Elf_Data *dst, const Elf_Data *src) {
+ if (elf->e_class == ELFCLASS32) {
+ return elf32_xlatetom(dst, src, elf->e_encoding);
+ }
+#if __LIBELF64
+ else if (elf->e_class == ELFCLASS64) {
+ return elf64_xlatetom(dst, src, elf->e_encoding);
+ }
+#endif /* __LIBELF64 */
+ seterr(ERROR_UNIMPLEMENTED);
+ return NULL;
+}
+
+static char*
+_elf_item(void *buf, Elf *elf, Elf_Type type, size_t off) {
+ Elf_Data src, dst;
+
+ elf_assert(valid_type(type));
+ if (off < 0 || off > elf->e_size) {
+ seterr(ERROR_OUTSIDE);
+ return NULL;
+ }
+
+ src.d_type = type;
+ src.d_version = elf->e_version;
+ src.d_size = _fsize(elf->e_class, src.d_version, type);
+ elf_assert(src.d_size);
+ if ((elf->e_size - off) < src.d_size) {
+ seterr(truncerr(type));
+ return NULL;
+ }
+
+ dst.d_version = _elf_version;
+ dst.d_size = _msize(elf->e_class, dst.d_version, type);
+ elf_assert(dst.d_size);
+
+ if (!(dst.d_buf = buf) && !(dst.d_buf = malloc(dst.d_size))) {
+ seterr(memerr(type));
+ return NULL;
+ }
+
+ elf_assert(elf->e_data);
+ if (elf->e_rawdata) {
+ src.d_buf = elf->e_rawdata + off;
+ }
+ else {
+ src.d_buf = elf->e_data + off;
+ }
+
+ if (_elf_xlatetom(elf, &dst, &src)) {
+ return (char*)dst.d_buf;
+ }
+ if (dst.d_buf != buf) {
+ free(dst.d_buf);
+ }
+ return NULL;
+}
+
+static int
+_elf_cook_phdr(Elf *elf) {
+ size_t num, off, entsz;
+
+ if (elf->e_class == ELFCLASS32) {
+ num = ((Elf32_Ehdr*)elf->e_ehdr)->e_phnum;
+ off = ((Elf32_Ehdr*)elf->e_ehdr)->e_phoff;
+ entsz = ((Elf32_Ehdr*)elf->e_ehdr)->e_phentsize;
+ }
+#if __LIBELF64
+ else if (elf->e_class == ELFCLASS64) {
+ num = ((Elf64_Ehdr*)elf->e_ehdr)->e_phnum;
+ off = ((Elf64_Ehdr*)elf->e_ehdr)->e_phoff;
+ entsz = ((Elf64_Ehdr*)elf->e_ehdr)->e_phentsize;
+ /*
+ * Check for overflow on 32-bit systems
+ */
+ if (overflow(off, ((Elf64_Ehdr*)elf->e_ehdr)->e_phoff, Elf64_Off)) {
+ seterr(ERROR_OUTSIDE);
+ return 0;
+ }
+ }
+#endif /* __LIBELF64 */
+ else {
+ seterr(ERROR_UNIMPLEMENTED);
+ return 0;
+ }
+ if (off) {
+ Elf_Scn *scn;
+ size_t size;
+ unsigned i;
+ char *p;
+
+ if (num == PN_XNUM) {
+ /*
+ * Overflow in ehdr->e_phnum.
+ * Get real value from first SHDR.
+ */
+ if (!(scn = elf->e_scn_1)) {
+ seterr(ERROR_NOSUCHSCN);
+ return 0;
+ }
+ if (elf->e_class == ELFCLASS32) {
+ num = scn->s_shdr32.sh_info;
+ }
+#if __LIBELF64
+ else if (elf->e_class == ELFCLASS64) {
+ num = scn->s_shdr64.sh_info;
+ }
+#endif /* __LIBELF64 */
+ /* we already had this
+ else {
+ seterr(ERROR_UNIMPLEMENTED);
+ return 0;
+ }
+ */
+ }
+
+ size = _fsize(elf->e_class, elf->e_version, ELF_T_PHDR);
+ elf_assert(size);
+#if ENABLE_EXTENDED_FORMAT
+ if (entsz < size) {
+#else /* ENABLE_EXTENDED_FORMAT */
+ if (entsz != size) {
+#endif /* ENABLE_EXTENDED_FORMAT */
+ seterr(ERROR_EHDR_PHENTSIZE);
+ return 0;
+ }
+ size = _msize(elf->e_class, _elf_version, ELF_T_PHDR);
+ elf_assert(size);
+ if (!(p = malloc(num * size))) {
+ seterr(memerr(ELF_T_PHDR));
+ return 0;
+ }
+ for (i = 0; i < num; i++) {
+ if (!_elf_item(p + i * size, elf, ELF_T_PHDR, off + i * entsz)) {
+ free(p);
+ return 0;
+ }
+ }
+ elf->e_phdr = p;
+ elf->e_phnum = num;
+ }
+ return 1;
+}
+
+static int
+_elf_cook_shdr(Elf *elf) {
+ size_t num, off, entsz;
+
+ if (elf->e_class == ELFCLASS32) {
+ num = ((Elf32_Ehdr*)elf->e_ehdr)->e_shnum;
+ off = ((Elf32_Ehdr*)elf->e_ehdr)->e_shoff;
+ entsz = ((Elf32_Ehdr*)elf->e_ehdr)->e_shentsize;
+ }
+#if __LIBELF64
+ else if (elf->e_class == ELFCLASS64) {
+ num = ((Elf64_Ehdr*)elf->e_ehdr)->e_shnum;
+ off = ((Elf64_Ehdr*)elf->e_ehdr)->e_shoff;
+ entsz = ((Elf64_Ehdr*)elf->e_ehdr)->e_shentsize;
+ /*
+ * Check for overflow on 32-bit systems
+ */
+ if (overflow(off, ((Elf64_Ehdr*)elf->e_ehdr)->e_shoff, Elf64_Off)) {
+ seterr(ERROR_OUTSIDE);
+ return 0;
+ }
+ }
+#endif /* __LIBELF64 */
+ else {
+ seterr(ERROR_UNIMPLEMENTED);
+ return 0;
+ }
+ if (off) {
+ struct tmp {
+ Elf_Scn scn;
+ Scn_Data data;
+ } *head;
+ Elf_Data src, dst;
+ Elf_Scn *scn;
+ Scn_Data *sd;
+ unsigned i;
+
+ if (off < 0 || off > elf->e_size) {
+ seterr(ERROR_OUTSIDE);
+ return 0;
+ }
+
+ src.d_type = ELF_T_SHDR;
+ src.d_version = elf->e_version;
+ src.d_size = _fsize(elf->e_class, src.d_version, ELF_T_SHDR);
+ elf_assert(src.d_size);
+#if ENABLE_EXTENDED_FORMAT
+ if (entsz < src.d_size) {
+#else /* ENABLE_EXTENDED_FORMAT */
+ if (entsz != src.d_size) {
+#endif /* ENABLE_EXTENDED_FORMAT */
+ seterr(ERROR_EHDR_SHENTSIZE);
+ return 0;
+ }
+ dst.d_version = EV_CURRENT;
+
+ if (num == 0) {
+ union {
+ Elf32_Shdr sh32;
+#if __LIBELF64
+ Elf64_Shdr sh64;
+#endif /* __LIBELF64 */
+ } u;
+
+ /*
+ * Overflow in ehdr->e_shnum.
+ * Get real value from first SHDR.
+ */
+ if (elf->e_size - off < entsz) {
+ seterr(ERROR_TRUNC_SHDR);
+ return 0;
+ }
+ if (elf->e_rawdata) {
+ src.d_buf = elf->e_rawdata + off;
+ }
+ else {
+ src.d_buf = elf->e_data + off;
+ }
+ dst.d_buf = &u;
+ dst.d_size = sizeof(u);
+ if (!_elf_xlatetom(elf, &dst, &src)) {
+ return 0;
+ }
+ elf_assert(dst.d_size == _msize(elf->e_class, EV_CURRENT, ELF_T_SHDR));
+ elf_assert(dst.d_type == ELF_T_SHDR);
+ if (elf->e_class == ELFCLASS32) {
+ num = u.sh32.sh_size;
+ }
+#if __LIBELF64
+ else if (elf->e_class == ELFCLASS64) {
+ num = u.sh64.sh_size;
+ /*
+ * Check for overflow on 32-bit systems
+ */
+ if (overflow(num, u.sh64.sh_size, Elf64_Xword)) {
+ seterr(ERROR_OUTSIDE);
+ return 0;
+ }
+ }
+#endif /* __LIBELF64 */
+ }
+
+ if ((elf->e_size - off) / entsz < num) {
+ seterr(ERROR_TRUNC_SHDR);
+ return 0;
+ }
+
+ if (!(head = (struct tmp*)malloc(num * sizeof(struct tmp)))) {
+ seterr(ERROR_MEM_SCN);
+ return 0;
+ }
+ for (scn = NULL, i = num; i-- > 0; ) {
+ head[i].scn = _elf_scn_init;
+ head[i].data = _elf_data_init;
+ head[i].scn.s_link = scn;
+ if (!scn) {
+ elf->e_scn_n = &head[i].scn;
+ }
+ scn = &head[i].scn;
+ sd = &head[i].data;
+
+ if (elf->e_rawdata) {
+ src.d_buf = elf->e_rawdata + off + i * entsz;
+ }
+ else {
+ src.d_buf = elf->e_data + off + i * entsz;
+ }
+ dst.d_buf = &scn->s_uhdr;
+ dst.d_size = sizeof(scn->s_uhdr);
+ if (!_elf_xlatetom(elf, &dst, &src)) {
+ elf->e_scn_n = NULL;
+ free(head);
+ return 0;
+ }
+ elf_assert(dst.d_size == _msize(elf->e_class, EV_CURRENT, ELF_T_SHDR));
+ elf_assert(dst.d_type == ELF_T_SHDR);
+
+ scn->s_elf = elf;
+ scn->s_index = i;
+ scn->s_data_1 = sd;
+ scn->s_data_n = sd;
+
+ sd->sd_scn = scn;
+
+ if (elf->e_class == ELFCLASS32) {
+ Elf32_Shdr *shdr = &scn->s_shdr32;
+
+ scn->s_type = shdr->sh_type;
+ scn->s_size = shdr->sh_size;
+ scn->s_offset = shdr->sh_offset;
+ sd->sd_data.d_align = shdr->sh_addralign;
+ sd->sd_data.d_type = _elf_scn_type(scn->s_type);
+ }
+#if __LIBELF64
+ else if (elf->e_class == ELFCLASS64) {
+ Elf64_Shdr *shdr = &scn->s_shdr64;
+
+ scn->s_type = shdr->sh_type;
+ scn->s_size = shdr->sh_size;
+ scn->s_offset = shdr->sh_offset;
+ sd->sd_data.d_align = shdr->sh_addralign;
+ /*
+ * Check for overflow on 32-bit systems
+ */
+ if (overflow(scn->s_size, shdr->sh_size, Elf64_Xword)
+ || overflow(scn->s_offset, shdr->sh_offset, Elf64_Off)
+ || overflow(sd->sd_data.d_align, shdr->sh_addralign, Elf64_Xword)) {
+ seterr(ERROR_OUTSIDE);
+ return 0;
+ }
+ sd->sd_data.d_type = _elf_scn_type(scn->s_type);
+ /*
+ * QUIRKS MODE:
+ *
+ * Some 64-bit architectures use 64-bit entries in the
+ * .hash section. This violates the ELF standard, and
+ * should be fixed. It's mostly harmless as long as the
+ * binary and the machine running your program have the
+ * same byte order, but you're in trouble if they don't,
+ * and if the entry size is wrong.
+ *
+ * As a workaround, I let libelf guess the right size
+ * for the binary. This relies pretty much on the fact
+ * that the binary provides correct data in the section
+ * headers. If it doesn't, it's probably broken anyway.
+ * Therefore, libelf uses a standard conforming value
+ * when it's not absolutely sure.
+ */
+ if (scn->s_type == SHT_HASH) {
+ int override = 0;
+
+ /*
+ * sh_entsize must reflect the entry size
+ */
+ if (shdr->sh_entsize == ELF64_FSZ_ADDR) {
+ override++;
+ }
+ /*
+ * sh_size must be a multiple of sh_entsize
+ */
+ if (shdr->sh_size % ELF64_FSZ_ADDR == 0) {
+ override++;
+ }
+ /*
+ * There must be room for at least 2 entries
+ */
+ if (shdr->sh_size >= 2 * ELF64_FSZ_ADDR) {
+ override++;
+ }
+ /*
+ * sh_addralign must be correctly set
+ */
+ if (shdr->sh_addralign == ELF64_FSZ_ADDR) {
+ override++;
+ }
+ /*
+ * The section must be properly aligned
+ */
+ if (shdr->sh_offset % ELF64_FSZ_ADDR == 0) {
+ override++;
+ }
+ /* XXX: also look at the data? */
+ /*
+ * Make a conservative decision...
+ */
+ if (override >= 5) {
+ sd->sd_data.d_type = ELF_T_ADDR;
+ }
+ }
+ /*
+ * END QUIRKS MODE.
+ */
+ }
+#endif /* __LIBELF64 */
+ /* we already had this
+ else {
+ seterr(ERROR_UNIMPLEMENTED);
+ return 0;
+ }
+ */
+
+ sd->sd_data.d_size = scn->s_size;
+ sd->sd_data.d_version = _elf_version;
+ }
+ elf_assert(scn == &head[0].scn);
+ elf->e_scn_1 = &head[0].scn;
+ head[0].scn.s_freeme = 1;
+ }
+ return 1;
+}
+
+static int
+_elf_cook_file(Elf *elf) {
+ elf->e_ehdr = _elf_item(NULL, elf, ELF_T_EHDR, 0);
+ if (!elf->e_ehdr) {
+ return 0;
+ }
+ /*
+ * Note: _elf_cook_phdr may require the first section header!
+ */
+ if (!_elf_cook_shdr(elf)) {
+ return 0;
+ }
+ if (!_elf_cook_phdr(elf)) {
+ return 0;
+ }
+ return 1;
+}
+
+int
+_elf_cook(Elf *elf) {
+ elf_assert(_elf_scn_init.s_magic == SCN_MAGIC);
+ elf_assert(_elf_data_init.sd_magic == DATA_MAGIC);
+ elf_assert(elf);
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ elf_assert(elf->e_kind == ELF_K_ELF);
+ elf_assert(!elf->e_ehdr);
+ if (!valid_version(elf->e_version)) {
+ seterr(ERROR_UNKNOWN_VERSION);
+ }
+ else if (!valid_encoding(elf->e_encoding)) {
+ seterr(ERROR_UNKNOWN_ENCODING);
+ }
+ else if (valid_class(elf->e_class)) {
+ return _elf_cook_file(elf);
+ }
+ else {
+ seterr(ERROR_UNKNOWN_CLASS);
+ }
+ return 0;
+}
diff --git a/lib/data.c b/lib/data.c
new file mode 100644
index 0000000..53d78c3
--- /dev/null
+++ b/lib/data.c
@@ -0,0 +1,36 @@
+/*
+ * data.c - libelf internal variables.
+ * Copyright (C) 1995 - 1998, 2007 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: data.c,v 1.8 2008/05/23 08:15:34 michael Exp $";
+#endif /* lint */
+
+unsigned _elf_version = EV_NONE;
+int _elf_errno = 0;
+int _elf_fill = 0;
+
+#if ENABLE_SANITY_CHECKS
+#define SANITY_CHECKS -1
+#else
+#define SANITY_CHECKS 0
+#endif
+
+int _elf_sanity_checks = SANITY_CHECKS;
diff --git a/lib/elf_repl.h b/lib/elf_repl.h
new file mode 100644
index 0000000..c5cf90f
--- /dev/null
+++ b/lib/elf_repl.h
@@ -0,0 +1,996 @@
+/*
+ * elf_repl.h - public header file for systems that lack it.
+ * Copyright (C) 1995 - 2006 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+/* @(#) $Id: elf_repl.h,v 1.22 2009/11/01 13:04:19 michael Exp $ */
+
+/*
+ * NEVER INCLUDE THIS FILE DIRECTLY - USE <libelf.h> INSTEAD!
+ */
+
+#ifndef _ELF_REPL_H
+#define _ELF_REPL_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/*
+ * Scalar data types
+ */
+typedef __libelf_u32_t Elf32_Addr;
+typedef __libelf_u16_t Elf32_Half;
+typedef __libelf_u32_t Elf32_Off;
+typedef __libelf_i32_t Elf32_Sword;
+typedef __libelf_u32_t Elf32_Word;
+
+#define ELF32_FSZ_ADDR 4
+#define ELF32_FSZ_HALF 2
+#define ELF32_FSZ_OFF 4
+#define ELF32_FSZ_SWORD 4
+#define ELF32_FSZ_WORD 4
+
+#if __LIBELF64
+
+typedef __libelf_u64_t Elf64_Addr;
+typedef __libelf_u16_t Elf64_Half;
+typedef __libelf_u64_t Elf64_Off;
+typedef __libelf_i32_t Elf64_Sword;
+typedef __libelf_u32_t Elf64_Word;
+typedef __libelf_i64_t Elf64_Sxword;
+typedef __libelf_u64_t Elf64_Xword;
+
+#define ELF64_FSZ_ADDR 8
+#define ELF64_FSZ_HALF 2
+#define ELF64_FSZ_OFF 8
+#define ELF64_FSZ_SWORD 4
+#define ELF64_FSZ_WORD 4
+#define ELF64_FSZ_SXWORD 8
+#define ELF64_FSZ_XWORD 8
+
+/*
+ * Blame Sun for this...
+ */
+typedef __libelf_u64_t Elf64_Lword;
+typedef __libelf_u64_t Elf32_Lword;
+
+#endif /* __LIBELF64 */
+
+/*
+ * ELF header
+ */
+#define EI_NIDENT 16
+
+typedef struct {
+ unsigned char e_ident[EI_NIDENT];
+ Elf32_Half e_type;
+ Elf32_Half e_machine;
+ Elf32_Word e_version;
+ Elf32_Addr e_entry;
+ Elf32_Off e_phoff;
+ Elf32_Off e_shoff;
+ Elf32_Word e_flags;
+ Elf32_Half e_ehsize;
+ Elf32_Half e_phentsize;
+ Elf32_Half e_phnum;
+ Elf32_Half e_shentsize;
+ Elf32_Half e_shnum;
+ Elf32_Half e_shstrndx;
+} Elf32_Ehdr;
+
+#if __LIBELF64
+typedef struct {
+ unsigned char e_ident[EI_NIDENT];
+ Elf64_Half e_type;
+ Elf64_Half e_machine;
+ Elf64_Word e_version;
+ Elf64_Addr e_entry;
+ Elf64_Off e_phoff;
+ Elf64_Off e_shoff;
+ Elf64_Word e_flags;
+ Elf64_Half e_ehsize;
+ Elf64_Half e_phentsize;
+ Elf64_Half e_phnum;
+ Elf64_Half e_shentsize;
+ Elf64_Half e_shnum;
+ Elf64_Half e_shstrndx;
+} Elf64_Ehdr;
+#endif /* __LIBELF64 */
+
+/*
+ * e_ident
+ */
+#define EI_MAG0 0
+#define EI_MAG1 1
+#define EI_MAG2 2
+#define EI_MAG3 3
+#define EI_CLASS 4
+#define EI_DATA 5
+#define EI_VERSION 6
+#define EI_OSABI 7
+#define EI_ABIVERSION 8
+#define EI_PAD 9
+
+#define ELFMAG0 0x7f
+#define ELFMAG1 'E'
+#define ELFMAG2 'L'
+#define ELFMAG3 'F'
+#define ELFMAG "\177ELF"
+#define SELFMAG 4
+
+/*
+ * e_ident[EI_CLASS]
+ */
+#define ELFCLASSNONE 0
+#define ELFCLASS32 1
+#define ELFCLASS64 2
+#define ELFCLASSNUM 3
+
+/*
+ * e_ident[EI_DATA]
+ */
+#define ELFDATANONE 0
+#define ELFDATA2LSB 1
+#define ELFDATA2MSB 2
+#define ELFDATANUM 3
+
+/*
+ * e_ident[EI_OSABI]
+ */
+#define ELFOSABI_NONE 0 /* No extensions or unspecified */
+#define ELFOSABI_SYSV ELFOSABI_NONE
+#define ELFOSABI_HPUX 1 /* Hewlett-Packard HP-UX */
+#define ELFOSABI_NETBSD 2 /* NetBSD */
+#define ELFOSABI_LINUX 3 /* Linux */
+#define ELFOSABI_SOLARIS 6 /* Sun Solaris */
+#define ELFOSABI_AIX 7 /* AIX */
+#define ELFOSABI_IRIX 8 /* IRIX */
+#define ELFOSABI_FREEBSD 9 /* FreeBSD */
+#define ELFOSABI_TRU64 10 /* Compaq TRU64 UNIX */
+#define ELFOSABI_MODESTO 11 /* Novell Modesto */
+#define ELFOSABI_OPENBSD 12 /* Open BSD */
+#define ELFOSABI_OPENVMS 13 /* Open VMS */
+#define ELFOSABI_NSK 14 /* Hewlett-Packard Non-Stop Kernel */
+#define ELFOSABI_AROS 15 /* Amiga Research OS */
+/* these are probably obsolete: */
+#define ELFOSABI_ARM 97 /* ARM */
+#define ELFOSABI_STANDALONE 255 /* standalone (embedded) application */
+
+
+/*
+ * e_type
+ */
+#define ET_NONE 0
+#define ET_REL 1
+#define ET_EXEC 2
+#define ET_DYN 3
+#define ET_CORE 4
+#define ET_NUM 5
+#define ET_LOOS 0xfe00
+#define ET_HIOS 0xfeff
+#define ET_LOPROC 0xff00
+#define ET_HIPROC 0xffff
+
+/*
+ * e_machine
+ */
+#define EM_NONE 0 /* No machine */
+#define EM_M32 1 /* AT&T WE 32100 */
+#define EM_SPARC 2 /* SPARC */
+#define EM_386 3 /* Intel 80386 */
+#define EM_68K 4 /* Motorola 68000 */
+#define EM_88K 5 /* Motorola 88000 */
+#define EM_486 6 /* Intel i486 (DO NOT USE THIS ONE) */
+#define EM_860 7 /* Intel 80860 */
+#define EM_MIPS 8 /* MIPS I Architecture */
+#define EM_S370 9 /* IBM System/370 Processor */
+#define EM_MIPS_RS3_LE 10 /* MIPS RS3000 Little-endian */
+#define EM_SPARC64 11 /* SPARC 64-bit */
+#define EM_PARISC 15 /* Hewlett-Packard PA-RISC */
+#define EM_VPP500 17 /* Fujitsu VPP500 */
+#define EM_SPARC32PLUS 18 /* Enhanced instruction set SPARC */
+#define EM_960 19 /* Intel 80960 */
+#define EM_PPC 20 /* PowerPC */
+#define EM_PPC64 21 /* 64-bit PowerPC */
+#define EM_S390 22 /* IBM System/390 Processor */
+#define EM_V800 36 /* NEC V800 */
+#define EM_FR20 37 /* Fujitsu FR20 */
+#define EM_RH32 38 /* TRW RH-32 */
+#define EM_RCE 39 /* Motorola RCE */
+#define EM_ARM 40 /* Advanced RISC Machines ARM */
+#define EM_ALPHA 41 /* Digital Alpha */
+#define EM_SH 42 /* Hitachi SH */
+#define EM_SPARCV9 43 /* SPARC Version 9 */
+#define EM_TRICORE 44 /* Siemens TriCore embedded processor */
+#define EM_ARC 45 /* Argonaut RISC Core, Argonaut Technologies Inc. */
+#define EM_H8_300 46 /* Hitachi H8/300 */
+#define EM_H8_300H 47 /* Hitachi H8/300H */
+#define EM_H8S 48 /* Hitachi H8S */
+#define EM_H8_500 49 /* Hitachi H8/500 */
+#define EM_IA_64 50 /* Intel IA-64 processor architecture */
+#define EM_MIPS_X 51 /* Stanford MIPS-X */
+#define EM_COLDFIRE 52 /* Motorola ColdFire */
+#define EM_68HC12 53 /* Motorola M68HC12 */
+#define EM_MMA 54 /* Fujitsu MMA Multimedia Accelerator */
+#define EM_PCP 55 /* Siemens PCP */
+#define EM_NCPU 56 /* Sony nCPU embedded RISC processor */
+#define EM_NDR1 57 /* Denso NDR1 microprocessor */
+#define EM_STARCORE 58 /* Motorola Star*Core processor */
+#define EM_ME16 59 /* Toyota ME16 processor */
+#define EM_ST100 60 /* STMicroelectronics ST100 processor */
+#define EM_TINYJ 61 /* Advanced Logic Corp. TinyJ embedded processor family */
+#define EM_X86_64 62 /* AMD x86-64 architecture */
+#define EM_AMD64 EM_X86_64
+#define EM_PDSP 63 /* Sony DSP Processor */
+#define EM_FX66 66 /* Siemens FX66 microcontroller */
+#define EM_ST9PLUS 67 /* STMicroelectronics ST9+ 8/16 bit microcontroller */
+#define EM_ST7 68 /* STMicroelectronics ST7 8-bit microcontroller */
+#define EM_68HC16 69 /* Motorola MC68HC16 Microcontroller */
+#define EM_68HC11 70 /* Motorola MC68HC11 Microcontroller */
+#define EM_68HC08 71 /* Motorola MC68HC08 Microcontroller */
+#define EM_68HC05 72 /* Motorola MC68HC05 Microcontroller */
+#define EM_SVX 73 /* Silicon Graphics SVx */
+#define EM_ST19 74 /* STMicroelectronics ST19 8-bit microcontroller */
+#define EM_VAX 75 /* Digital VAX */
+#define EM_CRIS 76 /* Axis Communications 32-bit embedded processor */
+#define EM_JAVELIN 77 /* Infineon Technologies 32-bit embedded processor */
+#define EM_FIREPATH 78 /* Element 14 64-bit DSP Processor */
+#define EM_ZSP 79 /* LSI Logic 16-bit DSP Processor */
+#define EM_MMIX 80 /* Donald Knuth's educational 64-bit processor */
+#define EM_HUANY 81 /* Harvard University machine-independent object files */
+#define EM_PRISM 82 /* SiTera Prism */
+#define EM_AVR 83 /* Atmel AVR 8-bit microcontroller */
+#define EM_FR30 84 /* Fujitsu FR30 */
+#define EM_D10V 85 /* Mitsubishi D10V */
+#define EM_D30V 86 /* Mitsubishi D30V */
+#define EM_V850 87 /* NEC v850 */
+#define EM_M32R 88 /* Mitsubishi M32R */
+#define EM_MN10300 89 /* Matsushita MN10300 */
+#define EM_MN10200 90 /* Matsushita MN10200 */
+#define EM_PJ 91 /* picoJava */
+#define EM_OPENRISC 92 /* OpenRISC 32-bit embedded processor */
+#define EM_ARC_A5 93 /* ARC Cores Tangent-A5 */
+#define EM_XTENSA 94 /* Tensilica Xtensa Architecture */
+#define EM_VIDEOCORE 95 /* Alphamosaic VideoCore processor */
+#define EM_TMM_GPP 96 /* Thompson Multimedia General Purpose Processor */
+#define EM_NS32K 97 /* National Semiconductor 32000 series */
+#define EM_TPC 98 /* Tenor Network TPC processor */
+#define EM_SNP1K 99 /* Trebia SNP 1000 processor */
+#define EM_ST200 100 /* STMicroelectronics (www.st.com) ST200 microcontroller */
+#define EM_IP2K 101 /* Ubicom IP2xxx microcontroller family */
+#define EM_MAX 102 /* MAX Processor */
+#define EM_CR 103 /* National Semiconductor CompactRISC microprocessor */
+#define EM_F2MC16 104 /* Fujitsu F2MC16 */
+#define EM_MSP430 105 /* Texas Instruments embedded microcontroller msp430 */
+#define EM_BLACKFIN 106 /* Analog Devices Blackfin (DSP) processor */
+#define EM_SE_C33 107 /* S1C33 Family of Seiko Epson processors */
+#define EM_SEP 108 /* Sharp embedded microprocessor */
+#define EM_ARCA 109 /* Arca RISC Microprocessor */
+#define EM_UNICORE 110 /* Microprocessor series from PKU-Unity Ltd. and MPRC of Peking University */
+#define EM_NUM 111
+
+/*
+ * e_ident[EI_VERSION], e_version
+ */
+#define EV_NONE 0
+#define EV_CURRENT 1
+#define EV_NUM 2
+
+/*
+ * Section header
+ */
+typedef struct {
+ Elf32_Word sh_name;
+ Elf32_Word sh_type;
+ Elf32_Word sh_flags;
+ Elf32_Addr sh_addr;
+ Elf32_Off sh_offset;
+ Elf32_Word sh_size;
+ Elf32_Word sh_link;
+ Elf32_Word sh_info;
+ Elf32_Word sh_addralign;
+ Elf32_Word sh_entsize;
+} Elf32_Shdr;
+
+#if __LIBELF64
+typedef struct {
+ Elf64_Word sh_name;
+ Elf64_Word sh_type;
+ Elf64_Xword sh_flags;
+ Elf64_Addr sh_addr;
+ Elf64_Off sh_offset;
+ Elf64_Xword sh_size;
+ Elf64_Word sh_link;
+ Elf64_Word sh_info;
+ Elf64_Xword sh_addralign;
+ Elf64_Xword sh_entsize;
+} Elf64_Shdr;
+#endif /* __LIBELF64 */
+
+/*
+ * Special section indices
+ */
+#define SHN_UNDEF 0
+#define SHN_LORESERVE 0xff00
+#define SHN_LOPROC 0xff00
+#define SHN_HIPROC 0xff1f
+#define SHN_LOOS 0xff20
+#define SHN_HIOS 0xff3f
+#define SHN_ABS 0xfff1
+#define SHN_COMMON 0xfff2
+#define SHN_XINDEX 0xffff
+#define SHN_HIRESERVE 0xffff
+
+/*
+ * sh_type
+ */
+#define SHT_NULL 0
+#define SHT_PROGBITS 1
+#define SHT_SYMTAB 2
+#define SHT_STRTAB 3
+#define SHT_RELA 4
+#define SHT_HASH 5
+#define SHT_DYNAMIC 6
+#define SHT_NOTE 7
+#define SHT_NOBITS 8
+#define SHT_REL 9
+#define SHT_SHLIB 10
+#define SHT_DYNSYM 11
+#define SHT_INIT_ARRAY 14
+#define SHT_FINI_ARRAY 15
+#define SHT_PREINIT_ARRAY 16
+#define SHT_GROUP 17
+#define SHT_SYMTAB_SHNDX 18
+#define SHT_NUM 19
+#define SHT_LOOS 0x60000000
+#define SHT_HIOS 0x6fffffff
+#define SHT_LOPROC 0x70000000
+#define SHT_HIPROC 0x7fffffff
+#define SHT_LOUSER 0x80000000
+#define SHT_HIUSER 0xffffffff
+
+/*
+ * Solaris extensions
+ */
+#define SHT_LOSUNW 0x6ffffff4
+#define SHT_SUNW_dof 0x6ffffff4
+#define SHT_SUNW_cap 0x6ffffff5
+#define SHT_SUNW_SIGNATURE 0x6ffffff6
+#define SHT_SUNW_ANNOTATE 0x6ffffff7
+#define SHT_SUNW_DEBUGSTR 0x6ffffff8
+#define SHT_SUNW_DEBUG 0x6ffffff9
+#define SHT_SUNW_move 0x6ffffffa
+#define SHT_SUNW_COMDAT 0x6ffffffb
+#define SHT_SUNW_syminfo 0x6ffffffc
+#define SHT_SUNW_verdef 0x6ffffffd
+#define SHT_SUNW_verneed 0x6ffffffe
+#define SHT_SUNW_versym 0x6fffffff
+#define SHT_HISUNW 0x6fffffff
+
+#define SHT_SPARC_GOTDATA 0x70000000
+#define SHT_AMD64_UNWIND 0x70000001
+
+/*
+ * GNU extensions
+ */
+#define SHT_GNU_verdef 0x6ffffffd
+#define SHT_GNU_verneed 0x6ffffffe
+#define SHT_GNU_versym 0x6fffffff
+
+/*
+ * sh_flags
+ */
+#define SHF_WRITE 0x1
+#define SHF_ALLOC 0x2
+#define SHF_EXECINSTR 0x4
+#define SHF_MERGE 0x10
+#define SHF_STRINGS 0x20
+#define SHF_INFO_LINK 0x40
+#define SHF_LINK_ORDER 0x80
+#define SHF_OS_NONCONFORMING 0x100
+#define SHF_GROUP 0x200
+#define SHF_TLS 0x400
+#define SHF_MASKOS 0x0ff00000
+#define SHF_MASKPROC 0xf0000000
+
+/*
+ * Solaris extensions
+ */
+#define SHF_AMD64_LARGE 0x10000000
+#define SHF_ORDERED 0x40000000
+#define SHF_EXCLUDE 0x80000000
+
+/*
+ * Section group flags
+ */
+#define GRP_COMDAT 0x1
+#define GRP_MASKOS 0x0ff00000
+#define GRP_MASKPROC 0xf0000000
+
+/*
+ * Symbol table
+ */
+typedef struct {
+ Elf32_Word st_name;
+ Elf32_Addr st_value;
+ Elf32_Word st_size;
+ unsigned char st_info;
+ unsigned char st_other;
+ Elf32_Half st_shndx;
+} Elf32_Sym;
+
+#if __LIBELF64
+typedef struct {
+ Elf64_Word st_name;
+ unsigned char st_info;
+ unsigned char st_other;
+ Elf64_Half st_shndx;
+ Elf64_Addr st_value;
+ Elf64_Xword st_size;
+} Elf64_Sym;
+#endif /* __LIBELF64 */
+
+/*
+ * Special symbol indices
+ */
+#define STN_UNDEF 0
+
+/*
+ * Macros for manipulating st_info
+ */
+#define ELF32_ST_BIND(i) ((i)>>4)
+#define ELF32_ST_TYPE(i) ((i)&0xf)
+#define ELF32_ST_INFO(b,t) (((b)<<4)+((t)&0xf))
+
+#if __LIBELF64
+#define ELF64_ST_BIND(i) ((i)>>4)
+#define ELF64_ST_TYPE(i) ((i)&0xf)
+#define ELF64_ST_INFO(b,t) (((b)<<4)+((t)&0xf))
+#endif /* __LIBELF64 */
+
+/*
+ * Symbol binding
+ */
+#define STB_LOCAL 0
+#define STB_GLOBAL 1
+#define STB_WEAK 2
+#define STB_NUM 3
+#define STB_LOOS 10
+#define STB_HIOS 12
+#define STB_LOPROC 13
+#define STB_HIPROC 15
+
+/*
+ * Symbol types
+ */
+#define STT_NOTYPE 0
+#define STT_OBJECT 1
+#define STT_FUNC 2
+#define STT_SECTION 3
+#define STT_FILE 4
+#define STT_COMMON 5
+#define STT_TLS 6
+#define STT_NUM 7
+#define STT_LOOS 10
+#define STT_HIOS 12
+#define STT_LOPROC 13
+#define STT_HIPROC 15
+
+/*
+ * Macros for manipulating st_other
+ */
+#define ELF32_ST_VISIBILITY(o) ((o)&0x3)
+#if __LIBELF64
+#define ELF64_ST_VISIBILITY(o) ((o)&0x3)
+#endif /* __LIBELF64 */
+
+/*
+ * Symbol visibility
+ */
+#define STV_DEFAULT 0
+#define STV_INTERNAL 1
+#define STV_HIDDEN 2
+#define STV_PROTECTED 3
+
+/*
+ * Relocation
+ */
+typedef struct {
+ Elf32_Addr r_offset;
+ Elf32_Word r_info;
+} Elf32_Rel;
+
+typedef struct {
+ Elf32_Addr r_offset;
+ Elf32_Word r_info;
+ Elf32_Sword r_addend;
+} Elf32_Rela;
+
+#if __LIBELF64
+typedef struct {
+ Elf64_Addr r_offset;
+ Elf64_Xword r_info;
+} Elf64_Rel;
+
+typedef struct {
+ Elf64_Addr r_offset;
+ Elf64_Xword r_info;
+ Elf64_Sxword r_addend;
+} Elf64_Rela;
+#endif /* __LIBELF64 */
+
+/*
+ * Macros for manipulating r_info
+ */
+#define ELF32_R_SYM(i) ((i)>>8)
+#define ELF32_R_TYPE(i) ((unsigned char)(i))
+#define ELF32_R_INFO(s,t) (((s)<<8)+(unsigned char)(t))
+
+#if __LIBELF64
+#define ELF64_R_SYM(i) ((Elf64_Xword)(i)>>32)
+#define ELF64_R_TYPE(i) ((i)&0xffffffffL)
+#define ELF64_R_INFO(s,t) (((Elf64_Xword)(s)<<32)+((t)&0xffffffffL))
+#endif /* __LIBELF64 */
+
+/*
+ * Note entry header
+ */
+typedef struct {
+ Elf32_Word n_namesz; /* name size */
+ Elf32_Word n_descsz; /* descriptor size */
+ Elf32_Word n_type; /* descriptor type */
+} Elf32_Nhdr;
+
+#if __LIBELF64
+/* Solaris and GNU use this layout. Be compatible. */
+/* XXX: Latest ELF specs say it's 64-bit!!! */
+typedef struct {
+ Elf64_Word n_namesz; /* name size */
+ Elf64_Word n_descsz; /* descriptor size */
+ Elf64_Word n_type; /* descriptor type */
+} Elf64_Nhdr;
+#endif /* __LIBELF64 */
+
+/*
+ * Well-known descriptor types for ET_CORE files
+ */
+#define NT_PRSTATUS 1
+#define NT_PRFPREG 2
+#define NT_PRPSINFO 3
+
+/*
+ * Program header
+ */
+typedef struct {
+ Elf32_Word p_type;
+ Elf32_Off p_offset;
+ Elf32_Addr p_vaddr;
+ Elf32_Addr p_paddr;
+ Elf32_Word p_filesz;
+ Elf32_Word p_memsz;
+ Elf32_Word p_flags;
+ Elf32_Word p_align;
+} Elf32_Phdr;
+
+#if __LIBELF64
+typedef struct {
+ Elf64_Word p_type;
+ Elf64_Word p_flags;
+ Elf64_Off p_offset;
+ Elf64_Addr p_vaddr;
+ Elf64_Addr p_paddr;
+ Elf64_Xword p_filesz;
+ Elf64_Xword p_memsz;
+ Elf64_Xword p_align;
+} Elf64_Phdr;
+#endif /* __LIBELF64 */
+
+/*
+ * Special numbers
+ */
+#define PN_XNUM 0xffff
+
+/*
+ * p_type
+ */
+#define PT_NULL 0
+#define PT_LOAD 1
+#define PT_DYNAMIC 2
+#define PT_INTERP 3
+#define PT_NOTE 4
+#define PT_SHLIB 5
+#define PT_PHDR 6
+#define PT_TLS 7
+#define PT_NUM 8
+#define PT_LOOS 0x60000000
+#define PT_HIOS 0x6fffffff
+#define PT_LOPROC 0x70000000
+#define PT_HIPROC 0x7fffffff
+
+/*
+ * Solaris extensions
+ */
+
+#define PT_SUNW_UNWIND 0x6464e550
+#define PT_LOSUNW 0x6ffffffa
+#define PT_SUNWBSS 0x6ffffffa
+#define PT_SUNWSTACK 0x6ffffffb
+#define PT_SUNWDTRACE 0x6ffffffc
+#define PT_SUNWCAP 0x6ffffffd
+#define PT_HISUNW 0x6fffffff
+
+/*
+ * p_flags
+ */
+#define PF_X 0x1
+#define PF_W 0x2
+#define PF_R 0x4
+#define PF_MASKOS 0x0ff00000
+#define PF_MASKPROC 0xf0000000
+
+/*
+ * Dynamic structure
+ */
+typedef struct {
+ Elf32_Sword d_tag;
+ union {
+ Elf32_Word d_val;
+ Elf32_Addr d_ptr;
+ } d_un;
+} Elf32_Dyn;
+
+#if __LIBELF64
+typedef struct {
+ Elf64_Sxword d_tag;
+ union {
+ Elf64_Xword d_val;
+ Elf64_Addr d_ptr;
+ } d_un;
+} Elf64_Dyn;
+#endif /* __LIBELF64 */
+
+/*
+ * Dynamic array tags
+ */
+ /* d_un exec shared */
+#define DT_NULL 0 /* ign. mand. mand. */
+#define DT_NEEDED 1 /* d_val opt. opt. */
+#define DT_PLTRELSZ 2 /* d_val opt. opt. */
+#define DT_PLTGOT 3 /* d_ptr opt. opt. */
+#define DT_HASH 4 /* d_ptr mand. mand. */
+#define DT_STRTAB 5 /* d_ptr mand. mand. */
+#define DT_SYMTAB 6 /* d_ptr mand. mand. */
+#define DT_RELA 7 /* d_ptr mand. opt. */
+#define DT_RELASZ 8 /* d_val mand. opt. */
+#define DT_RELAENT 9 /* d_val mand. opt. */
+#define DT_STRSZ 10 /* d_val mand. mand. */
+#define DT_SYMENT 11 /* d_val mand. mand. */
+#define DT_INIT 12 /* d_ptr opt. opt. */
+#define DT_FINI 13 /* d_ptr opt. opt. */
+#define DT_SONAME 14 /* d_val ign. opt. */
+#define DT_RPATH 15 /* d_val opt. ign. */
+#define DT_SYMBOLIC 16 /* ign. ign. opt. */
+#define DT_REL 17 /* d_ptr mand. opt. */
+#define DT_RELSZ 18 /* d_val mand. opt. */
+#define DT_RELENT 19 /* d_val mand. opt. */
+#define DT_PLTREL 20 /* d_val opt. opt. */
+#define DT_DEBUG 21 /* d_ptr opt. ign. */
+#define DT_TEXTREL 22 /* ign. opt. opt. */
+#define DT_JMPREL 23 /* d_ptr opt. opt. */
+#define DT_BIND_NOW 24 /* ign. opt. opt. */
+#define DT_INIT_ARRAY 25 /* d_ptr opt. opt. */
+#define DT_FINI_ARRAY 26 /* d_ptr opt. opt. */
+#define DT_INIT_ARRAYSZ 27 /* d_val opt. opt. */
+#define DT_FINI_ARRAYSZ 28 /* d_val opt. opt. */
+#define DT_RUNPATH 29 /* d_val opt. opt. */
+#define DT_FLAGS 30 /* d_val opt. opt. */
+#define DT_ENCODING 32 /* odd/even encoding rule starts here */
+#define DT_PREINIT_ARRAY 32 /* d_ptr opt. ign. */
+#define DT_PREINIT_ARRAYSZ 33 /* d_val opt. ign. */
+#define DT_NUM 34
+#define DT_LOOS 0x6000000D
+#define DT_HIOS 0x6ffff000
+#define DT_LOPROC 0x70000000
+#define DT_HIPROC 0x7fffffff
+
+/*
+ * DT_FLAGS values
+ */
+#define DF_ORIGIN 0x1
+#define DF_SYMBOLIC 0x2
+#define DF_TEXTREL 0x4
+#define DF_BIND_NOW 0x8
+#define DF_STATIC_TLS 0x10
+
+/*
+ * Solaris extensions
+ */
+#define DT_VALRNGLO 0x6ffffd00
+#define DT_CHECKSUM 0x6ffffdf8
+#define DT_PLTPADSZ 0x6ffffdf9
+#define DT_MOVEENT 0x6ffffdfa
+#define DT_MOVESZ 0x6ffffdfb
+#define DT_FEATURE_1 0x6ffffdfc
+#define DT_POSFLAG_1 0x6ffffdfd
+#define DT_SYMINSZ 0x6ffffdfe
+#define DT_SYMINENT 0x6ffffdff
+#define DT_VALRNGHI 0x6ffffdff
+
+#define DT_ADDRRNGLO 0x6ffffe00
+#define DT_CONFIG 0x6ffffefa
+#define DT_DEPAUDIT 0x6ffffefb
+#define DT_AUDIT 0x6ffffefc
+#define DT_PLTPAD 0x6ffffefd
+#define DT_MOVETAB 0x6ffffefe
+#define DT_SYMINFO 0x6ffffeff
+#define DT_ADDRRNGHI 0x6ffffeff
+
+#define DT_RELACOUNT 0x6ffffff9
+#define DT_RELCOUNT 0x6ffffffa
+#define DT_FLAGS_1 0x6ffffffb
+#define DT_VERDEF 0x6ffffffc
+#define DT_VERDEFNUM 0x6ffffffd
+#define DT_VERNEED 0x6ffffffe
+#define DT_VERNEEDNUM 0x6fffffff
+
+#define DT_AUXILIARY 0x7ffffffd
+#define DT_USED 0x7ffffffe
+#define DT_FILTER 0x7fffffff
+
+/*
+ * GNU extensions
+ */
+#define DT_VERSYM 0x6ffffff0
+
+/*
+ * DT_FEATURE_1 values
+ */
+#define DTF_1_PARINIT 0x1
+#define DTF_1_CONFEXP 0x2
+
+/*
+ * DT_POSFLAG_1 values
+ */
+#define DF_P1_LAZYLOAD 0x1
+#define DF_P1_GROUPPERM 0x2
+
+/*
+ * DT_FLAGS_1 values
+ */
+#define DF_1_NOW 0x00000001
+#define DF_1_GLOBAL 0x00000002
+#define DF_1_GROUP 0x00000004
+#define DF_1_NODELETE 0x00000008
+#define DF_1_LOADFLTR 0x00000010
+#define DF_1_INITFIRST 0x00000020
+#define DF_1_NOOPEN 0x00000040
+#define DF_1_ORIGIN 0x00000080
+#define DF_1_DIRECT 0x00000100
+#define DF_1_TRANS 0x00000200
+#define DF_1_INTERPOSE 0x00000400
+#define DF_1_NODEFLIB 0x00000800
+#define DF_1_NODUMP 0x00001000
+#define DF_1_CONFALT 0x00002000
+#define DF_1_ENDFILTEE 0x00004000
+#define DF_1_DISPRELDNE 0x00008000
+#define DF_1_DISPRELPND 0x00010000
+
+/*
+ * Syminfo structure
+ */
+typedef struct {
+ Elf32_Half si_boundto;
+ Elf32_Half si_flags;
+} Elf32_Syminfo;
+
+#if __LIBELF64
+typedef struct {
+ Elf64_Half si_boundto;
+ Elf64_Half si_flags;
+} Elf64_Syminfo;
+#endif /* __LIBELF64 */
+
+/*
+ * Syminfo version (stored in unused first entry)
+ */
+#define SYMINFO_NONE 0
+#define SYMINFO_CURRENT 1
+#define SYMINFO_NUM 2
+
+/*
+ * si_boundto special values
+ */
+#define SYMINFO_BT_LOWRESERVE 0xff00
+#define SYMINFO_BT_PARENT 0xfffe /* bound to parent */
+#define SYMINFO_BT_SELF 0xffff /* bound to self */
+
+/*
+ * si_flags
+ */
+#define SYMINFO_FLG_DIRECT 0x01 /* bound to an object */
+#define SYMINFO_FLG_PASSTHRU 0x02 /* pass-thru symbol */
+#define SYMINFO_FLG_COPY 0x04 /* result of a copy relocation */
+#define SYMINFO_FLG_LAZYLOAD 0x08 /* bound to lazy-loaded object */
+
+/*
+ * Version definitions
+ */
+typedef struct {
+ Elf32_Half vd_version;
+ Elf32_Half vd_flags;
+ Elf32_Half vd_ndx;
+ Elf32_Half vd_cnt;
+ Elf32_Word vd_hash;
+ Elf32_Word vd_aux;
+ Elf32_Word vd_next;
+} Elf32_Verdef;
+
+typedef struct {
+ Elf32_Word vda_name;
+ Elf32_Word vda_next;
+} Elf32_Verdaux;
+
+typedef struct {
+ Elf32_Half vn_version;
+ Elf32_Half vn_cnt;
+ Elf32_Word vn_file;
+ Elf32_Word vn_aux;
+ Elf32_Word vn_next;
+} Elf32_Verneed;
+
+typedef struct {
+ Elf32_Word vna_hash;
+ Elf32_Half vna_flags;
+ Elf32_Half vna_other;
+ Elf32_Word vna_name;
+ Elf32_Word vna_next;
+} Elf32_Vernaux;
+
+typedef Elf32_Half Elf32_Versym;
+
+#if __LIBELF64
+
+typedef struct {
+ Elf64_Half vd_version;
+ Elf64_Half vd_flags;
+ Elf64_Half vd_ndx;
+ Elf64_Half vd_cnt;
+ Elf64_Word vd_hash;
+ Elf64_Word vd_aux;
+ Elf64_Word vd_next;
+} Elf64_Verdef;
+
+typedef struct {
+ Elf64_Word vda_name;
+ Elf64_Word vda_next;
+} Elf64_Verdaux;
+
+typedef struct {
+ Elf64_Half vn_version;
+ Elf64_Half vn_cnt;
+ Elf64_Word vn_file;
+ Elf64_Word vn_aux;
+ Elf64_Word vn_next;
+} Elf64_Verneed;
+
+typedef struct {
+ Elf64_Word vna_hash;
+ Elf64_Half vna_flags;
+ Elf64_Half vna_other;
+ Elf64_Word vna_name;
+ Elf64_Word vna_next;
+} Elf64_Vernaux;
+
+typedef Elf64_Half Elf64_Versym;
+
+#endif /* __LIBELF64 */
+
+/*
+ * vd_version
+ */
+#define VER_DEF_NONE 0
+#define VER_DEF_CURRENT 1
+#define VER_DEF_NUM 2
+
+/*
+ * vn_version
+ */
+#define VER_NEED_NONE 0
+#define VER_NEED_CURRENT 1
+#define VER_NEED_NUM 2
+
+/*
+ * vd_flags / vna_flags
+ */
+#define VER_FLG_BASE 0x1 /* vd_flags only */
+#define VER_FLG_WEAK 0x2
+
+/*
+ * Elf*_Versym special values
+ */
+#define VER_NDX_LOCAL 0
+#define VER_NDX_GLOBAL 1
+
+/*
+ * Solaris extensions
+ */
+
+/*
+ * Move section
+ */
+#if __LIBELF64
+
+typedef struct {
+ Elf32_Lword m_value;
+ Elf32_Word m_info;
+ Elf32_Word m_poffset;
+ Elf32_Half m_repeat;
+ Elf32_Half m_stride;
+} Elf32_Move;
+
+typedef struct {
+ Elf64_Lword m_value;
+ Elf64_Xword m_info;
+ Elf64_Xword m_poffset;
+ Elf64_Half m_repeat;
+ Elf64_Half m_stride;
+} Elf64_Move;
+
+#define ELF32_M_SYM(info) ((info)>>8)
+#define ELF32_M_SIZE(info) ((unsigned char)(info))
+#define ELF32_M_INFO(sym, sz) (((sym)<<8)+(unsigned char)(sz))
+
+#define ELF64_M_SYM(info) ((Elf64_Xword)(info)>>8)
+#define ELF64_M_SIZE(info) ((unsigned char)(info))
+#define ELF64_M_INFO(sym, sz) (((Elf64_Xword)(sym)<<8)+(unsigned char)(sz))
+
+#endif /* __LIBELF64 */
+
+/*
+ * Capabilities
+ */
+
+typedef struct {
+ Elf32_Word c_tag;
+ union {
+ Elf32_Word c_val;
+ Elf32_Addr c_ptr;
+ } c_un;
+} Elf32_Cap;
+
+#if __LIBELF64
+
+typedef struct {
+ Elf64_Xword c_tag;
+ union {
+ Elf64_Xword c_val;
+ Elf64_Addr c_ptr;
+ } c_un;
+} Elf64_Cap;
+
+#endif /* __LIBELF64 */
+
+#define CA_SUNW_NULL 0 /* c_un ignored */
+#define CA_SUNW_HW_1 1 /* c_un.c_val */
+#define CA_SUNW_SF_1 2 /* c_un.c_val */
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _ELF_REPL_H */
diff --git a/lib/end.c b/lib/end.c
new file mode 100644
index 0000000..c604239
--- /dev/null
+++ b/lib/end.c
@@ -0,0 +1,118 @@
+/*
+ * end.c - implementation of the elf_end(3) function.
+ * Copyright (C) 1995 - 2004 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: end.c,v 1.12 2008/05/23 08:15:34 michael Exp $";
+#endif /* lint */
+
+#if HAVE_MMAP
+#include <sys/mman.h>
+#endif /* HAVE_MMAP */
+
+static void
+_elf_free(void *ptr) {
+ if (ptr) {
+ free(ptr);
+ }
+}
+
+static void
+_elf_free_scns(Elf *elf, Elf_Scn *scn) {
+ Scn_Data *sd, *tmp;
+ Elf_Scn *freescn;
+
+ for (freescn = NULL; scn; scn = scn->s_link) {
+ elf_assert(scn->s_magic == SCN_MAGIC);
+ elf_assert(scn->s_elf == elf);
+ for (sd = scn->s_data_1; sd; sd = tmp) {
+ elf_assert(sd->sd_magic == DATA_MAGIC);
+ elf_assert(sd->sd_scn == scn);
+ tmp = sd->sd_link;
+ if (sd->sd_free_data) {
+ _elf_free(sd->sd_memdata);
+ }
+ if (sd->sd_freeme) {
+ free(sd);
+ }
+ }
+ if ((sd = scn->s_rawdata)) {
+ elf_assert(sd->sd_magic == DATA_MAGIC);
+ elf_assert(sd->sd_scn == scn);
+ if (sd->sd_free_data) {
+ _elf_free(sd->sd_memdata);
+ }
+ if (sd->sd_freeme) {
+ free(sd);
+ }
+ }
+ if (scn->s_freeme) {
+ _elf_free(freescn);
+ freescn = scn;
+ }
+ }
+ _elf_free(freescn);
+}
+
+int
+elf_end(Elf *elf) {
+ Elf **siblings;
+
+ if (!elf) {
+ return 0;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ if (--elf->e_count) {
+ return elf->e_count;
+ }
+ if (elf->e_parent) {
+ elf_assert(elf->e_parent->e_magic == ELF_MAGIC);
+ elf_assert(elf->e_parent->e_kind == ELF_K_AR);
+ siblings = &elf->e_parent->e_members;
+ while (*siblings) {
+ if (*siblings == elf) {
+ *siblings = elf->e_link;
+ break;
+ }
+ siblings = &(*siblings)->e_link;
+ }
+ elf_end(elf->e_parent);
+ _elf_free(elf->e_arhdr);
+ }
+#if HAVE_MMAP
+ else if (elf->e_unmap_data) {
+ munmap(elf->e_data, elf->e_size);
+ }
+#endif /* HAVE_MMAP */
+ else if (!elf->e_memory) {
+ _elf_free(elf->e_data);
+ }
+ _elf_free_scns(elf, elf->e_scn_1);
+ if (elf->e_rawdata != elf->e_data) {
+ _elf_free(elf->e_rawdata);
+ }
+ if (elf->e_free_syms) {
+ _elf_free(elf->e_symtab);
+ }
+ _elf_free(elf->e_ehdr);
+ _elf_free(elf->e_phdr);
+ free(elf);
+ return 0;
+}
diff --git a/lib/errmsg.c b/lib/errmsg.c
new file mode 100644
index 0000000..883243f
--- /dev/null
+++ b/lib/errmsg.c
@@ -0,0 +1,77 @@
+/*
+ * errmsg.c - implementation of the elf_errmsg(3) function.
+ * Copyright (C) 1995 - 1999, 2004 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: errmsg.c,v 1.11 2008/05/23 08:15:34 michael Exp $";
+#endif /* lint */
+
+#if HAVE_DGETTEXT
+# undef HAVE_CATGETS
+# include <libintl.h>
+#else /* HAVE_DGETTEXT */
+# define dgettext(dom, str) str
+#endif /* HAVE_DGETTEXT */
+
+#if HAVE_CATGETS
+# include <nl_types.h>
+static nl_catd _libelf_cat = (nl_catd)0;
+#endif /* HAVE_CATGETS */
+
+#if HAVE_DGETTEXT || HAVE_CATGETS
+static const char domain[] = "libelf";
+#endif /* HAVE_DGETTEXT || HAVE_CATGETS */
+
+#if PIC
+static const char *_messages[] = {
+#else /* PIC */
+static const char *const _messages[] = {
+#endif /* PIC */
+#define __err__(a,b) b,
+#include <errors.h> /* include string tables from errors.h */
+#undef __err__
+};
+
+const char*
+elf_errmsg(int err) {
+ if (err == 0) {
+ err = _elf_errno;
+ if (err == 0) {
+ return NULL;
+ }
+ }
+ else if (err == -1) {
+ err = _elf_errno;
+ }
+
+ if (err < 0 || err >= ERROR_NUM || _messages[err] == NULL) {
+ err = ERROR_UNKNOWN;
+ }
+
+#if HAVE_CATGETS
+ if (_libelf_cat == (nl_catd)0) {
+ _libelf_cat = catopen(domain, 0);
+ }
+ if (_libelf_cat != (nl_catd)-1) {
+ return catgets(_libelf_cat, 1, err + 1, _messages[err]);
+ }
+#endif /* HAVE_CATGETS */
+ return dgettext(domain, _messages[err]);
+}
diff --git a/lib/errno.c b/lib/errno.c
new file mode 100644
index 0000000..1902322
--- /dev/null
+++ b/lib/errno.c
@@ -0,0 +1,32 @@
+/*
+errno.c - implementation of the elf_errno(3) function.
+Copyright (C) 1995 - 1998 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: errno.c,v 1.7 2008/05/23 08:15:34 michael Exp $";
+#endif /* lint */
+
+int
+elf_errno(void) {
+ int tmp = _elf_errno;
+
+ _elf_errno = 0;
+ return tmp;
+}
diff --git a/lib/errors.h b/lib/errors.h
new file mode 100644
index 0000000..80ee70b
--- /dev/null
+++ b/lib/errors.h
@@ -0,0 +1,100 @@
+/*
+ * errors.h - exhaustive list of all error codes and messages for libelf.
+ * Copyright (C) 1995 - 2003, 2006 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+/* @(#) $Id: errors.h,v 1.18 2008/05/23 08:15:34 michael Exp $ */
+
+/* dummy for xgettext */
+#define _(str) str
+
+__err__(ERROR_OK, _("no error"))
+__err__(ERROR_UNKNOWN, _("unknown error"))
+__err__(ERROR_INTERNAL, _("Internal error: unknown reason"))
+__err__(ERROR_UNIMPLEMENTED, _("Internal error: not implemented"))
+__err__(ERROR_WRONLY, _("Request error: cntl(ELF_C_FDREAD) on write-only file"))
+__err__(ERROR_INVALID_CMD, _("Request error: invalid ELF_C_* argument"))
+__err__(ERROR_FDDISABLED, _("Request error: file descriptor disabled"))
+__err__(ERROR_NOTARCHIVE, _("Request error: not an archive"))
+__err__(ERROR_BADOFF, _("Request error: offset out of range"))
+__err__(ERROR_UNKNOWN_VERSION, _("Request error: unknown ELF version"))
+__err__(ERROR_CMDMISMATCH, _("Request error: ELF_C_* argument does not match"))
+__err__(ERROR_MEMBERWRITE, _("Request error: archive member begin() for writing"))
+__err__(ERROR_FDMISMATCH, _("Request error: archive/member file descriptor mismatch"))
+__err__(ERROR_NOTELF, _("Request error: not an ELF file"))
+__err__(ERROR_CLASSMISMATCH, _("Request error: class file/memory mismatch"))
+__err__(ERROR_UNKNOWN_TYPE, _("Request error: invalid ELF_T_* argument"))
+__err__(ERROR_UNKNOWN_ENCODING, _("Request error: unknown data encoding"))
+__err__(ERROR_DST2SMALL, _("Request error: destination buffer too small"))
+__err__(ERROR_NULLBUF, _("Request error: d_buf is NULL"))
+__err__(ERROR_UNKNOWN_CLASS, _("Request error: unknown ELF class"))
+__err__(ERROR_ELFSCNMISMATCH, _("Request error: section does not belong to file"))
+__err__(ERROR_NOSUCHSCN, _("Request error: no section at index"))
+__err__(ERROR_NULLSCN, _("Request error: can't manipulate null section"))
+__err__(ERROR_SCNDATAMISMATCH, _("Request error: data does not belong to section"))
+__err__(ERROR_NOSTRTAB, _("Request error: no string table"))
+__err__(ERROR_BADSTROFF, _("Request error: string table offset out of range"))
+__err__(ERROR_RDONLY, _("Request error: update(ELF_C_WRITE) on read-only file"))
+__err__(ERROR_IO_SEEK, _("I/O error: seek"))
+__err__(ERROR_IO_2BIG, _("I/O error: file too big for memory"))
+__err__(ERROR_IO_READ, _("I/O error: raw read"))
+__err__(ERROR_IO_GETSIZE, _("I/O error: get file size"))
+__err__(ERROR_IO_WRITE, _("I/O error: output write"))
+__err__(ERROR_IO_TRUNC, _("I/O error: can't truncate output file"))
+__err__(ERROR_VERSION_UNSET, _("Sequence error: must set ELF version first"))
+__err__(ERROR_NOEHDR, _("Sequence error: must create ELF header first"))
+__err__(ERROR_OUTSIDE, _("Format error: reference outside file"))
+__err__(ERROR_TRUNC_ARHDR, _("Format error: archive header truncated"))
+__err__(ERROR_ARFMAG, _("Format error: archive fmag"))
+__err__(ERROR_ARHDR, _("Format error: archive header"))
+__err__(ERROR_TRUNC_MEMBER, _("Format error: archive member truncated"))
+__err__(ERROR_SIZE_ARSYMTAB, _("Format error: archive symbol table size"))
+__err__(ERROR_ARSTRTAB, _("Format error: archive string table"))
+__err__(ERROR_ARSPECIAL, _("Format error: archive special name unknown"))
+__err__(ERROR_TRUNC_EHDR, _("Format error: ELF header truncated"))
+__err__(ERROR_TRUNC_PHDR, _("Format error: program header table truncated"))
+__err__(ERROR_TRUNC_SHDR, _("Format error: section header table truncated"))
+__err__(ERROR_TRUNC_SCN, _("Format error: data region truncated"))
+__err__(ERROR_ALIGN_PHDR, _("Format error: program header table alignment"))
+__err__(ERROR_ALIGN_SHDR, _("Format error: section header table alignment"))
+__err__(ERROR_VERDEF_FORMAT, _("Format error: bad parameter in Verdef record"))
+__err__(ERROR_VERDEF_VERSION, _("Format error: unknown Verdef version"))
+__err__(ERROR_VERNEED_FORMAT, _("Format error: bad parameter in Verneed record"))
+__err__(ERROR_VERNEED_VERSION, _("Format error: unknown Verneed version"))
+__err__(ERROR_EHDR_SHNUM, _("Format error: bad e_shnum value"))
+__err__(ERROR_EHDR_SHENTSIZE, _("Format error: bad e_shentsize value"))
+__err__(ERROR_EHDR_PHENTSIZE, _("Format error: bad e_phentsize value"))
+__err__(ERROR_UNTERM, _("Format error: unterminated string in string table"))
+__err__(ERROR_SCN2SMALL, _("Layout error: section size too small for data"))
+__err__(ERROR_SCN_OVERLAP, _("Layout error: overlapping sections"))
+__err__(ERROR_MEM_ELF, _("Memory error: elf descriptor"))
+__err__(ERROR_MEM_ARSYMTAB, _("Memory error: archive symbol table"))
+__err__(ERROR_MEM_ARHDR, _("Memory error: archive member header"))
+__err__(ERROR_MEM_EHDR, _("Memory error: ELF header"))
+__err__(ERROR_MEM_PHDR, _("Memory error: program header table"))
+__err__(ERROR_MEM_SHDR, _("Memory error: section header table"))
+__err__(ERROR_MEM_SCN, _("Memory error: section descriptor"))
+__err__(ERROR_MEM_SCNDATA, _("Memory error: section data"))
+__err__(ERROR_MEM_OUTBUF, _("Memory error: output file space"))
+__err__(ERROR_MEM_TEMPORARY, _("Memory error: temporary buffer"))
+__err__(ERROR_BADVALUE, _("GElf error: value out of range"))
+__err__(ERROR_BADINDEX, _("GElf error: index out of range"))
+__err__(ERROR_BADTYPE, _("GElf error: type mismatch"))
+__err__(ERROR_MEM_SYM, _("GElf error: not enough memory for GElf_Sym"))
+__err__(ERROR_MEM_DYN, _("GElf error: not enough memory for GElf_Dyn"))
+__err__(ERROR_MEM_RELA, _("GElf error: not enough memory for GElf_Rela"))
+__err__(ERROR_MEM_REL, _("GElf error: not enough memory for GElf_Rel"))
diff --git a/lib/ext_types.h b/lib/ext_types.h
new file mode 100644
index 0000000..ead116d
--- /dev/null
+++ b/lib/ext_types.h
@@ -0,0 +1,334 @@
+/*
+ext_types.h - external representation of ELF data types.
+Copyright (C) 1995 - 1998 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+/* @(#) $Id: ext_types.h,v 1.9 2008/05/23 08:15:34 michael Exp $ */
+
+#ifndef _EXT_TYPES_H
+#define _EXT_TYPES_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/*
+ * Scalar data types
+ */
+typedef unsigned char __ext_Elf32_Addr [ELF32_FSZ_ADDR];
+typedef unsigned char __ext_Elf32_Half [ELF32_FSZ_HALF];
+typedef unsigned char __ext_Elf32_Off [ELF32_FSZ_OFF];
+typedef unsigned char __ext_Elf32_Sword [ELF32_FSZ_SWORD];
+typedef unsigned char __ext_Elf32_Word [ELF32_FSZ_WORD];
+
+#if __LIBELF64
+
+typedef unsigned char __ext_Elf32_Lword [8];
+
+typedef unsigned char __ext_Elf64_Addr [ELF64_FSZ_ADDR];
+typedef unsigned char __ext_Elf64_Half [ELF64_FSZ_HALF];
+typedef unsigned char __ext_Elf64_Off [ELF64_FSZ_OFF];
+typedef unsigned char __ext_Elf64_Sword [ELF64_FSZ_SWORD];
+typedef unsigned char __ext_Elf64_Word [ELF64_FSZ_WORD];
+typedef unsigned char __ext_Elf64_Sxword[ELF64_FSZ_SXWORD];
+typedef unsigned char __ext_Elf64_Xword [ELF64_FSZ_XWORD];
+
+typedef unsigned char __ext_Elf64_Lword [8];
+
+#endif /* __LIBELF64 */
+
+/*
+ * ELF header
+ */
+typedef struct {
+ unsigned char e_ident[EI_NIDENT];
+ __ext_Elf32_Half e_type;
+ __ext_Elf32_Half e_machine;
+ __ext_Elf32_Word e_version;
+ __ext_Elf32_Addr e_entry;
+ __ext_Elf32_Off e_phoff;
+ __ext_Elf32_Off e_shoff;
+ __ext_Elf32_Word e_flags;
+ __ext_Elf32_Half e_ehsize;
+ __ext_Elf32_Half e_phentsize;
+ __ext_Elf32_Half e_phnum;
+ __ext_Elf32_Half e_shentsize;
+ __ext_Elf32_Half e_shnum;
+ __ext_Elf32_Half e_shstrndx;
+} __ext_Elf32_Ehdr;
+
+#if __LIBELF64
+typedef struct {
+ unsigned char e_ident[EI_NIDENT];
+ __ext_Elf64_Half e_type;
+ __ext_Elf64_Half e_machine;
+ __ext_Elf64_Word e_version;
+ __ext_Elf64_Addr e_entry;
+ __ext_Elf64_Off e_phoff;
+ __ext_Elf64_Off e_shoff;
+ __ext_Elf64_Word e_flags;
+ __ext_Elf64_Half e_ehsize;
+ __ext_Elf64_Half e_phentsize;
+ __ext_Elf64_Half e_phnum;
+ __ext_Elf64_Half e_shentsize;
+ __ext_Elf64_Half e_shnum;
+ __ext_Elf64_Half e_shstrndx;
+} __ext_Elf64_Ehdr;
+#endif /* __LIBELF64 */
+
+/*
+ * Section header
+ */
+typedef struct {
+ __ext_Elf32_Word sh_name;
+ __ext_Elf32_Word sh_type;
+ __ext_Elf32_Word sh_flags;
+ __ext_Elf32_Addr sh_addr;
+ __ext_Elf32_Off sh_offset;
+ __ext_Elf32_Word sh_size;
+ __ext_Elf32_Word sh_link;
+ __ext_Elf32_Word sh_info;
+ __ext_Elf32_Word sh_addralign;
+ __ext_Elf32_Word sh_entsize;
+} __ext_Elf32_Shdr;
+
+#if __LIBELF64
+typedef struct {
+ __ext_Elf64_Word sh_name;
+ __ext_Elf64_Word sh_type;
+ __ext_Elf64_Xword sh_flags;
+ __ext_Elf64_Addr sh_addr;
+ __ext_Elf64_Off sh_offset;
+ __ext_Elf64_Xword sh_size;
+ __ext_Elf64_Word sh_link;
+ __ext_Elf64_Word sh_info;
+ __ext_Elf64_Xword sh_addralign;
+ __ext_Elf64_Xword sh_entsize;
+} __ext_Elf64_Shdr;
+#endif /* __LIBELF64 */
+
+/*
+ * Symbol table
+ */
+typedef struct {
+ __ext_Elf32_Word st_name;
+ __ext_Elf32_Addr st_value;
+ __ext_Elf32_Word st_size;
+ unsigned char st_info;
+ unsigned char st_other;
+ __ext_Elf32_Half st_shndx;
+} __ext_Elf32_Sym;
+
+#if __LIBELF64
+typedef struct {
+ __ext_Elf64_Word st_name;
+ unsigned char st_info;
+ unsigned char st_other;
+ __ext_Elf64_Half st_shndx;
+ __ext_Elf64_Addr st_value;
+ __ext_Elf64_Xword st_size;
+} __ext_Elf64_Sym;
+#endif /* __LIBELF64 */
+
+/*
+ * Relocation
+ */
+typedef struct {
+ __ext_Elf32_Addr r_offset;
+ __ext_Elf32_Word r_info;
+} __ext_Elf32_Rel;
+
+typedef struct {
+ __ext_Elf32_Addr r_offset;
+ __ext_Elf32_Word r_info;
+ __ext_Elf32_Sword r_addend;
+} __ext_Elf32_Rela;
+
+#if __LIBELF64
+typedef struct {
+ __ext_Elf64_Addr r_offset;
+#if __LIBELF64_IRIX
+ __ext_Elf64_Word r_sym;
+ unsigned char r_ssym;
+ unsigned char r_type3;
+ unsigned char r_type2;
+ unsigned char r_type;
+#else /* __LIBELF64_IRIX */
+ __ext_Elf64_Xword r_info;
+#endif /* __LIBELF64_IRIX */
+} __ext_Elf64_Rel;
+
+typedef struct {
+ __ext_Elf64_Addr r_offset;
+#if __LIBELF64_IRIX
+ __ext_Elf64_Word r_sym;
+ unsigned char r_ssym;
+ unsigned char r_type3;
+ unsigned char r_type2;
+ unsigned char r_type;
+#else /* __LIBELF64_IRIX */
+ __ext_Elf64_Xword r_info;
+#endif /* __LIBELF64_IRIX */
+ __ext_Elf64_Sxword r_addend;
+} __ext_Elf64_Rela;
+#endif /* __LIBELF64 */
+
+/*
+ * Program header
+ */
+typedef struct {
+ __ext_Elf32_Word p_type;
+ __ext_Elf32_Off p_offset;
+ __ext_Elf32_Addr p_vaddr;
+ __ext_Elf32_Addr p_paddr;
+ __ext_Elf32_Word p_filesz;
+ __ext_Elf32_Word p_memsz;
+ __ext_Elf32_Word p_flags;
+ __ext_Elf32_Word p_align;
+} __ext_Elf32_Phdr;
+
+#if __LIBELF64
+typedef struct {
+ __ext_Elf64_Word p_type;
+ __ext_Elf64_Word p_flags;
+ __ext_Elf64_Off p_offset;
+ __ext_Elf64_Addr p_vaddr;
+ __ext_Elf64_Addr p_paddr;
+ __ext_Elf64_Xword p_filesz;
+ __ext_Elf64_Xword p_memsz;
+ __ext_Elf64_Xword p_align;
+} __ext_Elf64_Phdr;
+#endif /* __LIBELF64 */
+
+/*
+ * Dynamic structure
+ */
+typedef struct {
+ __ext_Elf32_Sword d_tag;
+ union {
+ __ext_Elf32_Word d_val;
+ __ext_Elf32_Addr d_ptr;
+ } d_un;
+} __ext_Elf32_Dyn;
+
+#if __LIBELF64
+typedef struct {
+ __ext_Elf64_Sxword d_tag;
+ union {
+ __ext_Elf64_Xword d_val;
+ __ext_Elf64_Addr d_ptr;
+ } d_un;
+} __ext_Elf64_Dyn;
+#endif /* __LIBELF64 */
+
+/*
+ * Version definitions
+ */
+typedef struct {
+ __ext_Elf32_Half vd_version;
+ __ext_Elf32_Half vd_flags;
+ __ext_Elf32_Half vd_ndx;
+ __ext_Elf32_Half vd_cnt;
+ __ext_Elf32_Word vd_hash;
+ __ext_Elf32_Word vd_aux;
+ __ext_Elf32_Word vd_next;
+} __ext_Elf32_Verdef;
+
+typedef struct {
+ __ext_Elf32_Word vda_name;
+ __ext_Elf32_Word vda_next;
+} __ext_Elf32_Verdaux;
+
+typedef struct {
+ __ext_Elf32_Half vn_version;
+ __ext_Elf32_Half vn_cnt;
+ __ext_Elf32_Word vn_file;
+ __ext_Elf32_Word vn_aux;
+ __ext_Elf32_Word vn_next;
+} __ext_Elf32_Verneed;
+
+typedef struct {
+ __ext_Elf32_Word vna_hash;
+ __ext_Elf32_Half vna_flags;
+ __ext_Elf32_Half vna_other;
+ __ext_Elf32_Word vna_name;
+ __ext_Elf32_Word vna_next;
+} __ext_Elf32_Vernaux;
+
+#if __LIBELF64
+
+typedef struct {
+ __ext_Elf64_Half vd_version;
+ __ext_Elf64_Half vd_flags;
+ __ext_Elf64_Half vd_ndx;
+ __ext_Elf64_Half vd_cnt;
+ __ext_Elf64_Word vd_hash;
+ __ext_Elf64_Word vd_aux;
+ __ext_Elf64_Word vd_next;
+} __ext_Elf64_Verdef;
+
+typedef struct {
+ __ext_Elf64_Word vda_name;
+ __ext_Elf64_Word vda_next;
+} __ext_Elf64_Verdaux;
+
+typedef struct {
+ __ext_Elf64_Half vn_version;
+ __ext_Elf64_Half vn_cnt;
+ __ext_Elf64_Word vn_file;
+ __ext_Elf64_Word vn_aux;
+ __ext_Elf64_Word vn_next;
+} __ext_Elf64_Verneed;
+
+typedef struct {
+ __ext_Elf64_Word vna_hash;
+ __ext_Elf64_Half vna_flags;
+ __ext_Elf64_Half vna_other;
+ __ext_Elf64_Word vna_name;
+ __ext_Elf64_Word vna_next;
+} __ext_Elf64_Vernaux;
+
+#endif /* __LIBELF64 */
+
+/*
+ * Move section
+ */
+#if __LIBELF64
+
+typedef struct {
+ __ext_Elf32_Lword m_value;
+ __ext_Elf32_Word m_info;
+ __ext_Elf32_Word m_poffset;
+ __ext_Elf32_Half m_repeat;
+ __ext_Elf32_Half m_stride;
+} __ext_Elf32_Move;
+
+typedef struct {
+ __ext_Elf64_Lword m_value;
+ __ext_Elf64_Xword m_info;
+ __ext_Elf64_Xword m_poffset;
+ __ext_Elf64_Half m_repeat;
+ __ext_Elf64_Half m_stride;
+} __ext_Elf64_Move;
+
+#endif /* __LIBELF64 */
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _EXT_TYPES_H */
diff --git a/lib/fill.c b/lib/fill.c
new file mode 100644
index 0000000..e64cc14
--- /dev/null
+++ b/lib/fill.c
@@ -0,0 +1,29 @@
+/*
+fill.c - implementation of the elf_fill(3) function.
+Copyright (C) 1995 - 1998 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: fill.c,v 1.7 2008/05/23 08:15:34 michael Exp $";
+#endif /* lint */
+
+void
+elf_fill(int fill) {
+ _elf_fill = fill;
+}
diff --git a/lib/flag.c b/lib/flag.c
new file mode 100644
index 0000000..1845ff9
--- /dev/null
+++ b/lib/flag.c
@@ -0,0 +1,92 @@
+/*
+flag.c - implementation of the elf_flag*(3) functions.
+Copyright (C) 1995 - 1998 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: flag.c,v 1.7 2008/05/23 08:15:34 michael Exp $";
+#endif /* lint */
+
+static unsigned
+_elf_flag(unsigned *f, Elf_Cmd cmd, unsigned flags) {
+ if (cmd == ELF_C_SET) {
+ return *f |= flags;
+ }
+ if (cmd == ELF_C_CLR) {
+ return *f &= ~flags;
+ }
+ seterr(ERROR_INVALID_CMD);
+ return 0;
+}
+
+unsigned
+elf_flagdata(Elf_Data *data, Elf_Cmd cmd, unsigned flags) {
+ Scn_Data *sd = (Scn_Data*)data;
+
+ if (!sd) {
+ return 0;
+ }
+ elf_assert(sd->sd_magic == DATA_MAGIC);
+ return _elf_flag(&sd->sd_data_flags, cmd, flags);
+}
+
+unsigned
+elf_flagehdr(Elf *elf, Elf_Cmd cmd, unsigned flags) {
+ if (!elf) {
+ return 0;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ return _elf_flag(&elf->e_ehdr_flags, cmd, flags);
+}
+
+unsigned
+elf_flagelf(Elf *elf, Elf_Cmd cmd, unsigned flags) {
+ if (!elf) {
+ return 0;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ return _elf_flag(&elf->e_elf_flags, cmd, flags);
+}
+
+unsigned
+elf_flagphdr(Elf *elf, Elf_Cmd cmd, unsigned flags) {
+ if (!elf) {
+ return 0;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ return _elf_flag(&elf->e_phdr_flags, cmd, flags);
+}
+
+unsigned
+elf_flagscn(Elf_Scn *scn, Elf_Cmd cmd, unsigned flags) {
+ if (!scn) {
+ return 0;
+ }
+ elf_assert(scn->s_magic == SCN_MAGIC);
+ return _elf_flag(&scn->s_scn_flags, cmd, flags);
+}
+
+unsigned
+elf_flagshdr(Elf_Scn *scn, Elf_Cmd cmd, unsigned flags) {
+ if (!scn) {
+ return 0;
+ }
+ elf_assert(scn->s_magic == SCN_MAGIC);
+ return _elf_flag(&scn->s_shdr_flags, cmd, flags);
+}
diff --git a/lib/gelf.h b/lib/gelf.h
new file mode 100644
index 0000000..5af0558
--- /dev/null
+++ b/lib/gelf.h
@@ -0,0 +1,155 @@
+/*
+ * gelf.h - public header file for libelf.
+ * Copyright (C) 2000 - 2006 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+/* @(#) $Id: gelf.h,v 1.16 2008/05/23 08:15:34 michael Exp $ */
+
+#ifndef _GELF_H
+#define _GELF_H
+
+#if __LIBELF_INTERNAL__
+#include <libelf.h>
+#else /* __LIBELF_INTERNAL__ */
+#include <libelf/libelf.h>
+#endif /* __LIBELF_INTERNAL__ */
+
+#if __LIBELF_NEED_LINK_H
+#include <link.h>
+#elif __LIBELF_NEED_SYS_LINK_H
+#include <sys/link.h>
+#endif /* __LIBELF_NEED_LINK_H */
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#ifndef __P
+# if (__STDC__ + 0) || defined(__cplusplus) || defined(_WIN32)
+# define __P(args) args
+# else /* __STDC__ || defined(__cplusplus) */
+# define __P(args) ()
+# endif /* __STDC__ || defined(__cplusplus) */
+#endif /* __P */
+
+#if !__LIBELF64
+
+#error "GElf is not supported on this system."
+
+#else /* __LIBELF64 */
+
+typedef Elf64_Addr GElf_Addr;
+typedef Elf64_Half GElf_Half;
+typedef Elf64_Off GElf_Off;
+typedef Elf64_Sword GElf_Sword;
+typedef Elf64_Word GElf_Word;
+typedef Elf64_Sxword GElf_Sxword;
+typedef Elf64_Xword GElf_Xword;
+
+typedef Elf64_Ehdr GElf_Ehdr;
+typedef Elf64_Phdr GElf_Phdr;
+typedef Elf64_Shdr GElf_Shdr;
+typedef Elf64_Dyn GElf_Dyn;
+typedef Elf64_Rel GElf_Rel;
+typedef Elf64_Rela GElf_Rela;
+typedef Elf64_Sym GElf_Sym;
+
+/*
+ * Symbol versioning
+ */
+#if __LIBELF_SYMBOL_VERSIONS
+typedef Elf64_Verdef GElf_Verdef;
+typedef Elf64_Verneed GElf_Verneed;
+typedef Elf64_Verdaux GElf_Verdaux;
+typedef Elf64_Vernaux GElf_Vernaux;
+#endif /* __LIBELF_SYMBOL_VERSIONS */
+
+/*
+ * These types aren't implemented (yet)
+ *
+typedef Elf64_Move GElf_Move;
+typedef Elf64_Syminfo GElf_Syminfo;
+ */
+
+/*
+ * Generic macros
+ */
+#define GELF_ST_BIND ELF64_ST_BIND
+#define GELF_ST_TYPE ELF64_ST_TYPE
+#define GELF_ST_INFO ELF64_ST_INFO
+
+#define GELF_R_TYPE ELF64_R_TYPE
+#define GELF_R_SYM ELF64_R_SYM
+#define GELF_R_INFO ELF64_R_INFO
+
+/*
+ * Function declarations
+ */
+extern int gelf_getclass __P((Elf *__elf));
+
+extern size_t gelf_fsize __P((Elf *__elf, Elf_Type __type, size_t __count, unsigned __ver));
+
+extern Elf_Data *gelf_xlatetof __P((Elf *__elf, Elf_Data *__dst, const Elf_Data *__src, unsigned __encode));
+extern Elf_Data *gelf_xlatetom __P((Elf *__elf, Elf_Data *__dst, const Elf_Data *__src, unsigned __encode));
+
+extern GElf_Ehdr *gelf_getehdr __P((Elf *__elf, GElf_Ehdr *__dst));
+extern int gelf_update_ehdr __P((Elf *__elf, GElf_Ehdr *__src));
+extern unsigned long gelf_newehdr __P((Elf *__elf, int __elfclass));
+
+extern GElf_Phdr *gelf_getphdr __P((Elf *__elf, int ndx, GElf_Phdr *__dst));
+extern int gelf_update_phdr __P((Elf *__elf, int ndx, GElf_Phdr *__src));
+extern unsigned long gelf_newphdr __P((Elf *__elf, size_t __phnum));
+
+extern GElf_Shdr *gelf_getshdr __P((Elf_Scn *__scn, GElf_Shdr *__dst));
+extern int gelf_update_shdr __P((Elf_Scn *__scn, GElf_Shdr *__src));
+
+extern GElf_Dyn *gelf_getdyn __P((Elf_Data *__src, int __ndx, GElf_Dyn *__dst));
+extern int gelf_update_dyn __P((Elf_Data *__dst, int __ndx, GElf_Dyn *__src));
+
+extern GElf_Rel *gelf_getrel __P((Elf_Data *__src, int __ndx, GElf_Rel *__dst));
+extern int gelf_update_rel __P((Elf_Data *__dst, int __ndx, GElf_Rel *__src));
+
+extern GElf_Rela *gelf_getrela __P((Elf_Data *__src, int __ndx, GElf_Rela *__dst));
+extern int gelf_update_rela __P((Elf_Data *__dst, int __ndx, GElf_Rela *__src));
+
+extern GElf_Sym *gelf_getsym __P((Elf_Data *__src, int __ndx, GElf_Sym *__dst));
+extern int gelf_update_sym __P((Elf_Data *__dst, int __ndx, GElf_Sym *__src));
+
+extern long gelf_checksum __P((Elf *__elf));
+
+/*
+ * These functions aren't implemented (yet)
+ *
+extern GElf_Move *gelf_getmove __P((Elf_Data *__src, int __ndx, GElf_Move *__src));
+extern int gelf_update_move __P((Elf_Data *__dst, int __ndx, GElf_Move *__src));
+ *
+extern GElf_Syminfo* gelf_getsyminfo __P((Elf_Data *__src, int __ndx, GElf_Syminfo *__dst));
+extern int gelf_update_syminfo __P((Elf_Data *__dst, int __ndx, GElf_Syminfo *__src));
+ */
+
+/*
+ * Extensions (not available in other versions of libelf)
+ */
+extern size_t gelf_msize __P((Elf *__elf, Elf_Type __type, size_t __count, unsigned __ver));
+
+#endif /* __LIBELF64 */
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _GELF_H */
diff --git a/lib/gelfehdr.c b/lib/gelfehdr.c
new file mode 100644
index 0000000..fa7c019
--- /dev/null
+++ b/lib/gelfehdr.c
@@ -0,0 +1,140 @@
+/*
+ * gelfehdr.c - gelf_* translation functions.
+ * Copyright (C) 2000 - 2006 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <private.h>
+
+#if __LIBELF64
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: gelfehdr.c,v 1.9 2008/05/23 08:15:34 michael Exp $";
+#endif /* lint */
+
+#define check_and_copy(type, d, s, name, eret) \
+ do { \
+ if (sizeof((d)->name) < sizeof((s)->name) \
+ && (type)(s)->name != (s)->name) { \
+ seterr(ERROR_BADVALUE); \
+ return (eret); \
+ } \
+ (d)->name = (type)(s)->name; \
+ } while (0)
+
+GElf_Ehdr*
+gelf_getehdr(Elf *elf, GElf_Ehdr *dst) {
+ GElf_Ehdr buf;
+ char *tmp;
+
+ if (!elf) {
+ return NULL;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ tmp = _elf_getehdr(elf, elf->e_class);
+ if (!tmp) {
+ return NULL;
+ }
+ if (!dst) {
+ dst = &buf;
+ }
+ if (elf->e_class == ELFCLASS64) {
+ *dst = *(Elf64_Ehdr*)tmp;
+ }
+ else if (elf->e_class == ELFCLASS32) {
+ Elf32_Ehdr *src = (Elf32_Ehdr*)tmp;
+
+ memcpy(dst->e_ident, src->e_ident, EI_NIDENT);
+ check_and_copy(GElf_Half, dst, src, e_type, NULL);
+ check_and_copy(GElf_Half, dst, src, e_machine, NULL);
+ check_and_copy(GElf_Word, dst, src, e_version, NULL);
+ check_and_copy(GElf_Addr, dst, src, e_entry, NULL);
+ check_and_copy(GElf_Off, dst, src, e_phoff, NULL);
+ check_and_copy(GElf_Off, dst, src, e_shoff, NULL);
+ check_and_copy(GElf_Word, dst, src, e_flags, NULL);
+ check_and_copy(GElf_Half, dst, src, e_ehsize, NULL);
+ check_and_copy(GElf_Half, dst, src, e_phentsize, NULL);
+ check_and_copy(GElf_Half, dst, src, e_phnum, NULL);
+ check_and_copy(GElf_Half, dst, src, e_shentsize, NULL);
+ check_and_copy(GElf_Half, dst, src, e_shnum, NULL);
+ check_and_copy(GElf_Half, dst, src, e_shstrndx, NULL);
+ }
+ else {
+ if (valid_class(elf->e_class)) {
+ seterr(ERROR_UNIMPLEMENTED);
+ }
+ else {
+ seterr(ERROR_UNKNOWN_CLASS);
+ }
+ return NULL;
+ }
+ if (dst == &buf) {
+ dst = (GElf_Ehdr*)malloc(sizeof(GElf_Ehdr));
+ if (!dst) {
+ seterr(ERROR_MEM_EHDR);
+ return NULL;
+ }
+ *dst = buf;
+ }
+ return dst;
+}
+
+int
+gelf_update_ehdr(Elf *elf, GElf_Ehdr *src) {
+ char *tmp;
+
+ if (!elf || !src) {
+ return 0;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ tmp = _elf_getehdr(elf, elf->e_class);
+ if (!tmp) {
+ return 0;
+ }
+ if (elf->e_class == ELFCLASS64) {
+ *(Elf64_Ehdr*)tmp = *src;
+ }
+ else if (elf->e_class == ELFCLASS32) {
+ Elf32_Ehdr *dst = (Elf32_Ehdr*)tmp;
+
+ memcpy(dst->e_ident, src->e_ident, EI_NIDENT);
+ check_and_copy(Elf32_Half, dst, src, e_type, 0);
+ check_and_copy(Elf32_Half, dst, src, e_machine, 0);
+ check_and_copy(Elf32_Word, dst, src, e_version, 0);
+ check_and_copy(Elf32_Addr, dst, src, e_entry, 0);
+ check_and_copy(Elf32_Off, dst, src, e_phoff, 0);
+ check_and_copy(Elf32_Off, dst, src, e_shoff, 0);
+ check_and_copy(Elf32_Word, dst, src, e_flags, 0);
+ check_and_copy(Elf32_Half, dst, src, e_ehsize, 0);
+ check_and_copy(Elf32_Half, dst, src, e_phentsize, 0);
+ check_and_copy(Elf32_Half, dst, src, e_phnum, 0);
+ check_and_copy(Elf32_Half, dst, src, e_shentsize, 0);
+ check_and_copy(Elf32_Half, dst, src, e_shnum, 0);
+ check_and_copy(Elf32_Half, dst, src, e_shstrndx, 0);
+ }
+ else {
+ if (valid_class(elf->e_class)) {
+ seterr(ERROR_UNIMPLEMENTED);
+ }
+ else {
+ seterr(ERROR_UNKNOWN_CLASS);
+ }
+ return 0;
+ }
+ return 1;
+}
+
+#endif /* __LIBELF64 */
diff --git a/lib/gelfphdr.c b/lib/gelfphdr.c
new file mode 100644
index 0000000..2635b4a
--- /dev/null
+++ b/lib/gelfphdr.c
@@ -0,0 +1,148 @@
+/*
+ * gelfphdr.c - gelf_* translation functions.
+ * Copyright (C) 2000 - 2006 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <private.h>
+
+#if __LIBELF64
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: gelfphdr.c,v 1.9 2008/05/23 08:15:34 michael Exp $";
+#endif /* lint */
+
+#define check_and_copy(type, d, s, name, eret) \
+ do { \
+ if (sizeof((d)->name) < sizeof((s)->name) \
+ && (type)(s)->name != (s)->name) { \
+ seterr(ERROR_BADVALUE); \
+ return (eret); \
+ } \
+ (d)->name = (type)(s)->name; \
+ } while (0)
+
+GElf_Phdr*
+gelf_getphdr(Elf *elf, int ndx, GElf_Phdr *dst) {
+ GElf_Phdr buf;
+ char *tmp;
+ size_t n;
+
+ if (!elf) {
+ return NULL;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ tmp = _elf_getphdr(elf, elf->e_class);
+ if (!tmp) {
+ return NULL;
+ }
+ if (ndx < 0 || ndx >= elf->e_phnum) {
+ seterr(ERROR_BADINDEX);
+ return NULL;
+ }
+ n = _msize(elf->e_class, _elf_version, ELF_T_PHDR);
+ if (n == 0) {
+ seterr(ERROR_UNIMPLEMENTED);
+ return NULL;
+ }
+ if (!dst) {
+ dst = &buf;
+ }
+ if (elf->e_class == ELFCLASS64) {
+ *dst = *(Elf64_Phdr*)(tmp + ndx * n);
+ }
+ else if (elf->e_class == ELFCLASS32) {
+ Elf32_Phdr *src = (Elf32_Phdr*)(tmp + ndx * n);
+
+ check_and_copy(GElf_Word, dst, src, p_type, NULL);
+ check_and_copy(GElf_Word, dst, src, p_flags, NULL);
+ check_and_copy(GElf_Off, dst, src, p_offset, NULL);
+ check_and_copy(GElf_Addr, dst, src, p_vaddr, NULL);
+ check_and_copy(GElf_Addr, dst, src, p_paddr, NULL);
+ check_and_copy(GElf_Xword, dst, src, p_filesz, NULL);
+ check_and_copy(GElf_Xword, dst, src, p_memsz, NULL);
+ check_and_copy(GElf_Xword, dst, src, p_align, NULL);
+ }
+ else {
+ if (valid_class(elf->e_class)) {
+ seterr(ERROR_UNIMPLEMENTED);
+ }
+ else {
+ seterr(ERROR_UNKNOWN_CLASS);
+ }
+ return NULL;
+ }
+ if (dst == &buf) {
+ dst = (GElf_Phdr*)malloc(sizeof(GElf_Phdr));
+ if (!dst) {
+ seterr(ERROR_MEM_PHDR);
+ return NULL;
+ }
+ *dst = buf;
+ }
+ return dst;
+}
+
+int
+gelf_update_phdr(Elf *elf, int ndx, GElf_Phdr *src) {
+ char *tmp;
+ size_t n;
+
+ if (!elf || !src) {
+ return 0;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ tmp = _elf_getphdr(elf, elf->e_class);
+ if (!tmp) {
+ return 0;
+ }
+ if (ndx < 0 || ndx >= elf->e_phnum) {
+ seterr(ERROR_BADINDEX);
+ return 0;
+ }
+ n = _msize(elf->e_class, _elf_version, ELF_T_PHDR);
+ if (n == 0) {
+ seterr(ERROR_UNIMPLEMENTED);
+ return 0;
+ }
+ if (elf->e_class == ELFCLASS64) {
+ *(Elf64_Phdr*)(tmp + ndx * n) = *src;
+ }
+ else if (elf->e_class == ELFCLASS32) {
+ Elf32_Phdr *dst = (Elf32_Phdr*)(tmp + ndx * n);
+
+ check_and_copy(Elf32_Word, dst, src, p_type, 0);
+ check_and_copy(Elf32_Off, dst, src, p_offset, 0);
+ check_and_copy(Elf32_Addr, dst, src, p_vaddr, 0);
+ check_and_copy(Elf32_Addr, dst, src, p_paddr, 0);
+ check_and_copy(Elf32_Word, dst, src, p_filesz, 0);
+ check_and_copy(Elf32_Word, dst, src, p_memsz, 0);
+ check_and_copy(Elf32_Word, dst, src, p_flags, 0);
+ check_and_copy(Elf32_Word, dst, src, p_align, 0);
+ }
+ else {
+ if (valid_class(elf->e_class)) {
+ seterr(ERROR_UNIMPLEMENTED);
+ }
+ else {
+ seterr(ERROR_UNKNOWN_CLASS);
+ }
+ return 0;
+ }
+ return 1;
+}
+
+#endif /* __LIBELF64 */
diff --git a/lib/gelfshdr.c b/lib/gelfshdr.c
new file mode 100644
index 0000000..c295c18
--- /dev/null
+++ b/lib/gelfshdr.c
@@ -0,0 +1,125 @@
+/*
+ * gelfshdr.c - gelf_* translation functions.
+ * Copyright (C) 2000 - 2006 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <private.h>
+
+#if __LIBELF64
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: gelfshdr.c,v 1.10 2008/05/23 08:15:34 michael Exp $";
+#endif /* lint */
+
+#define check_and_copy(type, d, s, name, eret) \
+ do { \
+ if (sizeof((d)->name) < sizeof((s)->name) \
+ && (type)(s)->name != (s)->name) { \
+ seterr(ERROR_BADVALUE); \
+ return (eret); \
+ } \
+ (d)->name = (type)(s)->name; \
+ } while (0)
+
+GElf_Shdr*
+gelf_getshdr(Elf_Scn *scn, GElf_Shdr *dst) {
+ GElf_Shdr buf;
+
+ if (!scn) {
+ return NULL;
+ }
+ elf_assert(scn->s_magic == SCN_MAGIC);
+ elf_assert(scn->s_elf);
+ elf_assert(scn->s_elf->e_magic == ELF_MAGIC);
+ if (!dst) {
+ dst = &buf;
+ }
+ if (scn->s_elf->e_class == ELFCLASS64) {
+ *dst = scn->s_shdr64;
+ }
+ else if (scn->s_elf->e_class == ELFCLASS32) {
+ Elf32_Shdr *src = &scn->s_shdr32;
+
+ check_and_copy(GElf_Word, dst, src, sh_name, NULL);
+ check_and_copy(GElf_Word, dst, src, sh_type, NULL);
+ check_and_copy(GElf_Xword, dst, src, sh_flags, NULL);
+ check_and_copy(GElf_Addr, dst, src, sh_addr, NULL);
+ check_and_copy(GElf_Off, dst, src, sh_offset, NULL);
+ check_and_copy(GElf_Xword, dst, src, sh_size, NULL);
+ check_and_copy(GElf_Word, dst, src, sh_link, NULL);
+ check_and_copy(GElf_Word, dst, src, sh_info, NULL);
+ check_and_copy(GElf_Xword, dst, src, sh_addralign, NULL);
+ check_and_copy(GElf_Xword, dst, src, sh_entsize, NULL);
+ }
+ else {
+ if (valid_class(scn->s_elf->e_class)) {
+ seterr(ERROR_UNIMPLEMENTED);
+ }
+ else {
+ seterr(ERROR_UNKNOWN_CLASS);
+ }
+ return NULL;
+ }
+ if (dst == &buf) {
+ dst = (GElf_Shdr*)malloc(sizeof(GElf_Shdr));
+ if (!dst) {
+ seterr(ERROR_MEM_SHDR);
+ return NULL;
+ }
+ *dst = buf;
+ }
+ return dst;
+}
+
+int
+gelf_update_shdr(Elf_Scn *scn, GElf_Shdr *src) {
+ if (!scn || !src) {
+ return 0;
+ }
+ elf_assert(scn->s_magic == SCN_MAGIC);
+ elf_assert(scn->s_elf);
+ elf_assert(scn->s_elf->e_magic == ELF_MAGIC);
+ if (scn->s_elf->e_class == ELFCLASS64) {
+ scn->s_shdr64 = *src;
+ }
+ else if (scn->s_elf->e_class == ELFCLASS32) {
+ Elf32_Shdr *dst = &scn->s_shdr32;
+
+ check_and_copy(Elf32_Word, dst, src, sh_name, 0);
+ check_and_copy(Elf32_Word, dst, src, sh_type, 0);
+ check_and_copy(Elf32_Word, dst, src, sh_flags, 0);
+ check_and_copy(Elf32_Addr, dst, src, sh_addr, 0);
+ check_and_copy(Elf32_Off, dst, src, sh_offset, 0);
+ check_and_copy(Elf32_Word, dst, src, sh_size, 0);
+ check_and_copy(Elf32_Word, dst, src, sh_link, 0);
+ check_and_copy(Elf32_Word, dst, src, sh_info, 0);
+ check_and_copy(Elf32_Word, dst, src, sh_addralign, 0);
+ check_and_copy(Elf32_Word, dst, src, sh_entsize, 0);
+ }
+ else {
+ if (valid_class(scn->s_elf->e_class)) {
+ seterr(ERROR_UNIMPLEMENTED);
+ }
+ else {
+ seterr(ERROR_UNKNOWN_CLASS);
+ }
+ return 0;
+ }
+ return 1;
+}
+
+#endif /* __LIBELF64 */
diff --git a/lib/gelftrans.c b/lib/gelftrans.c
new file mode 100644
index 0000000..dcd0cdd
--- /dev/null
+++ b/lib/gelftrans.c
@@ -0,0 +1,407 @@
+/*
+gelftrans.c - gelf_* translation functions.
+Copyright (C) 2000 - 2001 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+
+#if __LIBELF64
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: gelftrans.c,v 1.10 2008/05/23 08:15:34 michael Exp $";
+#endif /* lint */
+
+#define check_and_copy(type, d, s, name, eret) \
+ do { \
+ if (sizeof((d)->name) < sizeof((s)->name) \
+ && (type)(s)->name != (s)->name) { \
+ seterr(ERROR_BADVALUE); \
+ return (eret); \
+ } \
+ (d)->name = (type)(s)->name; \
+ } while (0)
+
+/*
+ * These macros are missing on some Linux systems
+ */
+#if !defined(ELF32_R_SYM) || !defined(ELF32_R_TYPE) || !defined(ELF32_R_INFO)
+# undef ELF32_R_SYM
+# undef ELF32_R_TYPE
+# undef ELF32_R_INFO
+# define ELF32_R_SYM(i) ((i)>>8)
+# define ELF32_R_TYPE(i) ((unsigned char)(i))
+# define ELF32_R_INFO(s,t) (((s)<<8)+(unsigned char)(t))
+#endif /* !defined(...) */
+
+#if !defined(ELF64_R_SYM) || !defined(ELF64_R_TYPE) || !defined(ELF64_R_INFO)
+# undef ELF64_R_SYM
+# undef ELF64_R_TYPE
+# undef ELF64_R_INFO
+# define ELF64_R_SYM(i) ((i)>>32)
+# define ELF64_R_TYPE(i) ((i)&0xffffffffL)
+# define ELF64_R_INFO(s,t) (((Elf64_Xword)(s)<<32)+((t)&0xffffffffL))
+#endif /* !defined(...) */
+
+static char*
+get_addr_and_class(const Elf_Data *data, int ndx, Elf_Type type, unsigned *cls) {
+ Scn_Data *sd = (Scn_Data*)data;
+ Elf_Scn *scn;
+ Elf *elf;
+ size_t n;
+
+ if (!sd) {
+ return NULL;
+ }
+ elf_assert(sd->sd_magic == DATA_MAGIC);
+ scn = sd->sd_scn;
+ elf_assert(scn);
+ elf_assert(scn->s_magic == SCN_MAGIC);
+ elf = scn->s_elf;
+ elf_assert(elf);
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ if (elf->e_kind != ELF_K_ELF) {
+ seterr(ERROR_NOTELF);
+ return NULL;
+ }
+ if (!valid_class(elf->e_class)) {
+ seterr(ERROR_UNKNOWN_CLASS);
+ return NULL;
+ }
+ if (data->d_type != type) {
+ seterr(ERROR_BADTYPE);
+ return NULL;
+ }
+ n = _msize(elf->e_class, data->d_version, type);
+ if (n == 0) {
+ seterr(ERROR_UNIMPLEMENTED);
+ return NULL;
+ }
+ if (ndx < 0 || data->d_size < (ndx + 1) * n) {
+ seterr(ERROR_BADINDEX);
+ return NULL;
+ }
+ if (!data->d_buf) {
+ seterr(ERROR_NULLBUF);
+ return NULL;
+ }
+ if (cls) {
+ *cls = elf->e_class;
+ }
+ return (char*)data->d_buf + n * ndx;
+}
+
+GElf_Sym*
+gelf_getsym(Elf_Data *src, int ndx, GElf_Sym *dst) {
+ GElf_Sym buf;
+ unsigned cls;
+ char *tmp;
+
+ if (!dst) {
+ dst = &buf;
+ }
+ tmp = get_addr_and_class(src, ndx, ELF_T_SYM, &cls);
+ if (!tmp) {
+ return NULL;
+ }
+ if (cls == ELFCLASS64) {
+ *dst = *(Elf64_Sym*)tmp;
+ }
+ else if (cls == ELFCLASS32) {
+ Elf32_Sym *src = (Elf32_Sym*)tmp;
+
+ check_and_copy(GElf_Word, dst, src, st_name, NULL);
+ check_and_copy(unsigned char, dst, src, st_info, NULL);
+ check_and_copy(unsigned char, dst, src, st_other, NULL);
+ check_and_copy(GElf_Half, dst, src, st_shndx, NULL);
+ check_and_copy(GElf_Addr, dst, src, st_value, NULL);
+ check_and_copy(GElf_Xword, dst, src, st_size, NULL);
+ }
+ else {
+ seterr(ERROR_UNIMPLEMENTED);
+ return NULL;
+ }
+ if (dst == &buf) {
+ dst = (GElf_Sym*)malloc(sizeof(GElf_Sym));
+ if (!dst) {
+ seterr(ERROR_MEM_SYM);
+ return NULL;
+ }
+ *dst = buf;
+ }
+ return dst;
+}
+
+int
+gelf_update_sym(Elf_Data *dst, int ndx, GElf_Sym *src) {
+ unsigned cls;
+ char *tmp;
+
+ tmp = get_addr_and_class(dst, ndx, ELF_T_SYM, &cls);
+ if (!tmp) {
+ return 0;
+ }
+ if (cls == ELFCLASS64) {
+ *(Elf64_Sym*)tmp = *src;
+ }
+ else if (cls == ELFCLASS32) {
+ Elf32_Sym *dst = (Elf32_Sym*)tmp;
+
+ check_and_copy(Elf32_Word, dst, src, st_name, 0);
+ check_and_copy(Elf32_Addr, dst, src, st_value, 0);
+ check_and_copy(Elf32_Word, dst, src, st_size, 0);
+ check_and_copy(unsigned char, dst, src, st_info, 0);
+ check_and_copy(unsigned char, dst, src, st_other, 0);
+ check_and_copy(Elf32_Half, dst, src, st_shndx, 0);
+ }
+ else {
+ seterr(ERROR_UNIMPLEMENTED);
+ return 0;
+ }
+ return 1;
+}
+
+GElf_Dyn*
+gelf_getdyn(Elf_Data *src, int ndx, GElf_Dyn *dst) {
+ GElf_Dyn buf;
+ unsigned cls;
+ char *tmp;
+
+ if (!dst) {
+ dst = &buf;
+ }
+ tmp = get_addr_and_class(src, ndx, ELF_T_DYN, &cls);
+ if (!tmp) {
+ return NULL;
+ }
+ if (cls == ELFCLASS64) {
+ *dst = *(Elf64_Dyn*)tmp;
+ }
+ else if (cls == ELFCLASS32) {
+ Elf32_Dyn *src = (Elf32_Dyn*)tmp;
+
+ check_and_copy(GElf_Sxword, dst, src, d_tag, NULL);
+ check_and_copy(GElf_Xword, dst, src, d_un.d_val, NULL);
+ }
+ else {
+ seterr(ERROR_UNIMPLEMENTED);
+ return NULL;
+ }
+ if (dst == &buf) {
+ dst = (GElf_Dyn*)malloc(sizeof(GElf_Dyn));
+ if (!dst) {
+ seterr(ERROR_MEM_DYN);
+ return NULL;
+ }
+ *dst = buf;
+ }
+ return dst;
+}
+
+int
+gelf_update_dyn(Elf_Data *dst, int ndx, GElf_Dyn *src) {
+ unsigned cls;
+ char *tmp;
+
+ tmp = get_addr_and_class(dst, ndx, ELF_T_DYN, &cls);
+ if (!tmp) {
+ return 0;
+ }
+ if (cls == ELFCLASS64) {
+ *(Elf64_Dyn*)tmp = *src;
+ }
+ else if (cls == ELFCLASS32) {
+ Elf32_Dyn *dst = (Elf32_Dyn*)tmp;
+
+ check_and_copy(Elf32_Sword, dst, src, d_tag, 0);
+ check_and_copy(Elf32_Word, dst, src, d_un.d_val, 0);
+ }
+ else {
+ seterr(ERROR_UNIMPLEMENTED);
+ return 0;
+ }
+ return 1;
+}
+
+GElf_Rela*
+gelf_getrela(Elf_Data *src, int ndx, GElf_Rela *dst) {
+ GElf_Rela buf;
+ unsigned cls;
+ char *tmp;
+
+ if (!dst) {
+ dst = &buf;
+ }
+ tmp = get_addr_and_class(src, ndx, ELF_T_RELA, &cls);
+ if (!tmp) {
+ return NULL;
+ }
+ if (cls == ELFCLASS64) {
+ *dst = *(Elf64_Rela*)tmp;
+ }
+ else if (cls == ELFCLASS32) {
+ Elf32_Rela *src = (Elf32_Rela*)tmp;
+
+ check_and_copy(GElf_Addr, dst, src, r_offset, NULL);
+ dst->r_info = ELF64_R_INFO((Elf64_Xword)ELF32_R_SYM(src->r_info),
+ (Elf64_Xword)ELF32_R_TYPE(src->r_info));
+ check_and_copy(GElf_Sxword, dst, src, r_addend, NULL);
+ }
+ else {
+ seterr(ERROR_UNIMPLEMENTED);
+ return NULL;
+ }
+ if (dst == &buf) {
+ dst = (GElf_Rela*)malloc(sizeof(GElf_Rela));
+ if (!dst) {
+ seterr(ERROR_MEM_RELA);
+ return NULL;
+ }
+ *dst = buf;
+ }
+ return dst;
+}
+
+int
+gelf_update_rela(Elf_Data *dst, int ndx, GElf_Rela *src) {
+ unsigned cls;
+ char *tmp;
+
+ tmp = get_addr_and_class(dst, ndx, ELF_T_RELA, &cls);
+ if (!tmp) {
+ return 0;
+ }
+ if (cls == ELFCLASS64) {
+ *(Elf64_Rela*)tmp = *src;
+ }
+ else if (cls == ELFCLASS32) {
+ Elf32_Rela *dst = (Elf32_Rela*)tmp;
+
+ check_and_copy(Elf32_Addr, dst, src, r_offset, 0);
+ if (ELF64_R_SYM(src->r_info) > 0xffffffUL
+ || ELF64_R_TYPE(src->r_info) > 0xffUL) {
+ seterr(ERROR_BADVALUE);
+ return 0;
+ }
+ dst->r_info = ELF32_R_INFO((Elf32_Word)ELF64_R_SYM(src->r_info),
+ (Elf32_Word)ELF64_R_TYPE(src->r_info));
+ check_and_copy(Elf32_Sword, dst, src, r_addend, 0);
+ }
+ else {
+ seterr(ERROR_UNIMPLEMENTED);
+ return 0;
+ }
+ return 1;
+}
+
+GElf_Rel*
+gelf_getrel(Elf_Data *src, int ndx, GElf_Rel *dst) {
+ GElf_Rel buf;
+ unsigned cls;
+ char *tmp;
+
+ if (!dst) {
+ dst = &buf;
+ }
+ tmp = get_addr_and_class(src, ndx, ELF_T_REL, &cls);
+ if (!tmp) {
+ return NULL;
+ }
+ if (cls == ELFCLASS64) {
+ *dst = *(Elf64_Rel*)tmp;
+ }
+ else if (cls == ELFCLASS32) {
+ Elf32_Rel *src = (Elf32_Rel*)tmp;
+
+ check_and_copy(GElf_Addr, dst, src, r_offset, NULL);
+ dst->r_info = ELF64_R_INFO((Elf64_Xword)ELF32_R_SYM(src->r_info),
+ (Elf64_Xword)ELF32_R_TYPE(src->r_info));
+ }
+ else {
+ seterr(ERROR_UNIMPLEMENTED);
+ return NULL;
+ }
+ if (dst == &buf) {
+ dst = (GElf_Rel*)malloc(sizeof(GElf_Rel));
+ if (!dst) {
+ seterr(ERROR_MEM_REL);
+ return NULL;
+ }
+ *dst = buf;
+ }
+ return dst;
+}
+
+int
+gelf_update_rel(Elf_Data *dst, int ndx, GElf_Rel *src) {
+ unsigned cls;
+ char *tmp;
+
+ tmp = get_addr_and_class(dst, ndx, ELF_T_REL, &cls);
+ if (!tmp) {
+ return 0;
+ }
+ if (cls == ELFCLASS64) {
+ *(Elf64_Rel*)tmp = *src;
+ }
+ else if (cls == ELFCLASS32) {
+ Elf32_Rel *dst = (Elf32_Rel*)tmp;
+
+ check_and_copy(Elf32_Addr, dst, src, r_offset, 0);
+ if (ELF64_R_SYM(src->r_info) > 0xffffffUL
+ || ELF64_R_TYPE(src->r_info) > 0xffUL) {
+ seterr(ERROR_BADVALUE);
+ return 0;
+ }
+ dst->r_info = ELF32_R_INFO((Elf32_Word)ELF64_R_SYM(src->r_info),
+ (Elf32_Word)ELF64_R_TYPE(src->r_info));
+ }
+ else {
+ seterr(ERROR_UNIMPLEMENTED);
+ return 0;
+ }
+ return 1;
+}
+
+#if 0
+
+GElf_Syminfo*
+gelf_getsyminfo(Elf_Data *src, int ndx, GElf_Syminfo *dst) {
+ seterr(ERROR_UNIMPLEMENTED);
+ return NULL;
+}
+
+int
+gelf_update_syminfo(Elf_Data *dst, int ndx, GElf_Syminfo *src) {
+ seterr(ERROR_UNIMPLEMENTED);
+ return 0;
+}
+
+GElf_Move*
+gelf_getmove(Elf_Data *src, int ndx, GElf_Move *src) {
+ seterr(ERROR_UNIMPLEMENTED);
+ return NULL;
+}
+
+int
+gelf_update_move(Elf_Data *dst, int ndx, GElf_Move *src) {
+ seterr(ERROR_UNIMPLEMENTED);
+ return 0;
+}
+
+#endif
+
+#endif /* __LIBELF64 */
diff --git a/lib/getarhdr.c b/lib/getarhdr.c
new file mode 100644
index 0000000..874b337
--- /dev/null
+++ b/lib/getarhdr.c
@@ -0,0 +1,37 @@
+/*
+getarhdr.c - implementation of the elf_getarhdr(3) function.
+Copyright (C) 1995 - 1998 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: getarhdr.c,v 1.7 2008/05/23 08:15:34 michael Exp $";
+#endif /* lint */
+
+Elf_Arhdr*
+elf_getarhdr(Elf *elf) {
+ if (!elf) {
+ return NULL;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ if (elf->e_arhdr) {
+ return elf->e_arhdr;
+ }
+ seterr(ERROR_NOTARCHIVE);
+ return NULL;
+}
diff --git a/lib/getaroff.c b/lib/getaroff.c
new file mode 100644
index 0000000..fce977d
--- /dev/null
+++ b/lib/getaroff.c
@@ -0,0 +1,40 @@
+/*
+ * getaroff.c - implementation of the elf_getaroff(3) function.
+ * Copyright (C) 2009 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: getaroff.c,v 1.1 2009/11/01 13:04:19 michael Exp $";
+#endif /* lint */
+
+off_t
+elf_getaroff(Elf *elf) {
+ Elf *ref;
+
+ if (!elf) {
+ return (off_t)-1;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ if (!(ref = elf->e_parent)) {
+ return (off_t)-1;
+ }
+ elf_assert(ref->e_magic == ELF_MAGIC);
+ elf_assert(elf->e_base >= ref->e_base + SARMAG + sizeof(struct ar_hdr));
+ return (off_t)(elf->e_base - ref->e_base - sizeof(struct ar_hdr));
+}
diff --git a/lib/getarsym.c b/lib/getarsym.c
new file mode 100644
index 0000000..6069676
--- /dev/null
+++ b/lib/getarsym.c
@@ -0,0 +1,87 @@
+/*
+ * getarsym.c - implementation of the elf_getarsym(3) function.
+ * Copyright (C) 1995 - 1998, 2004 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <private.h>
+#include <byteswap.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: getarsym.c,v 1.9 2008/05/23 08:15:34 michael Exp $";
+#endif /* lint */
+
+Elf_Arsym*
+elf_getarsym(Elf *elf, size_t *ptr) {
+ Elf_Arsym *syms;
+ size_t count;
+ size_t tmp;
+ size_t i;
+ char *s;
+ char *e;
+
+ if (!ptr) {
+ ptr = &tmp;
+ }
+ *ptr = 0;
+ if (!elf) {
+ return NULL;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ if (elf->e_kind != ELF_K_AR) {
+ seterr(ERROR_NOTARCHIVE);
+ return NULL;
+ }
+ if (elf->e_symtab && !elf->e_free_syms) {
+ if (elf->e_symlen < 4) {
+ seterr(ERROR_SIZE_ARSYMTAB);
+ return NULL;
+ }
+ count = __load_u32M(elf->e_symtab);
+ if (elf->e_symlen < 4 * (count + 1)) {
+ seterr(ERROR_SIZE_ARSYMTAB);
+ return NULL;
+ }
+ if (!(syms = (Elf_Arsym*)malloc((count + 1) * sizeof(*syms)))) {
+ seterr(ERROR_MEM_ARSYMTAB);
+ return NULL;
+ }
+ s = elf->e_symtab + 4 * (count + 1);
+ e = elf->e_symtab + elf->e_symlen;
+ for (i = 0; i < count; i++, s++) {
+ syms[i].as_name = s;
+ while (s < e && *s) {
+ s++;
+ }
+ if (s >= e) {
+ seterr(ERROR_SIZE_ARSYMTAB);
+ free(syms);
+ return NULL;
+ }
+ elf_assert(!*s);
+ syms[i].as_hash = elf_hash((unsigned char*)syms[i].as_name);
+ syms[i].as_off = __load_u32M(elf->e_symtab + 4 * (i + 1));
+ }
+ syms[count].as_name = NULL;
+ syms[count].as_hash = ~0UL;
+ syms[count].as_off = 0;
+ elf->e_symtab = (char*)syms;
+ elf->e_symlen = count + 1;
+ elf->e_free_syms = 1;
+ }
+ *ptr = elf->e_symlen;
+ return (Elf_Arsym*)elf->e_symtab;
+}
diff --git a/lib/getbase.c b/lib/getbase.c
new file mode 100644
index 0000000..6831629
--- /dev/null
+++ b/lib/getbase.c
@@ -0,0 +1,33 @@
+/*
+getbase.c - implementation of the elf_getbase(3) function.
+Copyright (C) 1995 - 1998 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: getbase.c,v 1.7 2008/05/23 08:15:34 michael Exp $";
+#endif /* lint */
+
+off_t
+elf_getbase(Elf *elf) {
+ if (!elf) {
+ return -1;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ return (off_t)elf->e_base;
+}
diff --git a/lib/getdata.c b/lib/getdata.c
new file mode 100644
index 0000000..a65b7aa
--- /dev/null
+++ b/lib/getdata.c
@@ -0,0 +1,157 @@
+/*
+getdata.c - implementation of the elf_getdata(3) function.
+Copyright (C) 1995 - 2001 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: getdata.c,v 1.13 2008/05/23 08:15:34 michael Exp $";
+#endif /* lint */
+
+static Elf_Data*
+_elf_cook_scn(Elf *elf, Elf_Scn *scn, Scn_Data *sd) {
+ Elf_Data dst;
+ Elf_Data src;
+ int flag = 0;
+ size_t dlen;
+
+ elf_assert(elf->e_data);
+
+ /*
+ * Prepare source
+ */
+ src = sd->sd_data;
+ src.d_version = elf->e_version;
+ if (elf->e_rawdata) {
+ src.d_buf = elf->e_rawdata + scn->s_offset;
+ }
+ else {
+ src.d_buf = elf->e_data + scn->s_offset;
+ }
+
+ /*
+ * Prepare destination (needs prepared source!)
+ */
+ dst = sd->sd_data;
+ if (elf->e_class == ELFCLASS32) {
+ dlen = _elf32_xltsize(&src, dst.d_version, elf->e_encoding, 0);
+ }
+#if __LIBELF64
+ else if (elf->e_class == ELFCLASS64) {
+ dlen = _elf64_xltsize(&src, dst.d_version, elf->e_encoding, 0);
+ }
+#endif /* __LIBELF64 */
+ else {
+ elf_assert(valid_class(elf->e_class));
+ seterr(ERROR_UNIMPLEMENTED);
+ return NULL;
+ }
+ if (dlen == (size_t)-1) {
+ return NULL;
+ }
+ dst.d_size = dlen;
+ if (elf->e_rawdata != elf->e_data && dst.d_size <= src.d_size) {
+ dst.d_buf = elf->e_data + scn->s_offset;
+ }
+ else if (!(dst.d_buf = malloc(dst.d_size))) {
+ seterr(ERROR_MEM_SCNDATA);
+ return NULL;
+ }
+ else {
+ flag = 1;
+ }
+
+ /*
+ * Translate data
+ */
+ if (_elf_xlatetom(elf, &dst, &src)) {
+ sd->sd_memdata = (char*)dst.d_buf;
+ sd->sd_data = dst;
+ if (!(sd->sd_free_data = flag)) {
+ elf->e_cooked = 1;
+ }
+ return &sd->sd_data;
+ }
+
+ if (flag) {
+ free(dst.d_buf);
+ }
+ return NULL;
+}
+
+Elf_Data*
+elf_getdata(Elf_Scn *scn, Elf_Data *data) {
+ Scn_Data *sd;
+ Elf *elf;
+
+ if (!scn) {
+ return NULL;
+ }
+ elf_assert(scn->s_magic == SCN_MAGIC);
+ if (scn->s_index == SHN_UNDEF) {
+ seterr(ERROR_NULLSCN);
+ }
+ else if (data) {
+ for (sd = scn->s_data_1; sd; sd = sd->sd_link) {
+ elf_assert(sd->sd_magic == DATA_MAGIC);
+ elf_assert(sd->sd_scn == scn);
+ if (data == &sd->sd_data) {
+ /*
+ * sd_link allocated by elf_newdata().
+ */
+ return &sd->sd_link->sd_data;
+ }
+ }
+ seterr(ERROR_SCNDATAMISMATCH);
+ }
+ else if ((sd = scn->s_data_1)) {
+ elf_assert(sd->sd_magic == DATA_MAGIC);
+ elf_assert(sd->sd_scn == scn);
+ elf = scn->s_elf;
+ elf_assert(elf);
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ if (sd->sd_freeme) {
+ /* allocated by elf_newdata() */
+ return &sd->sd_data;
+ }
+ else if (scn->s_type == SHT_NULL) {
+ seterr(ERROR_NULLSCN);
+ }
+ else if (sd->sd_memdata) {
+ /* already cooked */
+ return &sd->sd_data;
+ }
+ else if (scn->s_offset < 0 || scn->s_offset > elf->e_size) {
+ seterr(ERROR_OUTSIDE);
+ }
+ else if (scn->s_type == SHT_NOBITS || !scn->s_size) {
+ /* no data to read */
+ return &sd->sd_data;
+ }
+ else if (scn->s_offset + scn->s_size > elf->e_size) {
+ seterr(ERROR_TRUNC_SCN);
+ }
+ else if (valid_class(elf->e_class)) {
+ return _elf_cook_scn(elf, scn, sd);
+ }
+ else {
+ seterr(ERROR_UNKNOWN_CLASS);
+ }
+ }
+ return NULL;
+}
diff --git a/lib/getident.c b/lib/getident.c
new file mode 100644
index 0000000..d9758f4
--- /dev/null
+++ b/lib/getident.c
@@ -0,0 +1,48 @@
+/*
+getident.c - implementation of the elf_getident(3) function.
+Copyright (C) 1995 - 1998 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: getident.c,v 1.7 2008/05/23 08:15:34 michael Exp $";
+#endif /* lint */
+
+char*
+elf_getident(Elf *elf, size_t *ptr) {
+ size_t tmp;
+
+ if (!ptr) {
+ ptr = &tmp;
+ }
+ if (!elf) {
+ *ptr = 0;
+ return NULL;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ if (elf->e_kind != ELF_K_ELF) {
+ *ptr = elf->e_idlen;
+ return elf->e_data;
+ }
+ if (elf->e_ehdr || _elf_cook(elf)) {
+ *ptr = elf->e_idlen;
+ return elf->e_ehdr;
+ }
+ *ptr = 0;
+ return NULL;
+}
diff --git a/lib/getscn.c b/lib/getscn.c
new file mode 100644
index 0000000..a78eae9
--- /dev/null
+++ b/lib/getscn.c
@@ -0,0 +1,48 @@
+/*
+getscn.c - implementation of the elf_getscn(3) function.
+Copyright (C) 1995 - 1998 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: getscn.c,v 1.7 2008/05/23 08:15:35 michael Exp $";
+#endif /* lint */
+
+Elf_Scn*
+elf_getscn(Elf *elf, size_t index) {
+ Elf_Scn *scn;
+
+ if (!elf) {
+ return NULL;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ if (elf->e_kind != ELF_K_ELF) {
+ seterr(ERROR_NOTELF);
+ }
+ else if (elf->e_ehdr || _elf_cook(elf)) {
+ for (scn = elf->e_scn_1; scn; scn = scn->s_link) {
+ elf_assert(scn->s_magic == SCN_MAGIC);
+ elf_assert(scn->s_elf == elf);
+ if (scn->s_index == index) {
+ return scn;
+ }
+ }
+ seterr(ERROR_NOSUCHSCN);
+ }
+ return NULL;
+}
diff --git a/lib/hash.c b/lib/hash.c
new file mode 100644
index 0000000..a2555b6
--- /dev/null
+++ b/lib/hash.c
@@ -0,0 +1,38 @@
+/*
+hash.c - implementation of the elf_hash(3) function.
+Copyright (C) 1995 - 2002 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: hash.c,v 1.10 2008/05/23 08:15:35 michael Exp $";
+#endif /* lint */
+
+unsigned long
+elf_hash(const unsigned char *name) {
+ unsigned long hash = 0;
+ unsigned long tmp;
+
+ while (*name) {
+ hash = (hash << 4) + (unsigned char)*name++;
+ if ((tmp = hash & 0xf0000000)) {
+ hash ^= tmp | (tmp >> 24);
+ }
+ }
+ return hash;
+}
diff --git a/lib/input.c b/lib/input.c
new file mode 100644
index 0000000..751970a
--- /dev/null
+++ b/lib/input.c
@@ -0,0 +1,106 @@
+/*
+ * input.c - low-level input for libelf.
+ * Copyright (C) 1995 - 2001, 2005 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: input.c,v 1.11 2008/05/23 08:15:35 michael Exp $";
+#endif /* lint */
+
+#include <errno.h>
+
+#if HAVE_MMAP
+#include <sys/mman.h>
+#endif /* HAVE_MMAP */
+
+static int
+xread(int fd, char *buffer, size_t len) {
+ size_t done = 0;
+ size_t n;
+
+ while (done < len) {
+ n = read(fd, buffer + done, len - done);
+ if (n == 0) {
+ /* premature end of file */
+ return -1;
+ }
+ else if (n != (size_t)-1) {
+ /* some bytes read, continue */
+ done += n;
+ }
+ else if (errno != EAGAIN && errno != EINTR) {
+ /* real error */
+ return -1;
+ }
+ }
+ return 0;
+}
+
+void*
+_elf_read(Elf *elf, void *buffer, size_t off, size_t len) {
+ void *tmp;
+
+ elf_assert(elf);
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ elf_assert(off >= 0 && off + len <= elf->e_size);
+ if (elf->e_disabled) {
+ seterr(ERROR_FDDISABLED);
+ }
+ else if (len) {
+ off += elf->e_base;
+ if (lseek(elf->e_fd, (off_t)off, SEEK_SET) != (off_t)off) {
+ seterr(ERROR_IO_SEEK);
+ }
+ else if (!(tmp = buffer) && !(tmp = malloc(len))) {
+ seterr(ERROR_IO_2BIG);
+ }
+ else if (xread(elf->e_fd, tmp, len)) {
+ seterr(ERROR_IO_READ);
+ if (tmp != buffer) {
+ free(tmp);
+ }
+ }
+ else {
+ return tmp;
+ }
+ }
+ return NULL;
+}
+
+void*
+_elf_mmap(Elf *elf) {
+#if HAVE_MMAP
+ void *tmp;
+
+ elf_assert(elf);
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ elf_assert(elf->e_base == 0);
+ if (elf->e_disabled) {
+ seterr(ERROR_FDDISABLED);
+ }
+ else if (elf->e_size) {
+ tmp = (void*)mmap(0, elf->e_size, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE, elf->e_fd, 0);
+ if (tmp != (void*)-1) {
+ return tmp;
+ }
+ }
+#endif /* HAVE_MMAP */
+ return NULL;
+}
diff --git a/lib/kind.c b/lib/kind.c
new file mode 100644
index 0000000..6f84f32
--- /dev/null
+++ b/lib/kind.c
@@ -0,0 +1,33 @@
+/*
+kind.c - implementation of the elf_kind(3) function.
+Copyright (C) 1995 - 1998 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: kind.c,v 1.7 2008/05/23 08:15:35 michael Exp $";
+#endif /* lint */
+
+Elf_Kind
+elf_kind(Elf *elf) {
+ if (!elf) {
+ return ELF_K_NONE;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ return elf->e_kind;
+}
diff --git a/lib/libelf.def b/lib/libelf.def
new file mode 100644
index 0000000..d77897b
--- /dev/null
+++ b/lib/libelf.def
@@ -0,0 +1,82 @@
+LIBRARY libelf
+VERSION 0.8
+EXPORTS
+ elf_begin
+ elf_cntl
+ elf_delscn
+ elf_end
+ elf_errmsg
+ elf_errno
+ elf_fill
+ elf_flagdata
+ elf_flagehdr
+ elf_flagelf
+ elf_flagphdr
+ elf_flagscn
+ elf_flagshdr
+ elf_getarhdr
+ elf_getarsym
+ elf_getbase
+ elf_getdata
+ elf_getident
+ elf_getscn
+ elf_hash
+ elf_kind
+ elf_memory
+ elf_ndxscn
+ elf_newdata
+ elf_newscn
+ elf_next
+ elf_nextscn
+ elf_rand
+ elf_rawdata
+ elf_rawfile
+ elf_strptr
+ elf_update
+ elf_version
+ elf32_checksum
+ elf32_fsize
+ elf32_getehdr
+ elf32_getphdr
+ elf32_getshdr
+ elf32_newehdr
+ elf32_newphdr
+ elf32_xlatetof
+ elf32_xlatetom
+ elf64_checksum
+ elf64_fsize
+ elf64_getehdr
+ elf64_getphdr
+ elf64_getshdr
+ elf64_newehdr
+ elf64_newphdr
+ elf64_xlatetof
+ elf64_xlatetom
+ elfx_movscn
+ elfx_remscn
+ gelf_checksum
+ gelf_fsize
+ gelf_getclass
+ gelf_getdyn
+ gelf_getehdr
+ gelf_getphdr
+ gelf_getrel
+ gelf_getrela
+ gelf_getshdr
+ gelf_getsym
+ gelf_msize
+ gelf_newehdr
+ gelf_newphdr
+ gelf_update_dyn
+ gelf_update_ehdr
+ gelf_update_phdr
+ gelf_update_rel
+ gelf_update_rela
+ gelf_update_shdr
+ gelf_update_sym
+ gelf_xlatetof
+ gelf_xlatetom
+ elf_getphnum
+ elf_getshnum
+ elf_getshstrndx
+ elfx_update_shstrndx
diff --git a/lib/libelf.h b/lib/libelf.h
new file mode 100644
index 0000000..3ebd0f3
--- /dev/null
+++ b/lib/libelf.h
@@ -0,0 +1,305 @@
+/*
+ * libelf.h - public header file for libelf.
+ * Copyright (C) 1995 - 2008 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+/* @(#) $Id: libelf.h,v 1.29 2009/07/07 17:57:43 michael Exp $ */
+
+#ifndef _LIBELF_H
+#define _LIBELF_H
+
+#include <stddef.h> /* for size_t */
+#include <sys/types.h>
+
+#if __LIBELF_INTERNAL__
+#include <sys_elf.h>
+#else /* __LIBELF_INTERNAL__ */
+#include <libelf/sys_elf.h>
+#endif /* __LIBELF_INTERNAL__ */
+
+#if defined __GNUC__ && !defined __cplusplus
+#define DEPRECATED __attribute__((deprecated))
+#else
+#define DEPRECATED /* nothing */
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#ifndef __P
+# if (__STDC__ + 0) || defined(__cplusplus) || defined(_WIN32)
+# define __P(args) args
+# else /* __STDC__ || defined(__cplusplus) */
+# define __P(args) ()
+# endif /* __STDC__ || defined(__cplusplus) */
+#endif /* __P */
+
+/*
+ * Commands
+ */
+typedef enum {
+ ELF_C_NULL = 0, /* must be first, 0 */
+ ELF_C_READ,
+ ELF_C_WRITE,
+ ELF_C_CLR,
+ ELF_C_SET,
+ ELF_C_FDDONE,
+ ELF_C_FDREAD,
+ ELF_C_RDWR,
+ ELF_C_NUM /* must be last */
+} Elf_Cmd;
+
+/*
+ * Flags
+ */
+#define ELF_F_DIRTY 0x1
+#define ELF_F_LAYOUT 0x4
+/*
+ * Allow sections to overlap when ELF_F_LAYOUT is in effect.
+ * Note that this flag ist NOT portable, and that it may render
+ * the output file unusable. Use with extreme caution!
+ */
+#define ELF_F_LAYOUT_OVERLAP 0x10000000
+
+/*
+ * File types
+ */
+typedef enum {
+ ELF_K_NONE = 0, /* must be first, 0 */
+ ELF_K_AR,
+ ELF_K_COFF,
+ ELF_K_ELF,
+ ELF_K_NUM /* must be last */
+} Elf_Kind;
+
+/*
+ * Data types
+ */
+typedef enum {
+ ELF_T_BYTE = 0, /* must be first, 0 */
+ ELF_T_ADDR,
+ ELF_T_DYN,
+ ELF_T_EHDR,
+ ELF_T_HALF,
+ ELF_T_OFF,
+ ELF_T_PHDR,
+ ELF_T_RELA,
+ ELF_T_REL,
+ ELF_T_SHDR,
+ ELF_T_SWORD,
+ ELF_T_SYM,
+ ELF_T_WORD,
+ /*
+ * New stuff for 64-bit.
+ *
+ * Most implementations add ELF_T_SXWORD after ELF_T_SWORD
+ * which breaks binary compatibility with earlier versions.
+ * If this causes problems for you, contact me.
+ */
+ ELF_T_SXWORD,
+ ELF_T_XWORD,
+ /*
+ * Symbol versioning. Sun broke binary compatibility (again!),
+ * but I won't.
+ */
+ ELF_T_VDEF,
+ ELF_T_VNEED,
+ ELF_T_NUM /* must be last */
+} Elf_Type;
+
+/*
+ * Elf descriptor
+ */
+typedef struct Elf Elf;
+
+/*
+ * Section descriptor
+ */
+typedef struct Elf_Scn Elf_Scn;
+
+/*
+ * Archive member header
+ */
+typedef struct {
+ char* ar_name;
+ time_t ar_date;
+ long ar_uid;
+ long ar_gid;
+ unsigned long ar_mode;
+ off_t ar_size;
+ char* ar_rawname;
+} Elf_Arhdr;
+
+/*
+ * Archive symbol table
+ */
+typedef struct {
+ char* as_name;
+ size_t as_off;
+ unsigned long as_hash;
+} Elf_Arsym;
+
+/*
+ * Data descriptor
+ */
+typedef struct {
+ void* d_buf;
+ Elf_Type d_type;
+ size_t d_size;
+ off_t d_off;
+ size_t d_align;
+ unsigned d_version;
+} Elf_Data;
+
+/*
+ * Function declarations
+ */
+extern Elf *elf_begin __P((int __fd, Elf_Cmd __cmd, Elf *__ref));
+extern Elf *elf_memory __P((char *__image, size_t __size));
+extern int elf_cntl __P((Elf *__elf, Elf_Cmd __cmd));
+extern int elf_end __P((Elf *__elf));
+extern const char *elf_errmsg __P((int __err));
+extern int elf_errno __P((void));
+extern void elf_fill __P((int __fill));
+extern unsigned elf_flagdata __P((Elf_Data *__data, Elf_Cmd __cmd,
+ unsigned __flags));
+extern unsigned elf_flagehdr __P((Elf *__elf, Elf_Cmd __cmd,
+ unsigned __flags));
+extern unsigned elf_flagelf __P((Elf *__elf, Elf_Cmd __cmd,
+ unsigned __flags));
+extern unsigned elf_flagphdr __P((Elf *__elf, Elf_Cmd __cmd,
+ unsigned __flags));
+extern unsigned elf_flagscn __P((Elf_Scn *__scn, Elf_Cmd __cmd,
+ unsigned __flags));
+extern unsigned elf_flagshdr __P((Elf_Scn *__scn, Elf_Cmd __cmd,
+ unsigned __flags));
+extern size_t elf32_fsize __P((Elf_Type __type, size_t __count,
+ unsigned __ver));
+extern Elf_Arhdr *elf_getarhdr __P((Elf *__elf));
+extern Elf_Arsym *elf_getarsym __P((Elf *__elf, size_t *__ptr));
+extern off_t elf_getbase __P((Elf *__elf));
+extern Elf_Data *elf_getdata __P((Elf_Scn *__scn, Elf_Data *__data));
+extern Elf32_Ehdr *elf32_getehdr __P((Elf *__elf));
+extern char *elf_getident __P((Elf *__elf, size_t *__ptr));
+extern Elf32_Phdr *elf32_getphdr __P((Elf *__elf));
+extern Elf_Scn *elf_getscn __P((Elf *__elf, size_t __index));
+extern Elf32_Shdr *elf32_getshdr __P((Elf_Scn *__scn));
+extern unsigned long elf_hash __P((const unsigned char *__name));
+extern Elf_Kind elf_kind __P((Elf *__elf));
+extern size_t elf_ndxscn __P((Elf_Scn *__scn));
+extern Elf_Data *elf_newdata __P((Elf_Scn *__scn));
+extern Elf32_Ehdr *elf32_newehdr __P((Elf *__elf));
+extern Elf32_Phdr *elf32_newphdr __P((Elf *__elf, size_t __count));
+extern Elf_Scn *elf_newscn __P((Elf *__elf));
+extern Elf_Cmd elf_next __P((Elf *__elf));
+extern Elf_Scn *elf_nextscn __P((Elf *__elf, Elf_Scn *__scn));
+extern size_t elf_rand __P((Elf *__elf, size_t __offset));
+extern Elf_Data *elf_rawdata __P((Elf_Scn *__scn, Elf_Data *__data));
+extern char *elf_rawfile __P((Elf *__elf, size_t *__ptr));
+extern char *elf_strptr __P((Elf *__elf, size_t __section, size_t __offset));
+extern off_t elf_update __P((Elf *__elf, Elf_Cmd __cmd));
+extern unsigned elf_version __P((unsigned __ver));
+extern Elf_Data *elf32_xlatetof __P((Elf_Data *__dst, const Elf_Data *__src,
+ unsigned __encode));
+extern Elf_Data *elf32_xlatetom __P((Elf_Data *__dst, const Elf_Data *__src,
+ unsigned __encode));
+
+/*
+ * Additional functions found on Solaris
+ */
+extern long elf32_checksum __P((Elf *__elf));
+
+#if __LIBELF64
+/*
+ * 64-bit ELF functions
+ * Not available on all platforms
+ */
+extern Elf64_Ehdr *elf64_getehdr __P((Elf *__elf));
+extern Elf64_Ehdr *elf64_newehdr __P((Elf *__elf));
+extern Elf64_Phdr *elf64_getphdr __P((Elf *__elf));
+extern Elf64_Phdr *elf64_newphdr __P((Elf *__elf, size_t __count));
+extern Elf64_Shdr *elf64_getshdr __P((Elf_Scn *__scn));
+extern size_t elf64_fsize __P((Elf_Type __type, size_t __count,
+ unsigned __ver));
+extern Elf_Data *elf64_xlatetof __P((Elf_Data *__dst, const Elf_Data *__src,
+ unsigned __encode));
+extern Elf_Data *elf64_xlatetom __P((Elf_Data *__dst, const Elf_Data *__src,
+ unsigned __encode));
+
+/*
+ * Additional functions found on Solaris
+ */
+extern long elf64_checksum __P((Elf *__elf));
+
+#endif /* __LIBELF64 */
+
+/*
+ * ELF format extensions
+ *
+ * These functions return 0 on failure, 1 on success. Since other
+ * implementations of libelf may behave differently (there was quite
+ * some confusion about the correct values), they are now officially
+ * deprecated and should be replaced with the three new functions below.
+ */
+DEPRECATED extern int elf_getphnum __P((Elf *__elf, size_t *__resultp));
+DEPRECATED extern int elf_getshnum __P((Elf *__elf, size_t *__resultp));
+DEPRECATED extern int elf_getshstrndx __P((Elf *__elf, size_t *__resultp));
+/*
+ * Replacement functions (return -1 on failure, 0 on success).
+ */
+extern int elf_getphdrnum __P((Elf *__elf, size_t *__resultp));
+extern int elf_getshdrnum __P((Elf *__elf, size_t *__resultp));
+extern int elf_getshdrstrndx __P((Elf *__elf, size_t *__resultp));
+
+/*
+ * Convenience functions
+ *
+ * elfx_update_shstrndx is elf_getshstrndx's counterpart.
+ * It should be used to set the e_shstrndx member.
+ * There is no update function for e_shnum or e_phnum
+ * because libelf handles them internally.
+ */
+extern int elfx_update_shstrndx __P((Elf *__elf, size_t __index));
+
+/*
+ * Experimental extensions:
+ *
+ * elfx_movscn() moves section `__scn' directly after section `__after'.
+ * elfx_remscn() removes section `__scn'. Both functions update
+ * the section indices; elfx_remscn() also adjusts the ELF header's
+ * e_shnum member. The application is responsible for updating other
+ * data (in particular, e_shstrndx and the section headers' sh_link and
+ * sh_info members).
+ *
+ * elfx_movscn() returns the new index of the moved section.
+ * elfx_remscn() returns the original index of the removed section.
+ * A return value of zero indicates an error.
+ */
+extern size_t elfx_movscn __P((Elf *__elf, Elf_Scn *__scn, Elf_Scn *__after));
+extern size_t elfx_remscn __P((Elf *__elf, Elf_Scn *__scn));
+
+/*
+ * elf_delscn() is obsolete. Please use elfx_remscn() instead.
+ */
+extern size_t elf_delscn __P((Elf *__elf, Elf_Scn *__scn));
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _LIBELF_H */
diff --git a/lib/memset.c b/lib/memset.c
new file mode 100644
index 0000000..e398bb5
--- /dev/null
+++ b/lib/memset.c
@@ -0,0 +1,53 @@
+/*
+ * memset.c - replacement for memset(3), using duff's device.
+ * Copyright (C) 1995 - 2004 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif /* HAVE_CONFIG_H */
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: memset.c,v 1.11 2008/05/23 08:15:35 michael Exp $";
+#endif /* lint */
+
+#include <stddef.h> /* for size_t */
+#include <sys/types.h>
+
+void*
+_elf_memset(void *s, int c, size_t n) {
+ char *t = (char*)s;
+
+ if (n) {
+ switch (n % 8u) {
+ do {
+ n -= 8;
+ default:
+ case 0: *t++ = (char)c;
+ case 7: *t++ = (char)c;
+ case 6: *t++ = (char)c;
+ case 5: *t++ = (char)c;
+ case 4: *t++ = (char)c;
+ case 3: *t++ = (char)c;
+ case 2: *t++ = (char)c;
+ case 1: *t++ = (char)c;
+ }
+ while (n > 8);
+ }
+ }
+ return s;
+}
diff --git a/lib/ndxscn.c b/lib/ndxscn.c
new file mode 100644
index 0000000..c9ab9a8
--- /dev/null
+++ b/lib/ndxscn.c
@@ -0,0 +1,33 @@
+/*
+ndxscn.c - implementation of the elf_ndxscn(3) function.
+Copyright (C) 1995 - 1998 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: ndxscn.c,v 1.7 2008/05/23 08:15:35 michael Exp $";
+#endif /* lint */
+
+size_t
+elf_ndxscn(Elf_Scn *scn) {
+ if (!scn) {
+ return SHN_UNDEF;
+ }
+ elf_assert(scn->s_magic == SCN_MAGIC);
+ return scn->s_index;
+}
diff --git a/lib/newdata.c b/lib/newdata.c
new file mode 100644
index 0000000..2a6eeba
--- /dev/null
+++ b/lib/newdata.c
@@ -0,0 +1,56 @@
+/*
+newdata.c - implementation of the elf_newdata(3) function.
+Copyright (C) 1995 - 2000 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: newdata.c,v 1.10 2008/05/23 08:15:35 michael Exp $";
+#endif /* lint */
+
+Elf_Data*
+elf_newdata(Elf_Scn *scn) {
+ Scn_Data *sd;
+
+ if (!scn) {
+ return NULL;
+ }
+ elf_assert(scn->s_magic == SCN_MAGIC);
+ if (scn->s_index == SHN_UNDEF) {
+ seterr(ERROR_NULLSCN);
+ }
+ else if (!(sd = (Scn_Data*)malloc(sizeof(*sd)))) {
+ seterr(ERROR_MEM_SCNDATA);
+ }
+ else {
+ *sd = _elf_data_init;
+ sd->sd_scn = scn;
+ sd->sd_data_flags = ELF_F_DIRTY;
+ sd->sd_freeme = 1;
+ sd->sd_data.d_version = _elf_version;
+ if (scn->s_data_n) {
+ scn->s_data_n->sd_link = sd;
+ }
+ else {
+ scn->s_data_1 = sd;
+ }
+ scn->s_data_n = sd;
+ return &sd->sd_data;
+ }
+ return NULL;
+}
diff --git a/lib/newscn.c b/lib/newscn.c
new file mode 100644
index 0000000..69ba65d
--- /dev/null
+++ b/lib/newscn.c
@@ -0,0 +1,145 @@
+/*
+ * newscn.c - implementation of the elf_newscn(3) function.
+ * Copyright (C) 1995 - 2006 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: newscn.c,v 1.13 2008/05/23 08:15:35 michael Exp $";
+#endif /* lint */
+
+int
+_elf_update_shnum(Elf *elf, size_t shnum) {
+ size_t extshnum = 0;
+ Elf_Scn *scn;
+
+ elf_assert(elf);
+ elf_assert(elf->e_ehdr);
+ scn = elf->e_scn_1;
+ elf_assert(scn);
+ elf_assert(scn->s_index == 0);
+ if (shnum >= SHN_LORESERVE) {
+ extshnum = shnum;
+ shnum = 0;
+ }
+ if (elf->e_class == ELFCLASS32) {
+ ((Elf32_Ehdr*)elf->e_ehdr)->e_shnum = shnum;
+ scn->s_shdr32.sh_size = extshnum;
+ }
+#if __LIBELF64
+ else if (elf->e_class == ELFCLASS64) {
+ ((Elf64_Ehdr*)elf->e_ehdr)->e_shnum = shnum;
+ scn->s_shdr64.sh_size = extshnum;
+ }
+#endif /* __LIBELF64 */
+ else {
+ if (valid_class(elf->e_class)) {
+ seterr(ERROR_UNIMPLEMENTED);
+ }
+ else {
+ seterr(ERROR_UNKNOWN_CLASS);
+ }
+ return -1;
+ }
+ elf->e_ehdr_flags |= ELF_F_DIRTY;
+ scn->s_shdr_flags |= ELF_F_DIRTY;
+ return 0;
+}
+
+static Elf_Scn*
+_makescn(Elf *elf, size_t index) {
+ Elf_Scn *scn;
+
+ elf_assert(elf);
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ elf_assert(elf->e_ehdr);
+ elf_assert(_elf_scn_init.s_magic == SCN_MAGIC);
+ if (!(scn = (Elf_Scn*)malloc(sizeof(*scn)))) {
+ seterr(ERROR_MEM_SCN);
+ return NULL;
+ }
+ *scn = _elf_scn_init;
+ scn->s_elf = elf;
+ scn->s_scn_flags = ELF_F_DIRTY;
+ scn->s_shdr_flags = ELF_F_DIRTY;
+ scn->s_freeme = 1;
+ scn->s_index = index;
+ return scn;
+}
+
+Elf_Scn*
+_elf_first_scn(Elf *elf) {
+ Elf_Scn *scn;
+
+ elf_assert(elf);
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ if ((scn = elf->e_scn_1)) {
+ return scn;
+ }
+ if ((scn = _makescn(elf, 0))) {
+ elf->e_scn_1 = elf->e_scn_n = scn;
+ if (_elf_update_shnum(elf, 1)) {
+ free(scn);
+ elf->e_scn_1 = elf->e_scn_n = scn = NULL;
+ }
+ }
+ return scn;
+}
+
+static Elf_Scn*
+_buildscn(Elf *elf) {
+ Elf_Scn *scn;
+
+ if (!_elf_first_scn(elf)) {
+ return NULL;
+ }
+ scn = elf->e_scn_n;
+ elf_assert(scn);
+ if (!(scn = _makescn(elf, scn->s_index + 1))) {
+ return NULL;
+ }
+ if (_elf_update_shnum(elf, scn->s_index + 1)) {
+ free(scn);
+ return NULL;
+ }
+ elf->e_scn_n = elf->e_scn_n->s_link = scn;
+ return scn;
+}
+
+Elf_Scn*
+elf_newscn(Elf *elf) {
+ Elf_Scn *scn;
+
+ if (!elf) {
+ return NULL;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ if (!elf->e_readable && !elf->e_ehdr) {
+ seterr(ERROR_NOEHDR);
+ }
+ else if (elf->e_kind != ELF_K_ELF) {
+ seterr(ERROR_NOTELF);
+ }
+ else if (!elf->e_ehdr && !_elf_cook(elf)) {
+ return NULL;
+ }
+ else if ((scn = _buildscn(elf))) {
+ return scn;
+ }
+ return NULL;
+}
diff --git a/lib/next.c b/lib/next.c
new file mode 100644
index 0000000..bf9a67b
--- /dev/null
+++ b/lib/next.c
@@ -0,0 +1,42 @@
+/*
+next.c - implementation of the elf_next(3) function.
+Copyright (C) 1995 - 1998 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: next.c,v 1.7 2008/05/23 08:15:35 michael Exp $";
+#endif /* lint */
+
+Elf_Cmd
+elf_next(Elf *elf) {
+ if (!elf) {
+ return ELF_C_NULL;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ if (!elf->e_parent) {
+ return ELF_C_NULL;
+ }
+ elf_assert(elf->e_parent->e_magic == ELF_MAGIC);
+ elf_assert(elf->e_parent->e_kind == ELF_K_AR);
+ elf->e_parent->e_off = elf->e_next;
+ if (elf->e_next == elf->e_parent->e_size) {
+ return ELF_C_NULL;
+ }
+ return ELF_C_READ;
+}
diff --git a/lib/nextscn.c b/lib/nextscn.c
new file mode 100644
index 0000000..4543f83
--- /dev/null
+++ b/lib/nextscn.c
@@ -0,0 +1,54 @@
+/*
+nextscn.c - implementation of the elf_nextscn(3) function.
+Copyright (C) 1995 - 1998 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: nextscn.c,v 1.7 2008/05/23 08:15:35 michael Exp $";
+#endif /* lint */
+
+Elf_Scn*
+elf_nextscn(Elf *elf, Elf_Scn *scn) {
+ if (!elf) {
+ return NULL;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ if (scn) {
+ elf_assert(scn->s_magic == SCN_MAGIC);
+ if (scn->s_elf == elf) {
+ return scn->s_link;
+ }
+ seterr(ERROR_ELFSCNMISMATCH);
+ }
+ else if (elf->e_kind != ELF_K_ELF) {
+ seterr(ERROR_NOTELF);
+ }
+ else if (elf->e_ehdr || _elf_cook(elf)) {
+ elf_assert(elf->e_ehdr);
+ for (scn = elf->e_scn_1; scn; scn = scn->s_link) {
+ elf_assert(scn->s_magic == SCN_MAGIC);
+ elf_assert(scn->s_elf == elf);
+ if (scn->s_index == 1) {
+ return scn;
+ }
+ }
+ seterr(ERROR_NOSUCHSCN);
+ }
+ return NULL;
+}
diff --git a/lib/nlist.c b/lib/nlist.c
new file mode 100644
index 0000000..933d33f
--- /dev/null
+++ b/lib/nlist.c
@@ -0,0 +1,253 @@
+/*
+ * nlist.c - implementation of the nlist(3) function.
+ * Copyright (C) 1995 - 2004 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <private.h>
+#include <nlist.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: nlist.c,v 1.15 2008/05/23 08:15:35 michael Exp $";
+#endif /* lint */
+
+#if !defined(_WIN32)
+#if HAVE_FCNTL_H
+#include <fcntl.h>
+#else
+extern int open();
+#endif /* HAVE_FCNTL_H */
+#endif /* defined(_WIN32) */
+
+#ifndef O_RDONLY
+#define O_RDONLY 0
+#endif /* O_RDONLY */
+
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif /* O_BINARY */
+
+#define FILE_OPEN_MODE (O_RDONLY | O_BINARY)
+
+#define PRIME 217
+
+struct hash {
+ const char* name;
+ unsigned long hash;
+ unsigned next;
+};
+
+static const char*
+symbol_name(Elf *elf, const void *syms, const char *names, size_t nlimit, size_t index) {
+ size_t off;
+
+ if (elf->e_class == ELFCLASS32) {
+ off = ((Elf32_Sym*)syms)[index].st_name;
+ }
+#if __LIBELF64
+ else if (elf->e_class == ELFCLASS64) {
+ off = ((Elf64_Sym*)syms)[index].st_name;
+ }
+#endif /* __LIBELF64 */
+ else {
+ return NULL;
+ }
+ if (off >= 0 && off < nlimit) {
+ return &names[off];
+ }
+ return NULL;
+}
+
+static void
+copy_symbol(Elf *elf, struct nlist *np, const void *syms, size_t index) {
+ if (elf->e_class == ELFCLASS32) {
+ np->n_value = ((Elf32_Sym*)syms)[index].st_value;
+ np->n_scnum = ((Elf32_Sym*)syms)[index].st_shndx;
+ }
+#if __LIBELF64
+ else if (elf->e_class == ELFCLASS64) {
+ np->n_value = ((Elf64_Sym*)syms)[index].st_value;
+ np->n_scnum = ((Elf64_Sym*)syms)[index].st_shndx;
+ }
+#endif /* __LIBELF64 */
+ /*
+ * this needs more work
+ */
+ np->n_type = 0;
+ np->n_sclass = 0;
+ np->n_numaux = 0;
+}
+
+static int
+_elf_nlist(Elf *elf, struct nlist *nl) {
+ unsigned first[PRIME];
+ Elf_Scn *symtab = NULL;
+ Elf_Scn *strtab = NULL;
+ Elf_Data *symdata;
+ Elf_Data *strdata;
+ size_t symsize;
+ size_t nsymbols;
+ const char *name;
+ struct hash *table;
+ unsigned long hash;
+ unsigned i;
+ struct nlist *np;
+
+ /*
+ * Get and translate ELF header, section table and so on.
+ * Must be class independent, so don't use elf32_get*().
+ */
+ if (elf->e_kind != ELF_K_ELF) {
+ return -1;
+ }
+ if (!elf->e_ehdr && !_elf_cook(elf)) {
+ return -1;
+ }
+
+ /*
+ * Find symbol table. If there is none, try dynamic symbols.
+ */
+ for (symtab = elf->e_scn_1; symtab; symtab = symtab->s_link) {
+ if (symtab->s_type == SHT_SYMTAB) {
+ break;
+ }
+ if (symtab->s_type == SHT_DYNSYM) {
+ strtab = symtab;
+ }
+ }
+ if (!symtab && !(symtab = strtab)) {
+ return -1;
+ }
+
+ /*
+ * Get associated string table.
+ */
+ i = 0;
+ if (elf->e_class == ELFCLASS32) {
+ i = symtab->s_shdr32.sh_link;
+ }
+#if __LIBELF64
+ else if (elf->e_class == ELFCLASS64) {
+ i = symtab->s_shdr64.sh_link;
+ }
+#endif /* __LIBELF64 */
+ if (i == 0) {
+ return -1;
+ }
+ for (strtab = elf->e_scn_1; strtab; strtab = strtab->s_link) {
+ if (strtab->s_index == i) {
+ break;
+ }
+ }
+ if (!strtab || strtab->s_type != SHT_STRTAB) {
+ return -1;
+ }
+
+ /*
+ * Get and translate section data.
+ */
+ symdata = elf_getdata(symtab, NULL);
+ strdata = elf_getdata(strtab, NULL);
+ if (!symdata || !strdata) {
+ return -1;
+ }
+ symsize = _msize(elf->e_class, _elf_version, ELF_T_SYM);
+ elf_assert(symsize);
+ nsymbols = symdata->d_size / symsize;
+ if (!symdata->d_buf || !strdata->d_buf || !nsymbols || !strdata->d_size) {
+ return -1;
+ }
+
+ /*
+ * Build a simple hash table.
+ */
+ if (!(table = (struct hash*)malloc(nsymbols * sizeof(*table)))) {
+ return -1;
+ }
+ for (i = 0; i < PRIME; i++) {
+ first[i] = 0;
+ }
+ for (i = 0; i < nsymbols; i++) {
+ table[i].name = NULL;
+ table[i].hash = 0;
+ table[i].next = 0;
+ }
+ for (i = 1; i < nsymbols; i++) {
+ name = symbol_name(elf, symdata->d_buf, strdata->d_buf,
+ strdata->d_size, i);
+ if (name == NULL) {
+ free(table);
+ return -1;
+ }
+ if (*name != '\0') {
+ table[i].name = name;
+ table[i].hash = elf_hash((unsigned char*)name);
+ hash = table[i].hash % PRIME;
+ table[i].next = first[hash];
+ first[hash] = i;
+ }
+ }
+
+ /*
+ * Lookup symbols, one by one.
+ */
+ for (np = nl; (name = np->n_name) && *name; np++) {
+ hash = elf_hash((unsigned char*)name);
+ for (i = first[hash % PRIME]; i; i = table[i].next) {
+ if (table[i].hash == hash && !strcmp(table[i].name, name)) {
+ break;
+ }
+ }
+ if (i) {
+ copy_symbol(elf, np, symdata->d_buf, i);
+ }
+ else {
+ np->n_value = 0;
+ np->n_scnum = 0;
+ np->n_type = 0;
+ np->n_sclass = 0;
+ np->n_numaux = 0;
+ }
+ }
+ free(table);
+ return 0;
+}
+
+int
+nlist(const char *filename, struct nlist *nl) {
+ int result = -1;
+ unsigned oldver;
+ Elf *elf;
+ int fd;
+
+ if ((oldver = elf_version(EV_CURRENT)) != EV_NONE) {
+ if ((fd = open(filename, FILE_OPEN_MODE)) != -1) {
+ if ((elf = elf_begin(fd, ELF_C_READ, NULL))) {
+ result = _elf_nlist(elf, nl);
+ elf_end(elf);
+ }
+ close(fd);
+ }
+ elf_version(oldver);
+ }
+ if (result) {
+ while (nl->n_name && *nl->n_name) {
+ nl->n_value = 0;
+ nl++;
+ }
+ }
+ return result;
+}
diff --git a/lib/nlist.h b/lib/nlist.h
new file mode 100644
index 0000000..27a452e
--- /dev/null
+++ b/lib/nlist.h
@@ -0,0 +1,48 @@
+/*
+ * nlist.h - public header file for nlist(3).
+ * Copyright (C) 1995 - 2006 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+/* @(#) $Id: nlist.h,v 1.10 2008/05/23 08:15:35 michael Exp $ */
+
+#ifndef _NLIST_H
+#define _NLIST_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+struct nlist {
+ char* n_name;
+ long n_value;
+ short n_scnum;
+ unsigned short n_type;
+ char n_sclass;
+ char n_numaux;
+};
+
+#if (__STDC__ + 0) || defined(__cplusplus) || defined(_WIN32)
+extern int nlist(const char *__filename, struct nlist *__nl);
+#else /* __STDC__ || defined(__cplusplus) */
+extern int nlist();
+#endif /* __STDC__ || defined(__cplusplus) */
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _NLIST_H */
diff --git a/lib/opt.delscn.c b/lib/opt.delscn.c
new file mode 100644
index 0000000..2201155
--- /dev/null
+++ b/lib/opt.delscn.c
@@ -0,0 +1,205 @@
+/*
+opt.delscn.c - implementation of the elf_delscn(3) function.
+Copyright (C) 1995 - 2001 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: opt.delscn.c,v 1.12 2008/05/23 08:15:35 michael Exp $";
+#endif /* lint */
+
+static size_t
+_newindex(size_t old, size_t index) {
+ return old == index ? SHN_UNDEF : (old > index ? old - 1 : old);
+}
+
+static void
+_elf32_update_shdr(Elf *elf, size_t index) {
+ Elf32_Shdr *shdr;
+ Elf_Scn *scn;
+
+ ((Elf32_Ehdr*)elf->e_ehdr)->e_shnum = elf->e_scn_n->s_index + 1;
+ for (scn = elf->e_scn_1; scn; scn = scn->s_link) {
+ shdr = &scn->s_shdr32;
+ switch (shdr->sh_type) {
+ case SHT_REL:
+ case SHT_RELA:
+ shdr->sh_info = _newindex(shdr->sh_info, index);
+ /* fall through */
+ case SHT_DYNSYM:
+ case SHT_DYNAMIC:
+ case SHT_HASH:
+ case SHT_SYMTAB:
+#if __LIBELF_SYMBOL_VERSIONS
+#if __LIBELF_SUN_SYMBOL_VERSIONS
+ case SHT_SUNW_verdef:
+ case SHT_SUNW_verneed:
+ case SHT_SUNW_versym:
+#else /* __LIBELF_SUN_SYMBOL_VERSIONS */
+ case SHT_GNU_verdef:
+ case SHT_GNU_verneed:
+ case SHT_GNU_versym:
+#endif /* __LIBELF_SUN_SYMBOL_VERSIONS */
+#endif /* __LIBELF_SYMBOL_VERSIONS */
+ shdr->sh_link = _newindex(shdr->sh_link, index);
+ /* fall through */
+ default:
+ break;
+ }
+ }
+}
+
+#if __LIBELF64
+
+static void
+_elf64_update_shdr(Elf *elf, size_t index) {
+ Elf64_Shdr *shdr;
+ Elf_Scn *scn;
+
+ ((Elf64_Ehdr*)elf->e_ehdr)->e_shnum = elf->e_scn_n->s_index + 1;
+ for (scn = elf->e_scn_1; scn; scn = scn->s_link) {
+ shdr = &scn->s_shdr64;
+ switch (shdr->sh_type) {
+ case SHT_REL:
+ case SHT_RELA:
+ shdr->sh_info = _newindex(shdr->sh_info, index);
+ /* fall through */
+ case SHT_DYNSYM:
+ case SHT_DYNAMIC:
+ case SHT_HASH:
+ case SHT_SYMTAB:
+#if __LIBELF_SYMBOL_VERSIONS
+#if __LIBELF_SUN_SYMBOL_VERSIONS
+ case SHT_SUNW_verdef:
+ case SHT_SUNW_verneed:
+ case SHT_SUNW_versym:
+#else /* __LIBELF_SUN_SYMBOL_VERSIONS */
+ case SHT_GNU_verdef:
+ case SHT_GNU_verneed:
+ case SHT_GNU_versym:
+#endif /* __LIBELF_SUN_SYMBOL_VERSIONS */
+#endif /* __LIBELF_SYMBOL_VERSIONS */
+ shdr->sh_link = _newindex(shdr->sh_link, index);
+ /* fall through */
+ default:
+ break;
+ }
+ }
+}
+
+#endif /* __LIBELF64 */
+
+size_t
+elf_delscn(Elf *elf, Elf_Scn *scn) {
+ Elf_Scn *pscn;
+ Scn_Data *sd;
+ Scn_Data *tmp;
+ size_t index;
+
+ if (!elf || !scn) {
+ return SHN_UNDEF;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ elf_assert(scn->s_magic == SCN_MAGIC);
+ elf_assert(elf->e_ehdr);
+ if (scn->s_elf != elf) {
+ seterr(ERROR_ELFSCNMISMATCH);
+ return SHN_UNDEF;
+ }
+ elf_assert(elf->e_scn_1);
+ if (scn == elf->e_scn_1) {
+ seterr(ERROR_NULLSCN);
+ return SHN_UNDEF;
+ }
+
+ /*
+ * Find previous section.
+ */
+ for (pscn = elf->e_scn_1; pscn->s_link; pscn = pscn->s_link) {
+ if (pscn->s_link == scn) {
+ break;
+ }
+ }
+ if (pscn->s_link != scn) {
+ seterr(ERROR_ELFSCNMISMATCH);
+ return SHN_UNDEF;
+ }
+ /*
+ * Unlink section.
+ */
+ if (elf->e_scn_n == scn) {
+ elf->e_scn_n = pscn;
+ }
+ pscn->s_link = scn->s_link;
+ index = scn->s_index;
+ /*
+ * Free section descriptor and data.
+ */
+ for (sd = scn->s_data_1; sd; sd = tmp) {
+ elf_assert(sd->sd_magic == DATA_MAGIC);
+ elf_assert(sd->sd_scn == scn);
+ tmp = sd->sd_link;
+ if (sd->sd_free_data && sd->sd_memdata) {
+ free(sd->sd_memdata);
+ }
+ if (sd->sd_freeme) {
+ free(sd);
+ }
+ }
+ if ((sd = scn->s_rawdata)) {
+ elf_assert(sd->sd_magic == DATA_MAGIC);
+ elf_assert(sd->sd_scn == scn);
+ if (sd->sd_free_data && sd->sd_memdata) {
+ free(sd->sd_memdata);
+ }
+ if (sd->sd_freeme) {
+ free(sd);
+ }
+ }
+ if (scn->s_freeme) {
+ elf_assert(scn->s_index > 0);
+ free(scn);
+ }
+ /*
+ * Adjust section indices.
+ */
+ for (scn = pscn->s_link; scn; scn = scn->s_link) {
+ elf_assert(scn->s_index > index);
+ scn->s_index--;
+ }
+ /*
+ * Adjust ELF header and well-known section headers.
+ */
+ if (elf->e_class == ELFCLASS32) {
+ _elf32_update_shdr(elf, index);
+ return index;
+ }
+#if __LIBELF64
+ else if (elf->e_class == ELFCLASS64) {
+ _elf64_update_shdr(elf, index);
+ return index;
+ }
+#endif /* __LIBELF64 */
+ else if (valid_class(elf->e_class)) {
+ seterr(ERROR_UNIMPLEMENTED);
+ }
+ else {
+ seterr(ERROR_UNKNOWN_CLASS);
+ }
+ return SHN_UNDEF;
+}
diff --git a/lib/private.h b/lib/private.h
new file mode 100644
index 0000000..2b772dc
--- /dev/null
+++ b/lib/private.h
@@ -0,0 +1,446 @@
+/*
+ * private.h - private definitions for libelf.
+ * Copyright (C) 1995 - 2007 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+/* @(#) $Id: private.h,v 1.40 2009/11/01 13:04:19 michael Exp $ */
+
+#ifndef _PRIVATE_H
+#define _PRIVATE_H
+
+#define __LIBELF_INTERNAL__ 1
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif /* HAVE_CONFIG_H */
+
+/*
+ * Workaround for GLIBC bug:
+ * include <stdint.h> before <sys/types.h>
+ */
+#if HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#include <sys/types.h>
+
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <string.h>
+#else /* STDC_HEADERS */
+extern void *malloc(), *realloc();
+extern void free(), bcopy(), abort();
+extern int strcmp(), strncmp(), memcmp();
+extern void *memcpy(), *memmove(), *memset();
+#endif /* STDC_HEADERS */
+
+#if defined(_WIN32)
+#include <io.h>
+#else
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#else /* HAVE_UNISTD_H */
+extern int read(), write(), close();
+extern off_t lseek();
+#if HAVE_FTRUNCATE
+extern int ftruncate();
+#endif /* HAVE_FTRUNCATE */
+#endif /* HAVE_UNISTD_H */
+#endif /* defined(_WIN32) */
+
+#ifndef SEEK_SET
+#define SEEK_SET 0
+#endif /* SEEK_SET */
+#ifndef SEEK_CUR
+#define SEEK_CUR 1
+#endif /* SEEK_CUR */
+#ifndef SEEK_END
+#define SEEK_END 2
+#endif /* SEEK_END */
+
+#if !HAVE_MEMCMP
+# define memcmp strncmp
+#endif /* !HAVE_MEMCMP */
+#if !HAVE_MEMCPY
+# define memcpy(d,s,n) bcopy(s,d,n)
+#endif /* !HAVE_MEMCPY */
+#if !HAVE_MEMMOVE
+# define memmove(d,s,n) bcopy(s,d,n)
+#endif /* !HAVE_MEMMOVE */
+
+#if !HAVE_MEMSET
+# define memset _elf_memset
+extern void *_elf_memset();
+#endif /* !HAVE_MEMSET */
+
+#if HAVE_STRUCT_NLIST_DECLARATION
+# define nlist __override_nlist_declaration
+#endif /* HAVE_STRUCT_NLIST_DECLARATION */
+
+#if __LIBELF_NEED_LINK_H
+# include <link.h>
+#elif __LIBELF_NEED_SYS_LINK_H
+# include <sys/link.h>
+#endif /* __LIBELF_NEED_LINK_H */
+
+#if HAVE_AR_H
+#include <ar.h>
+#else /* HAVE_AR_H */
+
+#define ARMAG "!<arch>\n"
+#define SARMAG 8
+
+struct ar_hdr {
+ char ar_name[16];
+ char ar_date[12];
+ char ar_uid[6];
+ char ar_gid[6];
+ char ar_mode[8];
+ char ar_size[10];
+ char ar_fmag[2];
+};
+
+#define ARFMAG "`\n"
+
+#endif /* HAVE_AR_H */
+
+#include <libelf.h>
+
+#if HAVE_STRUCT_NLIST_DECLARATION
+# undef nlist
+#endif /* HAVE_STRUCT_NLIST_DECLARATION */
+
+#if __LIBELF64
+#include <gelf.h>
+#endif /* __LIBELF64 */
+
+typedef struct Scn_Data Scn_Data;
+
+/*
+ * ELF descriptor
+ */
+struct Elf {
+ /* common */
+ size_t e_size; /* file/member size */
+ size_t e_dsize; /* size of memory image */
+ Elf_Kind e_kind; /* kind of file */
+ char* e_data; /* file/member data */
+ char* e_rawdata; /* file/member raw data */
+ size_t e_idlen; /* identifier size */
+ int e_fd; /* file descriptor */
+ unsigned e_count; /* activation count */
+ /* archive members (still common) */
+ Elf* e_parent; /* NULL if not an archive member */
+ size_t e_next; /* 0 if not an archive member */
+ size_t e_base; /* 0 if not an archive member */
+ Elf* e_link; /* next archive member or NULL */
+ Elf_Arhdr* e_arhdr; /* archive member header or NULL */
+ /* archives */
+ size_t e_off; /* current member offset (for elf_begin) */
+ Elf* e_members; /* linked list of active archive members */
+ char* e_symtab; /* archive symbol table */
+ size_t e_symlen; /* length of archive symbol table */
+ char* e_strtab; /* archive string table */
+ size_t e_strlen; /* length of archive string table */
+ /* ELF files */
+ unsigned e_class; /* ELF class */
+ unsigned e_encoding; /* ELF data encoding */
+ unsigned e_version; /* ELF version */
+ char* e_ehdr; /* ELF header */
+ char* e_phdr; /* ELF program header table */
+ size_t e_phnum; /* size of program header table */
+ Elf_Scn* e_scn_1; /* first section */
+ Elf_Scn* e_scn_n; /* last section */
+ unsigned e_elf_flags; /* elf flags (ELF_F_*) */
+ unsigned e_ehdr_flags; /* ehdr flags (ELF_F_*) */
+ unsigned e_phdr_flags; /* phdr flags (ELF_F_*) */
+ /* misc flags */
+ unsigned e_readable : 1; /* file is readable */
+ unsigned e_writable : 1; /* file is writable */
+ unsigned e_disabled : 1; /* e_fd has been disabled */
+ unsigned e_cooked : 1; /* e_data was modified */
+ unsigned e_free_syms : 1; /* e_symtab is malloc'ed */
+ unsigned e_unmap_data : 1; /* e_data is mmap'ed */
+ unsigned e_memory : 1; /* created by elf_memory() */
+ /* magic number for debugging */
+ long e_magic;
+};
+
+#define ELF_MAGIC 0x012b649e
+
+#define INIT_ELF {\
+ /* e_size */ 0,\
+ /* e_dsize */ 0,\
+ /* e_kind */ ELF_K_NONE,\
+ /* e_data */ NULL,\
+ /* e_rawdata */ NULL,\
+ /* e_idlen */ 0,\
+ /* e_fd */ -1,\
+ /* e_count */ 1,\
+ /* e_parent */ NULL,\
+ /* e_next */ 0,\
+ /* e_base */ 0,\
+ /* e_link */ NULL,\
+ /* e_arhdr */ NULL,\
+ /* e_off */ 0,\
+ /* e_members */ NULL,\
+ /* e_symtab */ NULL,\
+ /* e_symlen */ 0,\
+ /* e_strtab */ NULL,\
+ /* e_strlen */ 0,\
+ /* e_class */ ELFCLASSNONE,\
+ /* e_encoding */ ELFDATANONE,\
+ /* e_version */ EV_NONE,\
+ /* e_ehdr */ NULL,\
+ /* e_phdr */ NULL,\
+ /* e_phnum */ 0,\
+ /* e_scn_1 */ NULL,\
+ /* e_scn_n */ NULL,\
+ /* e_elf_flags */ 0,\
+ /* e_ehdr_flags */ 0,\
+ /* e_phdr_flags */ 0,\
+ /* e_readable */ 0,\
+ /* e_writable */ 0,\
+ /* e_disabled */ 0,\
+ /* e_cooked */ 0,\
+ /* e_free_syms */ 0,\
+ /* e_unmap_data */ 0,\
+ /* e_memory */ 0,\
+ /* e_magic */ ELF_MAGIC\
+}
+
+/*
+ * Section descriptor
+ */
+struct Elf_Scn {
+ Elf_Scn* s_link; /* pointer to next Elf_Scn */
+ Elf* s_elf; /* pointer to elf descriptor */
+ size_t s_index; /* number of this section */
+ unsigned s_scn_flags; /* section flags (ELF_F_*) */
+ unsigned s_shdr_flags; /* shdr flags (ELF_F_*) */
+ Scn_Data* s_data_1; /* first data buffer */
+ Scn_Data* s_data_n; /* last data buffer */
+ Scn_Data* s_rawdata; /* raw data buffer */
+ /* data copied from shdr */
+ unsigned s_type; /* section type */
+ size_t s_offset; /* section offset */
+ size_t s_size; /* section size */
+ /* misc flags */
+ unsigned s_freeme : 1; /* this Elf_Scn was malloc'ed */
+ /* section header */
+ union {
+#if __LIBELF64
+ Elf64_Shdr u_shdr64;
+#endif /* __LIBELF64 */
+ Elf32_Shdr u_shdr32;
+ } s_uhdr;
+ /* magic number for debugging */
+ long s_magic;
+};
+#define s_shdr32 s_uhdr.u_shdr32
+#define s_shdr64 s_uhdr.u_shdr64
+
+#define SCN_MAGIC 0x012c747d
+
+#define INIT_SCN {\
+ /* s_link */ NULL,\
+ /* s_elf */ NULL,\
+ /* s_index */ 0,\
+ /* s_scn_flags */ 0,\
+ /* s_shdr_flags */ 0,\
+ /* s_data_1 */ NULL,\
+ /* s_data_n */ NULL,\
+ /* s_rawdata */ NULL,\
+ /* s_type */ SHT_NULL,\
+ /* s_offset */ 0,\
+ /* s_size */ 0,\
+ /* s_freeme */ 0,\
+ /* s_uhdr */ {{0,}},\
+ /* s_magic */ SCN_MAGIC\
+}
+
+/*
+ * Data descriptor
+ */
+struct Scn_Data {
+ Elf_Data sd_data; /* must be first! */
+ Scn_Data* sd_link; /* pointer to next Scn_Data */
+ Elf_Scn* sd_scn; /* pointer to section */
+ char* sd_memdata; /* memory image of section */
+ unsigned sd_data_flags; /* data flags (ELF_F_*) */
+ /* misc flags */
+ unsigned sd_freeme : 1; /* this Scn_Data was malloc'ed */
+ unsigned sd_free_data : 1; /* sd_memdata is malloc'ed */
+ /* magic number for debugging */
+ long sd_magic;
+};
+
+#define DATA_MAGIC 0x01072639
+
+#define INIT_DATA {\
+ {\
+ /* d_buf */ NULL,\
+ /* d_type */ ELF_T_BYTE,\
+ /* d_size */ 0,\
+ /* d_off */ 0,\
+ /* d_align */ 0,\
+ /* d_version */ EV_NONE\
+ },\
+ /* sd_link */ NULL,\
+ /* sd_scn */ NULL,\
+ /* sd_memdata */ NULL,\
+ /* sd_data_flags */ 0,\
+ /* sd_freeme */ 0,\
+ /* sd_free_data */ 0,\
+ /* sd_magic */ DATA_MAGIC\
+}
+
+/*
+ * Private status variables
+ */
+extern unsigned _elf_version;
+extern int _elf_errno;
+extern int _elf_fill;
+extern int _elf_sanity_checks;
+#define SANITY_CHECK_STRPTR (1u << 0)
+
+/*
+ * Private functions
+ */
+extern void *_elf_read __P((Elf*, void*, size_t, size_t));
+extern void *_elf_mmap __P((Elf*));
+extern int _elf_cook __P((Elf*));
+extern char *_elf_getehdr __P((Elf*, unsigned));
+extern char *_elf_getphdr __P((Elf*, unsigned));
+extern Elf_Data *_elf_xlatetom __P((const Elf*, Elf_Data*, const Elf_Data*));
+extern Elf_Type _elf_scn_type __P((unsigned));
+extern size_t _elf32_xltsize __P((const Elf_Data *__src, unsigned __dv, unsigned __encode, int __tof));
+extern size_t _elf64_xltsize __P((const Elf_Data *__src, unsigned __dv, unsigned __encode, int __tof));
+extern int _elf_update_shnum(Elf *__elf, size_t __shnum);
+extern Elf_Scn *_elf_first_scn(Elf *__elf);
+
+/*
+ * Special translators
+ */
+extern size_t _elf_verdef_32L11_tof __P((unsigned char *dst, const unsigned char *src, size_t n));
+extern size_t _elf_verdef_32L11_tom __P((unsigned char *dst, const unsigned char *src, size_t n));
+extern size_t _elf_verdef_32M11_tof __P((unsigned char *dst, const unsigned char *src, size_t n));
+extern size_t _elf_verdef_32M11_tom __P((unsigned char *dst, const unsigned char *src, size_t n));
+extern size_t _elf_verdef_64L11_tof __P((unsigned char *dst, const unsigned char *src, size_t n));
+extern size_t _elf_verdef_64L11_tom __P((unsigned char *dst, const unsigned char *src, size_t n));
+extern size_t _elf_verdef_64M11_tof __P((unsigned char *dst, const unsigned char *src, size_t n));
+extern size_t _elf_verdef_64M11_tom __P((unsigned char *dst, const unsigned char *src, size_t n));
+extern size_t _elf_verneed_32L11_tof __P((unsigned char *dst, const unsigned char *src, size_t n));
+extern size_t _elf_verneed_32L11_tom __P((unsigned char *dst, const unsigned char *src, size_t n));
+extern size_t _elf_verneed_32M11_tof __P((unsigned char *dst, const unsigned char *src, size_t n));
+extern size_t _elf_verneed_32M11_tom __P((unsigned char *dst, const unsigned char *src, size_t n));
+extern size_t _elf_verneed_64L11_tof __P((unsigned char *dst, const unsigned char *src, size_t n));
+extern size_t _elf_verneed_64L11_tom __P((unsigned char *dst, const unsigned char *src, size_t n));
+extern size_t _elf_verneed_64M11_tof __P((unsigned char *dst, const unsigned char *src, size_t n));
+extern size_t _elf_verneed_64M11_tom __P((unsigned char *dst, const unsigned char *src, size_t n));
+
+/*
+ * Private data
+ */
+extern const Elf_Scn _elf_scn_init;
+extern const Scn_Data _elf_data_init;
+extern const size_t _elf_fmsize[2][EV_CURRENT - EV_NONE][ELF_T_NUM][2];
+
+/*
+ * Access macros for _elf_fmsize[]
+ */
+#define _fmsize(c,v,t,w) \
+ (_elf_fmsize[(c)-ELFCLASS32][(v)-EV_NONE-1][(t)-ELF_T_BYTE][(w)])
+#define _fsize(c,v,t) _fmsize((c),(v),(t),1)
+#define _msize(c,v,t) _fmsize((c),(v),(t),0)
+
+/*
+ * Various checks
+ */
+#define valid_class(c) ((c) >= ELFCLASS32 && (c) <= ELFCLASS64)
+#define valid_encoding(e) ((e) >= ELFDATA2LSB && (e) <= ELFDATA2MSB)
+#define valid_version(v) ((v) > EV_NONE && (v) <= EV_CURRENT)
+#define valid_type(t) ((unsigned)(t) < ELF_T_NUM)
+
+/*
+ * Error codes
+ */
+enum {
+#define __err__(a,b) a,
+#include <errors.h> /* include constants from errors.h */
+#undef __err__
+ERROR_NUM
+};
+
+#define seterr(err) (_elf_errno = (err))
+
+/*
+ * Sizes of data types (external representation)
+ * These definitions should be in <elf.h>, but...
+ */
+#ifndef ELF32_FSZ_ADDR
+# define ELF32_FSZ_ADDR 4
+# define ELF32_FSZ_HALF 2
+# define ELF32_FSZ_OFF 4
+# define ELF32_FSZ_SWORD 4
+# define ELF32_FSZ_WORD 4
+#endif /* ELF32_FSZ_ADDR */
+#ifndef ELF64_FSZ_ADDR
+# define ELF64_FSZ_ADDR 8
+# define ELF64_FSZ_HALF 2
+# define ELF64_FSZ_OFF 8
+# define ELF64_FSZ_SWORD 4
+# define ELF64_FSZ_SXWORD 8
+# define ELF64_FSZ_WORD 4
+# define ELF64_FSZ_XWORD 8
+#endif /* ELF64_FSZ_ADDR */
+
+/*
+ * More missing pieces, in no particular order
+ */
+#ifndef SHT_SYMTAB_SHNDX
+#define SHT_SYMTAB_SHNDX 18
+#endif /* SHT_SYMTAB_SHNDX */
+
+#ifndef SHN_XINDEX
+#define SHN_XINDEX 0xffff
+#endif /* SHN_XINDEX */
+
+#ifndef PN_XNUM
+#define PN_XNUM 0xffff
+#endif /* PN_XNUM */
+
+/*
+ * Debugging
+ */
+#if ENABLE_DEBUG
+extern void __elf_assert __P((const char*, unsigned, const char*));
+# if (__STDC__ + 0)
+# define elf_assert(x) do{if(!(x))__elf_assert(__FILE__,__LINE__,#x);}while(0)
+# else /* __STDC__ */
+# define elf_assert(x) do{if(!(x))__elf_assert(__FILE__,__LINE__,"x");}while(0)
+# endif /* __STDC__ */
+#else /* ENABLE_DEBUG */
+# define elf_assert(x) do{}while(0)
+#endif /* ENABLE_DEBUG */
+
+/*
+ * Return values for certain functions
+ */
+#define LIBELF_SUCCESS 1
+#define LIBELF_FAILURE 0
+
+#endif /* _PRIVATE_H */
diff --git a/lib/rand.c b/lib/rand.c
new file mode 100644
index 0000000..9cad126
--- /dev/null
+++ b/lib/rand.c
@@ -0,0 +1,43 @@
+/*
+rand.c - implementation of the elf_rand(3) function.
+Copyright (C) 1995 - 1998 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: rand.c,v 1.7 2008/05/23 08:15:35 michael Exp $";
+#endif /* lint */
+
+size_t
+elf_rand(Elf *elf, size_t offset) {
+ if (!elf) {
+ return 0;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ if (elf->e_kind != ELF_K_AR) {
+ seterr(ERROR_NOTARCHIVE);
+ }
+ else if (offset <= 0 || offset > elf->e_size) {
+ seterr(ERROR_BADOFF);
+ }
+ else {
+ elf->e_off = offset;
+ return offset;
+ }
+ return 0;
+}
diff --git a/lib/rawdata.c b/lib/rawdata.c
new file mode 100644
index 0000000..5d9a9f3
--- /dev/null
+++ b/lib/rawdata.c
@@ -0,0 +1,89 @@
+/*
+rawdata.c - implementation of the elf_rawdata(3) function.
+Copyright (C) 1995 - 2000 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: rawdata.c,v 1.10 2008/05/23 08:15:35 michael Exp $";
+#endif /* lint */
+
+Elf_Data*
+elf_rawdata(Elf_Scn *scn, Elf_Data *data) {
+ Scn_Data *sd;
+ Elf *elf;
+
+ if (!scn) {
+ return NULL;
+ }
+ elf_assert(scn->s_magic == SCN_MAGIC);
+ elf = scn->s_elf;
+ elf_assert(elf);
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ if (!elf->e_readable) {
+ return NULL;
+ }
+ else if (scn->s_index == SHN_UNDEF || scn->s_type == SHT_NULL) {
+ seterr(ERROR_NULLSCN);
+ }
+ else if (data) {
+ return NULL;
+ }
+ else if ((sd = scn->s_rawdata)) {
+ elf_assert(sd->sd_magic == DATA_MAGIC);
+ elf_assert(sd->sd_scn == scn);
+ return &sd->sd_data;
+ }
+ else if (scn->s_offset < 0 || scn->s_offset > elf->e_size) {
+ seterr(ERROR_OUTSIDE);
+ }
+ else if (scn->s_type != SHT_NOBITS
+ && scn->s_offset + scn->s_size > elf->e_size) {
+ seterr(ERROR_TRUNC_SCN);
+ }
+ else if (!(sd = (Scn_Data*)malloc(sizeof(*sd)))) {
+ seterr(ERROR_MEM_SCNDATA);
+ }
+ else {
+ *sd = _elf_data_init;
+ sd->sd_scn = scn;
+ sd->sd_freeme = 1;
+ sd->sd_data.d_size = scn->s_size;
+ sd->sd_data.d_version = _elf_version;
+ if (scn->s_type != SHT_NOBITS && scn->s_size) {
+ if (!(sd->sd_memdata = (char*)malloc(scn->s_size))) {
+ seterr(ERROR_IO_2BIG);
+ free(sd);
+ return NULL;
+ }
+ else if (elf->e_rawdata) {
+ memcpy(sd->sd_memdata, elf->e_rawdata + scn->s_offset, scn->s_size);
+ }
+ else if (!_elf_read(elf, sd->sd_memdata, scn->s_offset, scn->s_size)) {
+ free(sd->sd_memdata);
+ free(sd);
+ return NULL;
+ }
+ sd->sd_data.d_buf = sd->sd_memdata;
+ sd->sd_free_data = 1;
+ }
+ scn->s_rawdata = sd;
+ return &sd->sd_data;
+ }
+ return NULL;
+}
diff --git a/lib/rawfile.c b/lib/rawfile.c
new file mode 100644
index 0000000..43335c4
--- /dev/null
+++ b/lib/rawfile.c
@@ -0,0 +1,54 @@
+/*
+ * rawfile.c - implementation of the elf_rawfile(3) function.
+ * Copyright (C) 1995 - 2009 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: rawfile.c,v 1.8 2009/05/22 17:07:46 michael Exp $";
+#endif /* lint */
+
+char*
+elf_rawfile(Elf *elf, size_t *ptr) {
+ size_t tmp;
+
+ if (!ptr) {
+ ptr = &tmp;
+ }
+ *ptr = 0;
+ if (!elf) {
+ return NULL;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ if (!elf->e_readable) {
+ return NULL;
+ }
+ else if (elf->e_size) {
+ if (!elf->e_rawdata) {
+ elf_assert(elf->e_data);
+ if (!elf->e_cooked) {
+ elf->e_rawdata = elf->e_data;
+ }
+ else if (!(elf->e_rawdata = _elf_read(elf, NULL, 0, elf->e_size))) {
+ return NULL;
+ }
+ }
+ *ptr = elf->e_size;
+ }
+ return elf->e_rawdata;
+}
diff --git a/lib/strptr.c b/lib/strptr.c
new file mode 100644
index 0000000..30e217e
--- /dev/null
+++ b/lib/strptr.c
@@ -0,0 +1,150 @@
+/*
+ * strptr.c - implementation of the elf_strptr(3) function.
+ * Copyright (C) 1995 - 2007 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: strptr.c,v 1.12 2008/05/23 08:15:35 michael Exp $";
+#endif /* lint */
+
+char*
+elf_strptr(Elf *elf, size_t section, size_t offset) {
+ Elf_Data *data;
+ Elf_Scn *scn;
+ size_t n;
+ char *s;
+
+ if (!elf) {
+ return NULL;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ if (!(scn = elf_getscn(elf, section))) {
+ return NULL;
+ }
+ if (scn->s_index == SHN_UNDEF) {
+ seterr(ERROR_NOSTRTAB);
+ return NULL;
+ }
+ /*
+ * checking the section header is more appropriate
+ */
+ if (elf->e_class == ELFCLASS32) {
+ if (scn->s_shdr32.sh_type != SHT_STRTAB) {
+ seterr(ERROR_NOSTRTAB);
+ return NULL;
+ }
+ }
+#if __LIBELF64
+ else if (elf->e_class == ELFCLASS64) {
+ if (scn->s_shdr64.sh_type != SHT_STRTAB) {
+ seterr(ERROR_NOSTRTAB);
+ return NULL;
+ }
+ }
+#endif /* __LIBELF64 */
+ else if (valid_class(elf->e_class)) {
+ seterr(ERROR_UNIMPLEMENTED);
+ return NULL;
+ }
+ else {
+ seterr(ERROR_UNKNOWN_CLASS);
+ return NULL;
+ }
+ /*
+ * Find matching buffer
+ */
+ n = 0;
+ data = NULL;
+ if (elf->e_elf_flags & ELF_F_LAYOUT) {
+ /*
+ * Programmer is responsible for d_off
+ * Note: buffers may be in any order!
+ */
+ while ((data = elf_getdata(scn, data))) {
+ n = data->d_off;
+ if (offset >= n && offset - n < data->d_size) {
+ /*
+ * Found it
+ */
+ break;
+ }
+ }
+ }
+ else {
+ /*
+ * Calculate offsets myself
+ */
+ while ((data = elf_getdata(scn, data))) {
+ if (data->d_align > 1) {
+ n += data->d_align - 1;
+ n -= n % data->d_align;
+ }
+ if (offset < n) {
+ /*
+ * Invalid offset: points into a hole
+ */
+ seterr(ERROR_BADSTROFF);
+ return NULL;
+ }
+ if (offset - n < data->d_size) {
+ /*
+ * Found it
+ */
+ break;
+ }
+ n += data->d_size;
+ }
+ }
+ if (data == NULL) {
+ /*
+ * Not found
+ */
+ seterr(ERROR_BADSTROFF);
+ return NULL;
+ }
+ if (data->d_buf == NULL) {
+ /*
+ * Buffer is NULL (usually the programmers' fault)
+ */
+ seterr(ERROR_NULLBUF);
+ return NULL;
+ }
+ offset -= n;
+ s = (char*)data->d_buf;
+ if (!(_elf_sanity_checks & SANITY_CHECK_STRPTR)) {
+ return s + offset;
+ }
+ /*
+ * Perform extra sanity check
+ */
+ for (n = offset; n < data->d_size; n++) {
+ if (s[n] == '\0') {
+ /*
+ * Return properly NUL terminated string
+ */
+ return s + offset;
+ }
+ }
+ /*
+ * String is not NUL terminated
+ * Return error to avoid SEGV in application
+ */
+ seterr(ERROR_UNTERM);
+ return NULL;
+}
diff --git a/lib/swap64.c b/lib/swap64.c
new file mode 100644
index 0000000..397bd5b
--- /dev/null
+++ b/lib/swap64.c
@@ -0,0 +1,81 @@
+/*
+swap64.c - 64-bit byte swapping functions.
+Copyright (C) 1995 - 2001 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+#include <byteswap.h>
+
+#if __LIBELF64
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: swap64.c,v 1.6 2008/05/23 08:15:35 michael Exp $";
+#endif /* lint */
+
+__libelf_u64_t
+_elf_load_u64L(const unsigned char *from) {
+ return ((__libelf_u64_t)__load_u32L(from + 4) << 32)
+ | (__libelf_u64_t)__load_u32L(from);
+}
+
+__libelf_u64_t
+_elf_load_u64M(const unsigned char *from) {
+ return ((__libelf_u64_t)__load_u32M(from) << 32)
+ | (__libelf_u64_t)__load_u32M(from + 4);
+}
+
+__libelf_i64_t
+_elf_load_i64L(const unsigned char *from) {
+ return ((__libelf_i64_t)__load_i32L(from + 4) << 32)
+ | (__libelf_u64_t)__load_u32L(from);
+}
+
+__libelf_i64_t
+_elf_load_i64M(const unsigned char *from) {
+ return ((__libelf_i64_t)__load_i32M(from) << 32)
+ | (__libelf_u64_t)__load_u32M(from + 4);
+}
+
+void
+_elf_store_u64L(unsigned char *to, __libelf_u64_t v) {
+ __store_u32L(to, (__libelf_u32_t)v);
+ v >>= 32;
+ __store_u32L(to + 4, (__libelf_u32_t)v);
+}
+
+void
+_elf_store_u64M(unsigned char *to, __libelf_u64_t v) {
+ __store_u32M(to + 4, (__libelf_u32_t)v);
+ v >>= 32;
+ __store_u32M(to, (__libelf_u32_t)v);
+}
+
+void
+_elf_store_i64L(unsigned char *to, __libelf_u64_t v) {
+ __store_u32L(to, (__libelf_u32_t)v);
+ v >>= 32;
+ __store_i32L(to + 4, (__libelf_u32_t)v);
+}
+
+void
+_elf_store_i64M(unsigned char *to, __libelf_u64_t v) {
+ __store_u32M(to + 4, (__libelf_u32_t)v);
+ v >>= 32;
+ __store_i32M(to, (__libelf_u32_t)v);
+}
+
+#endif /* __LIBELF64 */
diff --git a/lib/sys_elf.h.in b/lib/sys_elf.h.in
new file mode 100644
index 0000000..b71a20d
--- /dev/null
+++ b/lib/sys_elf.h.in
@@ -0,0 +1,130 @@
+/*
+sys_elf.h.in - configure template for private "switch" file.
+Copyright (C) 1998 - 2001 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+/* @(#) $Id: sys_elf.h.in,v 1.13 2008/05/23 08:57:07 michael Exp $ */
+
+/*
+ * DO NOT USE THIS IN APPLICATIONS - #include <libelf.h> INSTEAD!
+ */
+
+/* Define to `<elf.h>' or `<sys/elf.h>' if one of them is present */
+#undef __LIBELF_HEADER_ELF_H
+
+/* Define if Elf32_Dyn is declared in <link.h> */
+#undef __LIBELF_NEED_LINK_H
+
+/* Define if Elf32_Dyn is declared in <sys/link.h> */
+#undef __LIBELF_NEED_SYS_LINK_H
+
+/* Define if you want 64-bit support (and your system supports it) */
+#undef __LIBELF64
+
+/* Define if you want 64-bit support, and are running IRIX */
+#undef __LIBELF64_IRIX
+
+/* Define if you want 64-bit support, and are running Linux */
+#undef __LIBELF64_LINUX
+
+/* Define if you want symbol versioning (and your system supports it) */
+#undef __LIBELF_SYMBOL_VERSIONS
+
+/* Define to a 64-bit signed integer type if one exists */
+#undef __libelf_i64_t
+
+/* Define to a 64-bit unsigned integer type if one exists */
+#undef __libelf_u64_t
+
+/* Define to a 32-bit signed integer type if one exists */
+#undef __libelf_i32_t
+
+/* Define to a 32-bit unsigned integer type if one exists */
+#undef __libelf_u32_t
+
+/* Define to a 16-bit signed integer type if one exists */
+#undef __libelf_i16_t
+
+/* Define to a 16-bit unsigned integer type if one exists */
+#undef __libelf_u16_t
+
+/*
+ * Ok, now get the correct instance of elf.h...
+ */
+#ifdef __LIBELF_HEADER_ELF_H
+# include __LIBELF_HEADER_ELF_H
+#else /* __LIBELF_HEADER_ELF_H */
+# if __LIBELF_INTERNAL__
+# include <elf_repl.h>
+# else /* __LIBELF_INTERNAL__ */
+# include <libelf/elf_repl.h>
+# endif /* __LIBELF_INTERNAL__ */
+#endif /* __LIBELF_HEADER_ELF_H */
+
+/*
+ * On some systems, <elf.h> is severely broken. Try to fix it.
+ */
+#ifdef __LIBELF_HEADER_ELF_H
+
+# ifndef ELF32_FSZ_ADDR
+# define ELF32_FSZ_ADDR 4
+# define ELF32_FSZ_HALF 2
+# define ELF32_FSZ_OFF 4
+# define ELF32_FSZ_SWORD 4
+# define ELF32_FSZ_WORD 4
+# endif /* ELF32_FSZ_ADDR */
+
+# ifndef STN_UNDEF
+# define STN_UNDEF 0
+# endif /* STN_UNDEF */
+
+# if __LIBELF64
+
+# ifndef ELF64_FSZ_ADDR
+# define ELF64_FSZ_ADDR 8
+# define ELF64_FSZ_HALF 2
+# define ELF64_FSZ_OFF 8
+# define ELF64_FSZ_SWORD 4
+# define ELF64_FSZ_WORD 4
+# define ELF64_FSZ_SXWORD 8
+# define ELF64_FSZ_XWORD 8
+# endif /* ELF64_FSZ_ADDR */
+
+# ifndef ELF64_ST_BIND
+# define ELF64_ST_BIND(i) ((i)>>4)
+# define ELF64_ST_TYPE(i) ((i)&0xf)
+# define ELF64_ST_INFO(b,t) (((b)<<4)+((t)&0xf))
+# endif /* ELF64_ST_BIND */
+
+# ifndef ELF64_R_SYM
+# define ELF64_R_SYM(i) ((Elf64_Xword)(i)>>32)
+# define ELF64_R_TYPE(i) ((i)&0xffffffffL)
+# define ELF64_R_INFO(s,t) (((Elf64_Xword)(s)<<32)+((t)&0xffffffffL))
+# endif /* ELF64_R_SYM */
+
+# if __LIBELF64_LINUX
+typedef __libelf_u64_t Elf64_Addr;
+typedef __libelf_u16_t Elf64_Half;
+typedef __libelf_u64_t Elf64_Off;
+typedef __libelf_i32_t Elf64_Sword;
+typedef __libelf_u32_t Elf64_Word;
+typedef __libelf_i64_t Elf64_Sxword;
+typedef __libelf_u64_t Elf64_Xword;
+# endif /* __LIBELF64_LINUX */
+
+# endif /* __LIBELF64 */
+#endif /* __LIBELF_HEADER_ELF_H */
diff --git a/lib/sys_elf.h.w32 b/lib/sys_elf.h.w32
new file mode 100644
index 0000000..0f93c55
--- /dev/null
+++ b/lib/sys_elf.h.w32
@@ -0,0 +1,130 @@
+/*
+ * lib/sys_elf.h.w32 - internal configuration file for W32 port
+ * Copyright (C) 2004 - 2006 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * @(#) $Id: sys_elf.h.w32,v 1.2 2006/09/07 15:55:42 michael Exp $
+ */
+
+/*
+ * DO NOT USE THIS IN APPLICATIONS - #include <libelf.h> INSTEAD!
+ */
+
+/* Define to `<elf.h>' or `<sys/elf.h>' if one of them is present */
+#undef __LIBELF_HEADER_ELF_H
+
+/* Define if Elf32_Dyn is declared in <link.h> */
+#undef __LIBELF_NEED_LINK_H
+
+/* Define if Elf32_Dyn is declared in <sys/link.h> */
+#undef __LIBELF_NEED_SYS_LINK_H
+
+/* Define if you want 64-bit support (and your system supports it) */
+#define __LIBELF64 1
+
+/* Define if you want 64-bit support, and are running IRIX */
+#undef __LIBELF64_IRIX
+
+/* Define if you want 64-bit support, and are running Linux */
+#undef __LIBELF64_LINUX
+
+/* Define if you want symbol versioning (and your system supports it) */
+#define __LIBELF_SYMBOL_VERSIONS 1
+
+/* Define to a 64-bit signed integer type if one exists */
+#define __libelf_i64_t __int64
+
+/* Define to a 64-bit unsigned integer type if one exists */
+#define __libelf_u64_t unsigned __int64
+
+/* Define to a 32-bit signed integer type if one exists */
+#define __libelf_i32_t int
+
+/* Define to a 32-bit unsigned integer type if one exists */
+#define __libelf_u32_t unsigned int
+
+/* Define to a 16-bit signed integer type if one exists */
+#define __libelf_i16_t short int
+
+/* Define to a 16-bit unsigned integer type if one exists */
+#define __libelf_u16_t unsigned short int
+
+/*
+ * Ok, now get the correct instance of elf.h...
+ */
+#ifdef __LIBELF_HEADER_ELF_H
+# include __LIBELF_HEADER_ELF_H
+#else /* __LIBELF_HEADER_ELF_H */
+# if __LIBELF_INTERNAL__
+# include <elf_repl.h>
+# else /* __LIBELF_INTERNAL__ */
+# include <libelf/elf_repl.h>
+# endif /* __LIBELF_INTERNAL__ */
+#endif /* __LIBELF_HEADER_ELF_H */
+
+/*
+ * On some systems, <elf.h> is severely broken. Try to fix it.
+ */
+#ifdef __LIBELF_HEADER_ELF_H
+
+# ifndef ELF32_FSZ_ADDR
+# define ELF32_FSZ_ADDR 4
+# define ELF32_FSZ_HALF 2
+# define ELF32_FSZ_OFF 4
+# define ELF32_FSZ_SWORD 4
+# define ELF32_FSZ_WORD 4
+# endif /* ELF32_FSZ_ADDR */
+
+# ifndef STN_UNDEF
+# define STN_UNDEF 0
+# endif /* STN_UNDEF */
+
+# if __LIBELF64
+
+# ifndef ELF64_FSZ_ADDR
+# define ELF64_FSZ_ADDR 8
+# define ELF64_FSZ_HALF 2
+# define ELF64_FSZ_OFF 8
+# define ELF64_FSZ_SWORD 4
+# define ELF64_FSZ_WORD 4
+# define ELF64_FSZ_SXWORD 8
+# define ELF64_FSZ_XWORD 8
+# endif /* ELF64_FSZ_ADDR */
+
+# ifndef ELF64_ST_BIND
+# define ELF64_ST_BIND(i) ((i)>>4)
+# define ELF64_ST_TYPE(i) ((i)&0xf)
+# define ELF64_ST_INFO(b,t) (((b)<<4)+((t)&0xf))
+# endif /* ELF64_ST_BIND */
+
+# ifndef ELF64_R_SYM
+# define ELF64_R_SYM(i) ((Elf64_Xword)(i)>>32)
+# define ELF64_R_TYPE(i) ((i)&0xffffffffL)
+# define ELF64_R_INFO(s,t) (((Elf64_Xword)(s)<<32)+((t)&0xffffffffL))
+# endif /* ELF64_R_SYM */
+
+# if __LIBELF64_LINUX
+typedef __libelf_u64_t Elf64_Addr;
+typedef __libelf_u16_t Elf64_Half;
+typedef __libelf_u64_t Elf64_Off;
+typedef __libelf_i32_t Elf64_Sword;
+typedef __libelf_u32_t Elf64_Word;
+typedef __libelf_i64_t Elf64_Sxword;
+typedef __libelf_u64_t Elf64_Xword;
+# endif /* __LIBELF64_LINUX */
+
+# endif /* __LIBELF64 */
+#endif /* __LIBELF_HEADER_ELF_H */
diff --git a/lib/update.c b/lib/update.c
new file mode 100644
index 0000000..085ddea
--- /dev/null
+++ b/lib/update.c
@@ -0,0 +1,1021 @@
+/*
+ * update.c - implementation of the elf_update(3) function.
+ * Copyright (C) 1995 - 2006 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: update.c,v 1.34 2009/05/22 17:08:09 michael Exp $";
+#endif /* lint */
+
+#include <errno.h>
+
+#if HAVE_MMAP
+#include <sys/mman.h>
+#endif /* HAVE_MMAP */
+
+static const unsigned short __encoding = ELFDATA2LSB + (ELFDATA2MSB << 8);
+#define native_encoding (*(unsigned char*)&__encoding)
+
+#define rewrite(var,val,f) \
+ do{if((var)!=(val)){(var)=(val);(f)|=ELF_F_DIRTY;}}while(0)
+
+#define align(var,val) \
+ do{if((val)>1){(var)+=(val)-1;(var)-=(var)%(val);}}while(0)
+
+#undef max
+#define max(a,b) ((a)>(b)?(a):(b))
+
+static off_t
+scn_data_layout(Elf_Scn *scn, unsigned v, unsigned type, size_t *algn, unsigned *flag) {
+ Elf *elf = scn->s_elf;
+ Elf_Data *data;
+ int layout = (elf->e_elf_flags & ELF_F_LAYOUT) == 0;
+ size_t scn_align = 1;
+ size_t len = 0;
+ Scn_Data *sd;
+ size_t fsize;
+
+ if (!(sd = scn->s_data_1)) {
+ /* no data in section */
+ *algn = scn_align;
+ return (off_t)len;
+ }
+ /* load data from file, if any */
+ if (!(data = elf_getdata(scn, NULL))) {
+ return (off_t)-1;
+ }
+ elf_assert(data == &sd->sd_data);
+ for (; sd; sd = sd->sd_link) {
+ elf_assert(sd->sd_magic == DATA_MAGIC);
+ elf_assert(sd->sd_scn == scn);
+
+ if (!valid_version(sd->sd_data.d_version)) {
+ return (off_t)-1;
+ }
+
+ fsize = sd->sd_data.d_size;
+ if (fsize && type != SHT_NOBITS && valid_type(sd->sd_data.d_type)) {
+ if (elf->e_class == ELFCLASS32) {
+ fsize = _elf32_xltsize(&sd->sd_data, v, ELFDATA2LSB, 1);
+ }
+#if __LIBELF64
+ else if (elf->e_class == ELFCLASS64) {
+ fsize = _elf64_xltsize(&sd->sd_data, v, ELFDATA2LSB, 1);
+ }
+#endif /* __LIBELF64 */
+ else {
+ elf_assert(valid_class(elf->e_class));
+ seterr(ERROR_UNIMPLEMENTED);
+ return (off_t)-1;
+ }
+ if (fsize == (size_t)-1) {
+ return (off_t)-1;
+ }
+ }
+
+ if (layout) {
+ align(len, sd->sd_data.d_align);
+ scn_align = max(scn_align, sd->sd_data.d_align);
+ rewrite(sd->sd_data.d_off, (off_t)len, sd->sd_data_flags);
+ len += fsize;
+ }
+ else {
+ len = max(len, sd->sd_data.d_off + fsize);
+ }
+
+ *flag |= sd->sd_data_flags;
+ }
+ *algn = scn_align;
+ return (off_t)len;
+}
+
+static size_t
+scn_entsize(const Elf *elf, unsigned version, unsigned stype) {
+ Elf_Type type;
+
+ switch ((type = _elf_scn_type(stype))) {
+ case ELF_T_BYTE:
+ return 0;
+ case ELF_T_VDEF:
+ case ELF_T_VNEED:
+ return 0; /* What else can I do? Thank you, Sun! */
+ default:
+ return _fsize(elf->e_class, version, type);
+ }
+}
+
+static off_t
+_elf32_layout(Elf *elf, unsigned *flag) {
+ int layout = (elf->e_elf_flags & ELF_F_LAYOUT) == 0;
+ int allow_overlap = (elf->e_elf_flags & ELF_F_LAYOUT_OVERLAP) != 0;
+ Elf32_Ehdr *ehdr = (Elf32_Ehdr*)elf->e_ehdr;
+ size_t off = 0;
+ unsigned version;
+ unsigned encoding;
+ size_t align_addr;
+ size_t entsize;
+ unsigned phnum;
+ unsigned shnum;
+ Elf_Scn *scn;
+
+ *flag = elf->e_elf_flags | elf->e_phdr_flags;
+
+ if ((version = ehdr->e_version) == EV_NONE) {
+ version = EV_CURRENT;
+ }
+ if (!valid_version(version)) {
+ seterr(ERROR_UNKNOWN_VERSION);
+ return -1;
+ }
+ if ((encoding = ehdr->e_ident[EI_DATA]) == ELFDATANONE) {
+ encoding = native_encoding;
+ }
+ if (!valid_encoding(encoding)) {
+ seterr(ERROR_UNKNOWN_ENCODING);
+ return -1;
+ }
+ entsize = _fsize(ELFCLASS32, version, ELF_T_EHDR);
+ elf_assert(entsize);
+ rewrite(ehdr->e_ehsize, entsize, elf->e_ehdr_flags);
+ off = entsize;
+
+ align_addr = _fsize(ELFCLASS32, version, ELF_T_ADDR);
+ elf_assert(align_addr);
+
+ if ((phnum = elf->e_phnum)) {
+ entsize = _fsize(ELFCLASS32, version, ELF_T_PHDR);
+ elf_assert(entsize);
+ if (layout) {
+ align(off, align_addr);
+ rewrite(ehdr->e_phoff, off, elf->e_ehdr_flags);
+ off += phnum * entsize;
+ }
+ else {
+ off = max(off, ehdr->e_phoff + phnum * entsize);
+ }
+ }
+ else {
+ entsize = 0;
+ if (layout) {
+ rewrite(ehdr->e_phoff, 0, elf->e_ehdr_flags);
+ }
+ }
+ if (phnum >= PN_XNUM) {
+ Elf_Scn *scn = elf->e_scn_1;
+ Elf32_Shdr *shdr = &scn->s_shdr32;
+
+ elf_assert(scn);
+ elf_assert(scn->s_index == 0);
+ rewrite(shdr->sh_info, phnum, scn->s_shdr_flags);
+ *flag |= scn->s_shdr_flags;
+ phnum = PN_XNUM;
+ }
+ rewrite(ehdr->e_phnum, phnum, elf->e_ehdr_flags);
+ rewrite(ehdr->e_phentsize, entsize, elf->e_ehdr_flags);
+
+ for (scn = elf->e_scn_1, shnum = 0; scn; scn = scn->s_link, ++shnum) {
+ Elf32_Shdr *shdr = &scn->s_shdr32;
+ size_t scn_align = 1;
+ off_t len;
+
+ elf_assert(scn->s_index == shnum);
+
+ *flag |= scn->s_scn_flags;
+
+ if (scn->s_index == SHN_UNDEF) {
+ rewrite(shdr->sh_entsize, 0, scn->s_shdr_flags);
+ if (layout) {
+ rewrite(shdr->sh_offset, 0, scn->s_shdr_flags);
+ rewrite(shdr->sh_size, 0, scn->s_shdr_flags);
+ rewrite(shdr->sh_addralign, 0, scn->s_shdr_flags);
+ }
+ *flag |= scn->s_shdr_flags;
+ continue;
+ }
+ if (shdr->sh_type == SHT_NULL) {
+ *flag |= scn->s_shdr_flags;
+ continue;
+ }
+
+ len = scn_data_layout(scn, version, shdr->sh_type, &scn_align, flag);
+ if (len == -1) {
+ return -1;
+ }
+
+ /*
+ * Never override the program's choice.
+ */
+ if (shdr->sh_entsize == 0) {
+ entsize = scn_entsize(elf, version, shdr->sh_type);
+ if (entsize > 1) {
+ rewrite(shdr->sh_entsize, entsize, scn->s_shdr_flags);
+ }
+ }
+
+ if (layout) {
+ align(off, scn_align);
+ rewrite(shdr->sh_offset, off, scn->s_shdr_flags);
+ rewrite(shdr->sh_size, (size_t)len, scn->s_shdr_flags);
+ rewrite(shdr->sh_addralign, scn_align, scn->s_shdr_flags);
+
+ if (shdr->sh_type != SHT_NOBITS) {
+ off += (size_t)len;
+ }
+ }
+ else if ((size_t)len > shdr->sh_size) {
+ seterr(ERROR_SCN2SMALL);
+ return -1;
+ }
+ else {
+ Elf_Scn *scn2;
+ size_t end1, end2;
+
+ end1 = shdr->sh_offset;
+ if (shdr->sh_type != SHT_NOBITS) {
+ end1 += shdr->sh_size;
+ }
+ if (!allow_overlap && shdr->sh_offset < off) {
+ /*
+ * check for overlapping sections
+ */
+ for (scn2 = elf->e_scn_1; scn2; scn2 = scn2->s_link) {
+ if (scn2 == scn) {
+ break;
+ }
+ end2 = scn2->s_shdr32.sh_offset;
+ if (scn2->s_shdr32.sh_type != SHT_NOBITS) {
+ end2 += scn2->s_shdr32.sh_size;
+ }
+ if (end1 > scn2->s_shdr32.sh_offset
+ && end2 > shdr->sh_offset) {
+ seterr(ERROR_SCN_OVERLAP);
+ return -1;
+ }
+ }
+ }
+ if (off < end1) {
+ off = end1;
+ }
+ }
+ *flag |= scn->s_shdr_flags;
+ }
+
+ if (shnum) {
+ entsize = _fsize(ELFCLASS32, version, ELF_T_SHDR);
+ elf_assert(entsize);
+ if (layout) {
+ align(off, align_addr);
+ rewrite(ehdr->e_shoff, off, elf->e_ehdr_flags);
+ off += shnum * entsize;
+ }
+ else {
+ off = max(off, ehdr->e_shoff + shnum * entsize);
+ }
+ }
+ else {
+ entsize = 0;
+ if (layout) {
+ rewrite(ehdr->e_shoff, 0, elf->e_ehdr_flags);
+ }
+ }
+ if (shnum >= SHN_LORESERVE) {
+ Elf_Scn *scn = elf->e_scn_1;
+ Elf32_Shdr *shdr = &scn->s_shdr32;
+
+ elf_assert(scn->s_index == 0);
+ rewrite(shdr->sh_size, shnum, scn->s_shdr_flags);
+ *flag |= scn->s_shdr_flags;
+ shnum = 0;
+ }
+ rewrite(ehdr->e_shnum, shnum, elf->e_ehdr_flags);
+ rewrite(ehdr->e_shentsize, entsize, elf->e_ehdr_flags);
+
+ rewrite(ehdr->e_ident[EI_MAG0], ELFMAG0, elf->e_ehdr_flags);
+ rewrite(ehdr->e_ident[EI_MAG1], ELFMAG1, elf->e_ehdr_flags);
+ rewrite(ehdr->e_ident[EI_MAG2], ELFMAG2, elf->e_ehdr_flags);
+ rewrite(ehdr->e_ident[EI_MAG3], ELFMAG3, elf->e_ehdr_flags);
+ rewrite(ehdr->e_ident[EI_CLASS], ELFCLASS32, elf->e_ehdr_flags);
+ rewrite(ehdr->e_ident[EI_DATA], encoding, elf->e_ehdr_flags);
+ rewrite(ehdr->e_ident[EI_VERSION], version, elf->e_ehdr_flags);
+ rewrite(ehdr->e_version, version, elf->e_ehdr_flags);
+
+ *flag |= elf->e_ehdr_flags;
+
+ return off;
+}
+
+#if __LIBELF64
+
+static off_t
+_elf64_layout(Elf *elf, unsigned *flag) {
+ int layout = (elf->e_elf_flags & ELF_F_LAYOUT) == 0;
+ int allow_overlap = (elf->e_elf_flags & ELF_F_LAYOUT_OVERLAP) != 0;
+ Elf64_Ehdr *ehdr = (Elf64_Ehdr*)elf->e_ehdr;
+ size_t off = 0;
+ unsigned version;
+ unsigned encoding;
+ size_t align_addr;
+ size_t entsize;
+ unsigned phnum;
+ unsigned shnum;
+ Elf_Scn *scn;
+
+ *flag = elf->e_elf_flags | elf->e_phdr_flags;
+
+ if ((version = ehdr->e_version) == EV_NONE) {
+ version = EV_CURRENT;
+ }
+ if (!valid_version(version)) {
+ seterr(ERROR_UNKNOWN_VERSION);
+ return -1;
+ }
+ if ((encoding = ehdr->e_ident[EI_DATA]) == ELFDATANONE) {
+ encoding = native_encoding;
+ }
+ if (!valid_encoding(encoding)) {
+ seterr(ERROR_UNKNOWN_ENCODING);
+ return -1;
+ }
+ entsize = _fsize(ELFCLASS64, version, ELF_T_EHDR);
+ elf_assert(entsize);
+ rewrite(ehdr->e_ehsize, entsize, elf->e_ehdr_flags);
+ off = entsize;
+
+ align_addr = _fsize(ELFCLASS64, version, ELF_T_ADDR);
+ elf_assert(align_addr);
+
+ if ((phnum = elf->e_phnum)) {
+ entsize = _fsize(ELFCLASS64, version, ELF_T_PHDR);
+ elf_assert(entsize);
+ if (layout) {
+ align(off, align_addr);
+ rewrite(ehdr->e_phoff, off, elf->e_ehdr_flags);
+ off += phnum * entsize;
+ }
+ else {
+ off = max(off, ehdr->e_phoff + phnum * entsize);
+ }
+ }
+ else {
+ entsize = 0;
+ if (layout) {
+ rewrite(ehdr->e_phoff, 0, elf->e_ehdr_flags);
+ }
+ }
+ if (phnum >= PN_XNUM) {
+ Elf_Scn *scn = elf->e_scn_1;
+ Elf32_Shdr *shdr = &scn->s_shdr32;
+
+ /* modify first section header, too! */
+ elf_assert(scn);
+ elf_assert(scn->s_index == 0);
+ rewrite(shdr->sh_info, phnum, scn->s_shdr_flags);
+ *flag |= scn->s_shdr_flags;
+ phnum = PN_XNUM;
+ }
+ rewrite(ehdr->e_phnum, phnum, elf->e_ehdr_flags);
+ rewrite(ehdr->e_phentsize, entsize, elf->e_ehdr_flags);
+
+ for (scn = elf->e_scn_1, shnum = 0; scn; scn = scn->s_link, ++shnum) {
+ Elf64_Shdr *shdr = &scn->s_shdr64;
+ size_t scn_align = 1;
+ off_t len;
+
+ elf_assert(scn->s_index == shnum);
+
+ *flag |= scn->s_scn_flags;
+
+ if (scn->s_index == SHN_UNDEF) {
+ rewrite(shdr->sh_entsize, 0, scn->s_shdr_flags);
+ if (layout) {
+ rewrite(shdr->sh_offset, 0, scn->s_shdr_flags);
+ rewrite(shdr->sh_size, 0, scn->s_shdr_flags);
+ rewrite(shdr->sh_addralign, 0, scn->s_shdr_flags);
+ }
+ *flag |= scn->s_shdr_flags;
+ continue;
+ }
+ if (shdr->sh_type == SHT_NULL) {
+ *flag |= scn->s_shdr_flags;
+ continue;
+ }
+
+ len = scn_data_layout(scn, version, shdr->sh_type, &scn_align, flag);
+ if (len == -1) {
+ return -1;
+ }
+
+ /*
+ * Never override the program's choice.
+ */
+ if (shdr->sh_entsize == 0) {
+ entsize = scn_entsize(elf, version, shdr->sh_type);
+ if (entsize > 1) {
+ rewrite(shdr->sh_entsize, entsize, scn->s_shdr_flags);
+ }
+ }
+
+ if (layout) {
+ align(off, scn_align);
+ rewrite(shdr->sh_offset, off, scn->s_shdr_flags);
+ rewrite(shdr->sh_size, (size_t)len, scn->s_shdr_flags);
+ rewrite(shdr->sh_addralign, scn_align, scn->s_shdr_flags);
+
+ if (shdr->sh_type != SHT_NOBITS) {
+ off += (size_t)len;
+ }
+ }
+ else if ((size_t)len > shdr->sh_size) {
+ seterr(ERROR_SCN2SMALL);
+ return -1;
+ }
+ else {
+ Elf_Scn *scn2;
+ size_t end1, end2;
+
+ end1 = shdr->sh_offset;
+ if (shdr->sh_type != SHT_NOBITS) {
+ end1 += shdr->sh_size;
+ }
+ if (!allow_overlap && shdr->sh_offset < off) {
+ /*
+ * check for overlapping sections
+ */
+ for (scn2 = elf->e_scn_1; scn2; scn2 = scn2->s_link) {
+ if (scn2 == scn) {
+ break;
+ }
+ end2 = scn2->s_shdr64.sh_offset;
+ if (scn2->s_shdr64.sh_type != SHT_NOBITS) {
+ end2 += scn2->s_shdr64.sh_size;
+ }
+ if (end1 > scn2->s_shdr64.sh_offset
+ && end2 > shdr->sh_offset) {
+ seterr(ERROR_SCN_OVERLAP);
+ return -1;
+ }
+ }
+ }
+ if (off < end1) {
+ off = end1;
+ }
+ }
+ *flag |= scn->s_shdr_flags;
+ }
+
+ if (shnum) {
+ entsize = _fsize(ELFCLASS64, version, ELF_T_SHDR);
+ elf_assert(entsize);
+ if (layout) {
+ align(off, align_addr);
+ rewrite(ehdr->e_shoff, off, elf->e_ehdr_flags);
+ off += shnum * entsize;
+ }
+ else {
+ off = max(off, ehdr->e_shoff + shnum * entsize);
+ }
+ }
+ else {
+ entsize = 0;
+ if (layout) {
+ rewrite(ehdr->e_shoff, 0, elf->e_ehdr_flags);
+ }
+ }
+ if (shnum >= SHN_LORESERVE) {
+ Elf_Scn *scn = elf->e_scn_1;
+ Elf64_Shdr *shdr = &scn->s_shdr64;
+
+ elf_assert(scn->s_index == 0);
+ rewrite(shdr->sh_size, shnum, scn->s_shdr_flags);
+ *flag |= scn->s_shdr_flags;
+ shnum = 0;
+ }
+ rewrite(ehdr->e_shnum, shnum, elf->e_ehdr_flags);
+ rewrite(ehdr->e_shentsize, entsize, elf->e_ehdr_flags);
+
+ rewrite(ehdr->e_ident[EI_MAG0], ELFMAG0, elf->e_ehdr_flags);
+ rewrite(ehdr->e_ident[EI_MAG1], ELFMAG1, elf->e_ehdr_flags);
+ rewrite(ehdr->e_ident[EI_MAG2], ELFMAG2, elf->e_ehdr_flags);
+ rewrite(ehdr->e_ident[EI_MAG3], ELFMAG3, elf->e_ehdr_flags);
+ rewrite(ehdr->e_ident[EI_CLASS], ELFCLASS64, elf->e_ehdr_flags);
+ rewrite(ehdr->e_ident[EI_DATA], encoding, elf->e_ehdr_flags);
+ rewrite(ehdr->e_ident[EI_VERSION], version, elf->e_ehdr_flags);
+ rewrite(ehdr->e_version, version, elf->e_ehdr_flags);
+
+ *flag |= elf->e_ehdr_flags;
+
+ return off;
+}
+
+#endif /* __LIBELF64 */
+
+#define ptrinside(p,a,l) ((p)>=(a)&&(p)<(a)+(l))
+#define newptr(p,o,n) ((p)=((p)-(o))+(n))
+
+static int
+_elf_update_pointers(Elf *elf, char *outbuf, size_t len) {
+ Elf_Scn *scn;
+ Scn_Data *sd;
+ char *data, *rawdata;
+
+ elf_assert(elf);
+ elf_assert(elf->e_data);
+ elf_assert(!elf->e_parent);
+ elf_assert(!elf->e_unmap_data);
+ elf_assert(elf->e_kind == ELF_K_ELF);
+ elf_assert(len >= EI_NIDENT);
+
+ /* resize memory images */
+ if (len <= elf->e_dsize) {
+ /* don't shorten the memory image */
+ data = elf->e_data;
+ }
+ else if ((data = (char*)realloc(elf->e_data, len))) {
+ elf->e_dsize = len;
+ }
+ else {
+ seterr(ERROR_IO_2BIG);
+ return -1;
+ }
+ if (elf->e_rawdata == elf->e_data) {
+ /* update frozen raw image */
+ memcpy(data, outbuf, len);
+ elf->e_data = elf->e_rawdata = data;
+ /* cooked data is stored outside the raw image */
+ return 0;
+ }
+ if (elf->e_rawdata) {
+ /* update raw image */
+ if (!(rawdata = (char*)realloc(elf->e_rawdata, len))) {
+ seterr(ERROR_IO_2BIG);
+ return -1;
+ }
+ memcpy(rawdata, outbuf, len);
+ elf->e_rawdata = rawdata;
+ }
+ if (data == elf->e_data) {
+ /* nothing more to do */
+ return 0;
+ }
+ /* adjust internal pointers */
+ for (scn = elf->e_scn_1; scn; scn = scn->s_link) {
+ elf_assert(scn->s_magic == SCN_MAGIC);
+ elf_assert(scn->s_elf == elf);
+ if ((sd = scn->s_data_1)) {
+ elf_assert(sd->sd_magic == DATA_MAGIC);
+ elf_assert(sd->sd_scn == scn);
+ if (sd->sd_memdata && !sd->sd_free_data) {
+ elf_assert(ptrinside(sd->sd_memdata, elf->e_data, elf->e_dsize));
+ if (sd->sd_data.d_buf == sd->sd_memdata) {
+ newptr(sd->sd_memdata, elf->e_data, data);
+ sd->sd_data.d_buf = sd->sd_memdata;
+ }
+ else {
+ newptr(sd->sd_memdata, elf->e_data, data);
+ }
+ }
+ }
+ if ((sd = scn->s_rawdata)) {
+ elf_assert(sd->sd_magic == DATA_MAGIC);
+ elf_assert(sd->sd_scn == scn);
+ if (sd->sd_memdata && sd->sd_free_data) {
+ size_t off, len;
+
+ if (elf->e_class == ELFCLASS32) {
+ off = scn->s_shdr32.sh_offset;
+ len = scn->s_shdr32.sh_size;
+ }
+#if __LIBELF64
+ else if (elf->e_class == ELFCLASS64) {
+ off = scn->s_shdr64.sh_offset;
+ len = scn->s_shdr64.sh_size;
+ }
+#endif /* __LIBELF64 */
+ else {
+ seterr(ERROR_UNIMPLEMENTED);
+ return -1;
+ }
+ if (!(rawdata = (char*)realloc(sd->sd_memdata, len))) {
+ seterr(ERROR_IO_2BIG);
+ return -1;
+ }
+ memcpy(rawdata, outbuf + off, len);
+ if (sd->sd_data.d_buf == sd->sd_memdata) {
+ sd->sd_data.d_buf = rawdata;
+ }
+ sd->sd_memdata = rawdata;
+ }
+ }
+ }
+ elf->e_data = data;
+ return 0;
+}
+
+#undef ptrinside
+#undef newptr
+
+static off_t
+_elf32_write(Elf *elf, char *outbuf, size_t len) {
+ Elf32_Ehdr *ehdr;
+ Elf32_Shdr *shdr;
+ Elf_Scn *scn;
+ Scn_Data *sd;
+ Elf_Data src;
+ Elf_Data dst;
+ unsigned encode;
+
+ elf_assert(len);
+ elf_assert(elf->e_ehdr);
+ ehdr = (Elf32_Ehdr*)elf->e_ehdr;
+ encode = ehdr->e_ident[EI_DATA];
+
+ src.d_buf = ehdr;
+ src.d_type = ELF_T_EHDR;
+ src.d_size = _msize(ELFCLASS32, _elf_version, ELF_T_EHDR);
+ src.d_version = _elf_version;
+ dst.d_buf = outbuf;
+ dst.d_size = ehdr->e_ehsize;
+ dst.d_version = ehdr->e_version;
+ if (!elf32_xlatetof(&dst, &src, encode)) {
+ return -1;
+ }
+
+ if (elf->e_phnum) {
+ src.d_buf = elf->e_phdr;
+ src.d_type = ELF_T_PHDR;
+ src.d_size = elf->e_phnum * _msize(ELFCLASS32, _elf_version, ELF_T_PHDR);
+ src.d_version = _elf_version;
+ dst.d_buf = outbuf + ehdr->e_phoff;
+ dst.d_size = elf->e_phnum * ehdr->e_phentsize;
+ dst.d_version = ehdr->e_version;
+ if (!elf32_xlatetof(&dst, &src, encode)) {
+ return -1;
+ }
+ }
+
+ for (scn = elf->e_scn_1; scn; scn = scn->s_link) {
+ elf_assert(scn->s_magic == SCN_MAGIC);
+ elf_assert(scn->s_elf == elf);
+
+ src.d_buf = &scn->s_uhdr;
+ src.d_type = ELF_T_SHDR;
+ src.d_size = _msize(ELFCLASS32, EV_CURRENT, ELF_T_SHDR);
+ src.d_version = EV_CURRENT;
+ dst.d_buf = outbuf + ehdr->e_shoff + scn->s_index * ehdr->e_shentsize;
+ dst.d_size = ehdr->e_shentsize;
+ dst.d_version = ehdr->e_version;
+ if (!elf32_xlatetof(&dst, &src, encode)) {
+ return -1;
+ }
+
+ if (scn->s_index == SHN_UNDEF) {
+ continue;
+ }
+ shdr = &scn->s_shdr32;
+ if (shdr->sh_type == SHT_NULL || shdr->sh_type == SHT_NOBITS) {
+ continue;
+ }
+ /* XXX: this is probably no longer necessary */
+ if (scn->s_data_1 && !elf_getdata(scn, NULL)) {
+ return -1;
+ }
+ for (sd = scn->s_data_1; sd; sd = sd->sd_link) {
+ elf_assert(sd->sd_magic == DATA_MAGIC);
+ elf_assert(sd->sd_scn == scn);
+ src = sd->sd_data;
+ if (!src.d_size) {
+ continue;
+ }
+ if (!src.d_buf) {
+ seterr(ERROR_NULLBUF);
+ return -1;
+ }
+ dst.d_buf = outbuf + shdr->sh_offset + src.d_off;
+ dst.d_size = src.d_size;
+ dst.d_version = ehdr->e_version;
+ if (valid_type(src.d_type)) {
+ size_t tmp;
+
+ tmp = _elf32_xltsize(&src, dst.d_version, ELFDATA2LSB, 1);
+ if (tmp == (size_t)-1) {
+ return -1;
+ }
+ dst.d_size = tmp;
+ }
+ else {
+ src.d_type = ELF_T_BYTE;
+ }
+ if (!elf32_xlatetof(&dst, &src, encode)) {
+ return -1;
+ }
+ }
+ }
+
+ /* cleanup */
+ if (elf->e_readable && _elf_update_pointers(elf, outbuf, len)) {
+ return -1;
+ }
+ /* NOTE: ehdr is no longer valid! */
+ ehdr = (Elf32_Ehdr*)elf->e_ehdr; elf_assert(ehdr);
+ elf->e_encoding = ehdr->e_ident[EI_DATA];
+ elf->e_version = ehdr->e_ident[EI_VERSION];
+ elf->e_elf_flags &= ~ELF_F_DIRTY;
+ elf->e_ehdr_flags &= ~ELF_F_DIRTY;
+ elf->e_phdr_flags &= ~ELF_F_DIRTY;
+ for (scn = elf->e_scn_1; scn; scn = scn->s_link) {
+ scn->s_scn_flags &= ~ELF_F_DIRTY;
+ scn->s_shdr_flags &= ~ELF_F_DIRTY;
+ for (sd = scn->s_data_1; sd; sd = sd->sd_link) {
+ sd->sd_data_flags &= ~ELF_F_DIRTY;
+ }
+ if (elf->e_readable) {
+ shdr = &scn->s_shdr32;
+ scn->s_type = shdr->sh_type;
+ scn->s_size = shdr->sh_size;
+ scn->s_offset = shdr->sh_offset;
+ }
+ }
+ elf->e_size = len;
+ return len;
+}
+
+#if __LIBELF64
+
+static off_t
+_elf64_write(Elf *elf, char *outbuf, size_t len) {
+ Elf64_Ehdr *ehdr;
+ Elf64_Shdr *shdr;
+ Elf_Scn *scn;
+ Scn_Data *sd;
+ Elf_Data src;
+ Elf_Data dst;
+ unsigned encode;
+
+ elf_assert(len);
+ elf_assert(elf->e_ehdr);
+ ehdr = (Elf64_Ehdr*)elf->e_ehdr;
+ encode = ehdr->e_ident[EI_DATA];
+
+ src.d_buf = ehdr;
+ src.d_type = ELF_T_EHDR;
+ src.d_size = _msize(ELFCLASS64, _elf_version, ELF_T_EHDR);
+ src.d_version = _elf_version;
+ dst.d_buf = outbuf;
+ dst.d_size = ehdr->e_ehsize;
+ dst.d_version = ehdr->e_version;
+ if (!elf64_xlatetof(&dst, &src, encode)) {
+ return -1;
+ }
+
+ if (elf->e_phnum) {
+ src.d_buf = elf->e_phdr;
+ src.d_type = ELF_T_PHDR;
+ src.d_size = elf->e_phnum * _msize(ELFCLASS64, _elf_version, ELF_T_PHDR);
+ src.d_version = _elf_version;
+ dst.d_buf = outbuf + ehdr->e_phoff;
+ dst.d_size = elf->e_phnum * ehdr->e_phentsize;
+ dst.d_version = ehdr->e_version;
+ if (!elf64_xlatetof(&dst, &src, encode)) {
+ return -1;
+ }
+ }
+
+ for (scn = elf->e_scn_1; scn; scn = scn->s_link) {
+ elf_assert(scn->s_magic == SCN_MAGIC);
+ elf_assert(scn->s_elf == elf);
+
+ src.d_buf = &scn->s_uhdr;
+ src.d_type = ELF_T_SHDR;
+ src.d_size = _msize(ELFCLASS64, EV_CURRENT, ELF_T_SHDR);
+ src.d_version = EV_CURRENT;
+ dst.d_buf = outbuf + ehdr->e_shoff + scn->s_index * ehdr->e_shentsize;
+ dst.d_size = ehdr->e_shentsize;
+ dst.d_version = ehdr->e_version;
+ if (!elf64_xlatetof(&dst, &src, encode)) {
+ return -1;
+ }
+
+ if (scn->s_index == SHN_UNDEF) {
+ continue;
+ }
+ shdr = &scn->s_shdr64;
+ if (shdr->sh_type == SHT_NULL || shdr->sh_type == SHT_NOBITS) {
+ continue;
+ }
+ /* XXX: this is probably no longer necessary */
+ if (scn->s_data_1 && !elf_getdata(scn, NULL)) {
+ return -1;
+ }
+ for (sd = scn->s_data_1; sd; sd = sd->sd_link) {
+ elf_assert(sd->sd_magic == DATA_MAGIC);
+ elf_assert(sd->sd_scn == scn);
+ src = sd->sd_data;
+ if (!src.d_size) {
+ continue;
+ }
+ if (!src.d_buf) {
+ seterr(ERROR_NULLBUF);
+ return -1;
+ }
+ dst.d_buf = outbuf + shdr->sh_offset + src.d_off;
+ dst.d_size = src.d_size;
+ dst.d_version = ehdr->e_version;
+ if (valid_type(src.d_type)) {
+ size_t tmp;
+
+ tmp = _elf64_xltsize(&src, dst.d_version, ELFDATA2LSB, 1);
+ if (tmp == (size_t)-1) {
+ return -1;
+ }
+ dst.d_size = tmp;
+ }
+ else {
+ src.d_type = ELF_T_BYTE;
+ }
+ if (!elf64_xlatetof(&dst, &src, encode)) {
+ return -1;
+ }
+ }
+ }
+
+ /* cleanup */
+ if (elf->e_readable && _elf_update_pointers(elf, outbuf, len)) {
+ return -1;
+ }
+ /* NOTE: ehdr is no longer valid! */
+ ehdr = (Elf64_Ehdr*)elf->e_ehdr; elf_assert(ehdr);
+ elf->e_encoding = ehdr->e_ident[EI_DATA];
+ elf->e_version = ehdr->e_ident[EI_VERSION];
+ elf->e_elf_flags &= ~ELF_F_DIRTY;
+ elf->e_ehdr_flags &= ~ELF_F_DIRTY;
+ elf->e_phdr_flags &= ~ELF_F_DIRTY;
+ for (scn = elf->e_scn_1; scn; scn = scn->s_link) {
+ scn->s_scn_flags &= ~ELF_F_DIRTY;
+ scn->s_shdr_flags &= ~ELF_F_DIRTY;
+ for (sd = scn->s_data_1; sd; sd = sd->sd_link) {
+ sd->sd_data_flags &= ~ELF_F_DIRTY;
+ }
+ if (elf->e_readable) {
+ shdr = &scn->s_shdr64;
+ scn->s_type = shdr->sh_type;
+ scn->s_size = shdr->sh_size;
+ scn->s_offset = shdr->sh_offset;
+ }
+ }
+ elf->e_size = len;
+ return len;
+}
+
+#endif /* __LIBELF64 */
+
+static int
+xwrite(int fd, char *buffer, size_t len) {
+ size_t done = 0;
+ size_t n;
+
+ while (done < len) {
+ n = write(fd, buffer + done, len - done);
+ if (n == 0) {
+ /* file system full */
+ return -1;
+ }
+ else if (n != (size_t)-1) {
+ /* some bytes written, continue */
+ done += n;
+ }
+ else if (errno != EAGAIN && errno != EINTR) {
+ /* real error */
+ return -1;
+ }
+ }
+ return 0;
+}
+
+static off_t
+_elf_output(Elf *elf, int fd, size_t len, off_t (*_elf_write)(Elf*, char*, size_t)) {
+ char *buf;
+ off_t err;
+
+ elf_assert(len);
+#if HAVE_FTRUNCATE
+ ftruncate(fd, 0);
+#endif /* HAVE_FTRUNCATE */
+#if HAVE_MMAP
+ /*
+ * Make sure the file is (at least) len bytes long
+ */
+#if HAVE_FTRUNCATE
+ lseek(fd, (off_t)len, SEEK_SET);
+ if (ftruncate(fd, len)) {
+#else /* HAVE_FTRUNCATE */
+ {
+#endif /* HAVE_FTRUNCATE */
+ if (lseek(fd, (off_t)len - 1, SEEK_SET) != (off_t)len - 1) {
+ seterr(ERROR_IO_SEEK);
+ return -1;
+ }
+ if (xwrite(fd, "", 1)) {
+ seterr(ERROR_IO_WRITE);
+ return -1;
+ }
+ }
+ buf = (void*)mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ if (buf != (char*)-1) {
+ if ((char)_elf_fill && !(elf->e_elf_flags & ELF_F_LAYOUT)) {
+ memset(buf, _elf_fill, len);
+ }
+ err = _elf_write(elf, buf, len);
+ munmap(buf, len);
+ return err;
+ }
+#endif /* HAVE_MMAP */
+ if (!(buf = (char*)malloc(len))) {
+ seterr(ERROR_MEM_OUTBUF);
+ return -1;
+ }
+ memset(buf, _elf_fill, len);
+ err = _elf_write(elf, buf, len);
+ if (err != -1 && (size_t)err == len) {
+ if (lseek(fd, (off_t)0, SEEK_SET)) {
+ seterr(ERROR_IO_SEEK);
+ err = -1;
+ }
+ else if (xwrite(fd, buf, len)) {
+ seterr(ERROR_IO_WRITE);
+ err = -1;
+ }
+ }
+ free(buf);
+ return err;
+}
+
+off_t
+elf_update(Elf *elf, Elf_Cmd cmd) {
+ unsigned flag;
+ off_t len;
+
+ if (!elf) {
+ return -1;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ if (cmd == ELF_C_WRITE) {
+ if (!elf->e_writable) {
+ seterr(ERROR_RDONLY);
+ return -1;
+ }
+ if (elf->e_disabled) {
+ seterr(ERROR_FDDISABLED);
+ return -1;
+ }
+ }
+ else if (cmd != ELF_C_NULL) {
+ seterr(ERROR_INVALID_CMD);
+ return -1;
+ }
+
+ if (!elf->e_ehdr) {
+ seterr(ERROR_NOEHDR);
+ }
+ else if (elf->e_kind != ELF_K_ELF) {
+ seterr(ERROR_NOTELF);
+ }
+ else if (elf->e_class == ELFCLASS32) {
+ len = _elf32_layout(elf, &flag);
+ if (len != -1 && cmd == ELF_C_WRITE && (flag & ELF_F_DIRTY)) {
+ len = _elf_output(elf, elf->e_fd, (size_t)len, _elf32_write);
+ }
+ return len;
+ }
+#if __LIBELF64
+ else if (elf->e_class == ELFCLASS64) {
+ len = _elf64_layout(elf, &flag);
+ if (len != -1 && cmd == ELF_C_WRITE && (flag & ELF_F_DIRTY)) {
+ len = _elf_output(elf, elf->e_fd, (size_t)len, _elf64_write);
+ }
+ return len;
+ }
+#endif /* __LIBELF64 */
+ else if (valid_class(elf->e_class)) {
+ seterr(ERROR_UNIMPLEMENTED);
+ }
+ else {
+ seterr(ERROR_UNKNOWN_CLASS);
+ }
+ return -1;
+}
diff --git a/lib/verdef.h b/lib/verdef.h
new file mode 100644
index 0000000..e17f682
--- /dev/null
+++ b/lib/verdef.h
@@ -0,0 +1,241 @@
+/*
+ * verdef.h - copy versioning information.
+ * Copyright (C) 2001 - 2006 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef lint
+static const char verdef_h_rcsid[] = "@(#) $Id: verdef.h,v 1.13 2008/05/23 08:15:35 michael Exp $";
+#endif /* lint */
+
+#if VER_DEF_CURRENT != 1
+#error libelf currently does not support VER_DEF_CURRENT != 1
+#endif /* VER_DEF_CURRENT != 1 */
+
+#if TOFILE
+
+static void
+__store_verdaux(verdaux_ftype *dst, const verdaux_mtype *src, unsigned enc) {
+ if (enc == ELFDATA2LSB) {
+ __store_u32L(dst->vda_name, src->vda_name);
+ __store_u32L(dst->vda_next, src->vda_next);
+ }
+ else {
+ __store_u32M(dst->vda_name, src->vda_name);
+ __store_u32M(dst->vda_next, src->vda_next);
+ }
+}
+
+static void
+__store_verdef(verdef_ftype *dst, const verdef_mtype *src, unsigned enc) {
+ if (enc == ELFDATA2LSB) {
+ __store_u16L(dst->vd_version, src->vd_version);
+ __store_u16L(dst->vd_flags, src->vd_flags);
+ __store_u16L(dst->vd_ndx, src->vd_ndx);
+ __store_u16L(dst->vd_cnt, src->vd_cnt);
+ __store_u32L(dst->vd_hash, src->vd_hash);
+ __store_u32L(dst->vd_aux, src->vd_aux);
+ __store_u32L(dst->vd_next, src->vd_next);
+ }
+ else {
+ __store_u16M(dst->vd_version, src->vd_version);
+ __store_u16M(dst->vd_flags, src->vd_flags);
+ __store_u16M(dst->vd_ndx, src->vd_ndx);
+ __store_u16M(dst->vd_cnt, src->vd_cnt);
+ __store_u32M(dst->vd_hash, src->vd_hash);
+ __store_u32M(dst->vd_aux, src->vd_aux);
+ __store_u32M(dst->vd_next, src->vd_next);
+ }
+}
+
+typedef verdaux_mtype verdaux_stype;
+typedef verdaux_ftype verdaux_dtype;
+typedef verdef_mtype verdef_stype;
+typedef verdef_ftype verdef_dtype;
+typedef align_mtype verdef_atype;
+
+#define copy_verdaux_srctotmp(d, s, e) (*(d) = *(s))
+#define copy_verdaux_tmptodst(d, s, e) __store_verdaux((d), (s), (e))
+#define copy_verdef_srctotmp(d, s, e) (*(d) = *(s))
+#define copy_verdef_tmptodst(d, s, e) __store_verdef((d), (s), (e))
+
+#define translator_suffix _tof
+
+#else /* TOFILE */
+
+static void
+__load_verdaux(verdaux_mtype *dst, const verdaux_ftype *src, unsigned enc) {
+ if (enc == ELFDATA2LSB) {
+ dst->vda_name = __load_u32L(src->vda_name);
+ dst->vda_next = __load_u32L(src->vda_next);
+ }
+ else {
+ dst->vda_name = __load_u32M(src->vda_name);
+ dst->vda_next = __load_u32M(src->vda_next);
+ }
+}
+
+static void
+__load_verdef(verdef_mtype *dst, const verdef_ftype *src, unsigned enc) {
+ if (enc == ELFDATA2LSB) {
+ dst->vd_version = __load_u16L(src->vd_version);
+ dst->vd_flags = __load_u16L(src->vd_flags);
+ dst->vd_ndx = __load_u16L(src->vd_ndx);
+ dst->vd_cnt = __load_u16L(src->vd_cnt);
+ dst->vd_hash = __load_u32L(src->vd_hash);
+ dst->vd_aux = __load_u32L(src->vd_aux);
+ dst->vd_next = __load_u32L(src->vd_next);
+ }
+ else {
+ dst->vd_version = __load_u16M(src->vd_version);
+ dst->vd_flags = __load_u16M(src->vd_flags);
+ dst->vd_ndx = __load_u16M(src->vd_ndx);
+ dst->vd_cnt = __load_u16M(src->vd_cnt);
+ dst->vd_hash = __load_u32M(src->vd_hash);
+ dst->vd_aux = __load_u32M(src->vd_aux);
+ dst->vd_next = __load_u32M(src->vd_next);
+ }
+}
+
+typedef verdaux_ftype verdaux_stype;
+typedef verdaux_mtype verdaux_dtype;
+typedef verdef_ftype verdef_stype;
+typedef verdef_mtype verdef_dtype;
+typedef align_ftype verdef_atype;
+
+#define copy_verdaux_srctotmp(d, s, e) __load_verdaux((d), (s), (e))
+#define copy_verdaux_tmptodst(d, s, e) (*(d) = *(s))
+#define copy_verdef_srctotmp(d, s, e) __load_verdef((d), (s), (e))
+#define copy_verdef_tmptodst(d, s, e) (*(d) = *(s))
+
+#define translator_suffix _tom
+
+#endif /* TOFILE */
+
+#define cat3(a,b,c) a##b##c
+#define xlt3(p,e,s) cat3(p,e,s)
+#define xltprefix(x) xlt3(x,_,class_suffix)
+#define translator(x,e) xlt3(xltprefix(_elf_##x),e,translator_suffix)
+
+static size_t
+xlt_verdef(unsigned char *dst, const unsigned char *src, size_t n, unsigned enc) {
+ size_t off;
+
+ if (sizeof(verdef_stype) != sizeof(verdef_dtype)
+ || sizeof(verdaux_stype) != sizeof(verdaux_dtype)) {
+ /* never happens for ELF v1 and Verneed v1 */
+ seterr(ERROR_UNIMPLEMENTED);
+ return (size_t)-1;
+ }
+ /* size translation shortcut */
+ if (dst == NULL) {
+ return n;
+ }
+ if (src == NULL) {
+ seterr(ERROR_NULLBUF);
+ return (size_t)-1;
+ }
+ off = 0;
+ while (off + sizeof(verdef_stype) <= n) {
+ const verdef_stype *svd;
+ verdef_dtype *dvd;
+ verdef_mtype vd;
+ size_t acount;
+ size_t aoff;
+
+ /*
+ * check for proper alignment
+ */
+ if (off % sizeof(verdef_atype)) {
+ seterr(ERROR_VERDEF_FORMAT);
+ return (size_t)-1;
+ }
+ /*
+ * copy and check src
+ */
+ svd = (verdef_stype*)(src + off);
+ dvd = (verdef_dtype*)(dst + off);
+ copy_verdef_srctotmp(&vd, svd, enc);
+ if (vd.vd_version < 1
+ || vd.vd_version > VER_DEF_CURRENT) {
+ seterr(ERROR_VERDEF_VERSION);
+ return (size_t)-1;
+ }
+ if (vd.vd_cnt < 1
+ || vd.vd_aux == 0) {
+ seterr(ERROR_VERDEF_FORMAT);
+ return (size_t)-1;
+ }
+ copy_verdef_tmptodst(dvd, &vd, enc);
+ /*
+ * copy aux array
+ */
+ aoff = off + vd.vd_aux;
+ for (acount = 0; acount < vd.vd_cnt; acount++) {
+ const verdaux_stype *svda;
+ verdaux_dtype *dvda;
+ verdaux_mtype vda;
+
+ /*
+ * are we still inside the buffer limits?
+ */
+ if (aoff + sizeof(verdaux_stype) > n) {
+ break;
+ }
+ /*
+ * check for proper alignment
+ */
+ if (aoff % sizeof(verdef_atype)) {
+ seterr(ERROR_VERDEF_FORMAT);
+ return (size_t)-1;
+ }
+ /*
+ * copy and check src
+ */
+ svda = (verdaux_stype*)(src + aoff);
+ dvda = (verdaux_dtype*)(dst + aoff);
+ copy_verdaux_srctotmp(&vda, svda, enc);
+ copy_verdaux_tmptodst(dvda, &vda, enc);
+ /*
+ * advance to next verdaux
+ */
+ if (vda.vda_next == 0) {
+ /* end of list */
+ break;
+ }
+ aoff += vda.vda_next;
+ }
+ /*
+ * advance to next verdef
+ */
+ if (vd.vd_next == 0) {
+ /* end of list */
+ break;
+ }
+ off += vd.vd_next;
+ }
+ return n;
+}
+
+size_t
+translator(verdef,L11)(unsigned char *dst, const unsigned char *src, size_t n) {
+ return xlt_verdef(dst, src, n, ELFDATA2LSB);
+}
+
+size_t
+translator(verdef,M11)(unsigned char *dst, const unsigned char *src, size_t n) {
+ return xlt_verdef(dst, src, n, ELFDATA2MSB);
+}
diff --git a/lib/verdef_32_tof.c b/lib/verdef_32_tof.c
new file mode 100644
index 0000000..efca6ee
--- /dev/null
+++ b/lib/verdef_32_tof.c
@@ -0,0 +1,53 @@
+/*
+verdef_32_tof.c - copy 32-bit versioning information.
+Copyright (C) 2001 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+#include <ext_types.h>
+#include <byteswap.h>
+
+#if __LIBELF_SYMBOL_VERSIONS
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: verdef_32_tof.c,v 1.5 2008/05/23 08:15:35 michael Exp $";
+#endif /* lint */
+
+typedef Elf32_Verdaux verdaux_mtype;
+typedef Elf32_Verdef verdef_mtype;
+typedef Elf32_Vernaux vernaux_mtype;
+typedef Elf32_Verneed verneed_mtype;
+typedef Elf32_Word align_mtype;
+
+typedef __ext_Elf32_Verdaux verdaux_ftype;
+typedef __ext_Elf32_Verdef verdef_ftype;
+typedef __ext_Elf32_Vernaux vernaux_ftype;
+typedef __ext_Elf32_Verneed verneed_ftype;
+typedef __ext_Elf32_Word align_ftype;
+
+#define class_suffix 32
+
+#undef TOFILE
+#define TOFILE 1
+
+/*
+ * Include shared code
+ */
+#include "verdef.h"
+#include "verneed.h"
+
+#endif /* __LIBELF_SYMBOL_VERSIONS */
diff --git a/lib/verdef_32_tom.c b/lib/verdef_32_tom.c
new file mode 100644
index 0000000..f0efd0f
--- /dev/null
+++ b/lib/verdef_32_tom.c
@@ -0,0 +1,53 @@
+/*
+verdef_32_tom.c - copy 32-bit versioning information.
+Copyright (C) 2001 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+#include <ext_types.h>
+#include <byteswap.h>
+
+#if __LIBELF_SYMBOL_VERSIONS
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: verdef_32_tom.c,v 1.5 2008/05/23 08:15:35 michael Exp $";
+#endif /* lint */
+
+typedef Elf32_Verdaux verdaux_mtype;
+typedef Elf32_Verdef verdef_mtype;
+typedef Elf32_Vernaux vernaux_mtype;
+typedef Elf32_Verneed verneed_mtype;
+typedef Elf32_Word align_mtype;
+
+typedef __ext_Elf32_Verdaux verdaux_ftype;
+typedef __ext_Elf32_Verdef verdef_ftype;
+typedef __ext_Elf32_Vernaux vernaux_ftype;
+typedef __ext_Elf32_Verneed verneed_ftype;
+typedef __ext_Elf32_Word align_ftype;
+
+#define class_suffix 32
+
+#undef TOFILE
+#define TOFILE 0
+
+/*
+ * Include shared code
+ */
+#include "verdef.h"
+#include "verneed.h"
+
+#endif /* __LIBELF_SYMBOL_VERSIONS */
diff --git a/lib/verdef_64_tof.c b/lib/verdef_64_tof.c
new file mode 100644
index 0000000..16b903e
--- /dev/null
+++ b/lib/verdef_64_tof.c
@@ -0,0 +1,53 @@
+/*
+verdef_64_tof.c - copy 64-bit versioning information.
+Copyright (C) 2001 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+#include <ext_types.h>
+#include <byteswap.h>
+
+#if __LIBELF64 && __LIBELF_SYMBOL_VERSIONS
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: verdef_64_tof.c,v 1.5 2008/05/23 08:15:35 michael Exp $";
+#endif /* lint */
+
+typedef Elf64_Verdaux verdaux_mtype;
+typedef Elf64_Verdef verdef_mtype;
+typedef Elf64_Vernaux vernaux_mtype;
+typedef Elf64_Verneed verneed_mtype;
+typedef Elf64_Word align_mtype;
+
+typedef __ext_Elf64_Verdaux verdaux_ftype;
+typedef __ext_Elf64_Verdef verdef_ftype;
+typedef __ext_Elf64_Vernaux vernaux_ftype;
+typedef __ext_Elf64_Verneed verneed_ftype;
+typedef __ext_Elf64_Word align_ftype;
+
+#define class_suffix 64
+
+#undef TOFILE
+#define TOFILE 1
+
+/*
+ * Include shared code
+ */
+#include "verdef.h"
+#include "verneed.h"
+
+#endif /* __LIBELF64 && __LIBELF_SYMBOL_VERSIONS */
diff --git a/lib/verdef_64_tom.c b/lib/verdef_64_tom.c
new file mode 100644
index 0000000..183524e
--- /dev/null
+++ b/lib/verdef_64_tom.c
@@ -0,0 +1,53 @@
+/*
+verdef_64_tom.c - copy 64-bit versioning information.
+Copyright (C) 2001 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+#include <ext_types.h>
+#include <byteswap.h>
+
+#if __LIBELF64 && __LIBELF_SYMBOL_VERSIONS
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: verdef_64_tom.c,v 1.5 2008/05/23 08:15:35 michael Exp $";
+#endif /* lint */
+
+typedef Elf64_Verdaux verdaux_mtype;
+typedef Elf64_Verdef verdef_mtype;
+typedef Elf64_Vernaux vernaux_mtype;
+typedef Elf64_Verneed verneed_mtype;
+typedef Elf64_Word align_mtype;
+
+typedef __ext_Elf64_Verdaux verdaux_ftype;
+typedef __ext_Elf64_Verdef verdef_ftype;
+typedef __ext_Elf64_Vernaux vernaux_ftype;
+typedef __ext_Elf64_Verneed verneed_ftype;
+typedef __ext_Elf64_Word align_ftype;
+
+#define class_suffix 64
+
+#undef TOFILE
+#define TOFILE 0
+
+/*
+ * Include shared code
+ */
+#include "verdef.h"
+#include "verneed.h"
+
+#endif /* __LIBELF64 && __LIBELF_SYMBOL_VERSIONS */
diff --git a/lib/verneed.h b/lib/verneed.h
new file mode 100644
index 0000000..54f0f06
--- /dev/null
+++ b/lib/verneed.h
@@ -0,0 +1,245 @@
+/*
+ * verneed.h - copy versioning information.
+ * Copyright (C) 2001 - 2006 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef lint
+static const char verneed_h_rcsid[] = "@(#) $Id: verneed.h,v 1.13 2008/05/23 08:15:35 michael Exp $";
+#endif /* lint */
+
+#if VER_NEED_CURRENT != 1
+#error libelf currently does not support VER_NEED_CURRENT != 1
+#endif /* VER_NEED_CURRENT != 1 */
+
+#if TOFILE
+
+static void
+__store_vernaux(vernaux_ftype *dst, const vernaux_mtype *src, unsigned enc) {
+ if (enc == ELFDATA2LSB) {
+ __store_u32L(dst->vna_hash, src->vna_hash);
+ __store_u16L(dst->vna_flags, src->vna_flags);
+ __store_u16L(dst->vna_other, src->vna_other);
+ __store_u32L(dst->vna_name, src->vna_name);
+ __store_u32L(dst->vna_next, src->vna_next);
+ }
+ else {
+ __store_u32M(dst->vna_hash, src->vna_hash);
+ __store_u16M(dst->vna_flags, src->vna_flags);
+ __store_u16M(dst->vna_other, src->vna_other);
+ __store_u32M(dst->vna_name, src->vna_name);
+ __store_u32M(dst->vna_next, src->vna_next);
+ }
+}
+
+static void
+__store_verneed(verneed_ftype *dst, const verneed_mtype *src, unsigned enc) {
+ if (enc == ELFDATA2LSB) {
+ __store_u16L(dst->vn_version, src->vn_version);
+ __store_u16L(dst->vn_cnt, src->vn_cnt);
+ __store_u32L(dst->vn_file, src->vn_file);
+ __store_u32L(dst->vn_aux, src->vn_aux);
+ __store_u32L(dst->vn_next, src->vn_next);
+ }
+ else {
+ __store_u16M(dst->vn_version, src->vn_version);
+ __store_u16M(dst->vn_cnt, src->vn_cnt);
+ __store_u32M(dst->vn_file, src->vn_file);
+ __store_u32M(dst->vn_aux, src->vn_aux);
+ __store_u32M(dst->vn_next, src->vn_next);
+ }
+}
+
+typedef vernaux_mtype vernaux_stype;
+typedef vernaux_ftype vernaux_dtype;
+typedef verneed_mtype verneed_stype;
+typedef verneed_ftype verneed_dtype;
+typedef align_mtype verneed_atype;
+
+#define copy_vernaux_srctotmp(d, s, e) (*(d) = *(s))
+#define copy_vernaux_tmptodst(d, s, e) __store_vernaux((d), (s), (e))
+#define copy_verneed_srctotmp(d, s, e) (*(d) = *(s))
+#define copy_verneed_tmptodst(d, s, e) __store_verneed((d), (s), (e))
+
+#define translator_suffix _tof
+
+#else /* TOFILE */
+
+static void
+__load_vernaux(vernaux_mtype *dst, const vernaux_ftype *src, unsigned enc) {
+ if (enc == ELFDATA2LSB) {
+ dst->vna_hash = __load_u32L(src->vna_hash);
+ dst->vna_flags = __load_u16L(src->vna_flags);
+ dst->vna_other = __load_u16L(src->vna_other);
+ dst->vna_name = __load_u32L(src->vna_name);
+ dst->vna_next = __load_u32L(src->vna_next);
+ }
+ else {
+ dst->vna_hash = __load_u32M(src->vna_hash);
+ dst->vna_flags = __load_u16M(src->vna_flags);
+ dst->vna_other = __load_u16M(src->vna_other);
+ dst->vna_name = __load_u32M(src->vna_name);
+ dst->vna_next = __load_u32M(src->vna_next);
+ }
+}
+
+static void
+__load_verneed(verneed_mtype *dst, const verneed_ftype *src, unsigned enc) {
+ if (enc == ELFDATA2LSB) {
+ dst->vn_version = __load_u16L(src->vn_version);
+ dst->vn_cnt = __load_u16L(src->vn_cnt);
+ dst->vn_file = __load_u32L(src->vn_file);
+ dst->vn_aux = __load_u32L(src->vn_aux);
+ dst->vn_next = __load_u32L(src->vn_next);
+ }
+ else {
+ dst->vn_version = __load_u16M(src->vn_version);
+ dst->vn_cnt = __load_u16M(src->vn_cnt);
+ dst->vn_file = __load_u32M(src->vn_file);
+ dst->vn_aux = __load_u32M(src->vn_aux);
+ dst->vn_next = __load_u32M(src->vn_next);
+ }
+}
+
+typedef vernaux_ftype vernaux_stype;
+typedef vernaux_mtype vernaux_dtype;
+typedef verneed_ftype verneed_stype;
+typedef verneed_mtype verneed_dtype;
+typedef align_ftype verneed_atype;
+
+#define copy_vernaux_srctotmp(d, s, e) __load_vernaux((d), (s), (e))
+#define copy_vernaux_tmptodst(d, s, e) (*(d) = *(s))
+#define copy_verneed_srctotmp(d, s, e) __load_verneed((d), (s), (e))
+#define copy_verneed_tmptodst(d, s, e) (*(d) = *(s))
+
+#define translator_suffix _tom
+
+#endif /* TOFILE */
+
+#define cat3(a,b,c) a##b##c
+#define xlt3(p,e,s) cat3(p,e,s)
+#define xltprefix(x) xlt3(x,_,class_suffix)
+#define translator(x,e) xlt3(xltprefix(_elf_##x),e,translator_suffix)
+
+static size_t
+xlt_verneed(unsigned char *dst, const unsigned char *src, size_t n, unsigned enc) {
+ size_t off;
+
+ if (sizeof(verneed_stype) != sizeof(verneed_dtype)
+ || sizeof(vernaux_stype) != sizeof(vernaux_dtype)) {
+ /* never happens for ELF v1 and Verneed v1 */
+ seterr(ERROR_UNIMPLEMENTED);
+ return (size_t)-1;
+ }
+ /* size translation shortcut */
+ if (dst == NULL) {
+ return n;
+ }
+ if (src == NULL) {
+ seterr(ERROR_NULLBUF);
+ return (size_t)-1;
+ }
+ off = 0;
+ while (off + sizeof(verneed_stype) <= n) {
+ const verneed_stype *svn;
+ verneed_dtype *dvn;
+ verneed_mtype vn;
+ size_t acount;
+ size_t aoff;
+
+ /*
+ * check for proper alignment
+ */
+ if (off % sizeof(verneed_atype)) {
+ seterr(ERROR_VERNEED_FORMAT);
+ return (size_t)-1;
+ }
+ /*
+ * copy and check src
+ */
+ svn = (verneed_stype*)(src + off);
+ dvn = (verneed_dtype*)(dst + off);
+ copy_verneed_srctotmp(&vn, svn, enc);
+ if (vn.vn_version < 1
+ || vn.vn_version > VER_NEED_CURRENT) {
+ seterr(ERROR_VERNEED_VERSION);
+ return (size_t)-1;
+ }
+ if (vn.vn_cnt < 1
+ || vn.vn_aux == 0) {
+ seterr(ERROR_VERNEED_FORMAT);
+ return (size_t)-1;
+ }
+ copy_verneed_tmptodst(dvn, &vn, enc);
+ /*
+ * copy aux array
+ */
+ aoff = off + vn.vn_aux;
+ for (acount = 0; acount < vn.vn_cnt; acount++) {
+ const vernaux_stype *svna;
+ vernaux_dtype *dvna;
+ vernaux_mtype vna;
+
+ /*
+ * are we still inside the buffer limits?
+ */
+ if (aoff + sizeof(vernaux_stype) > n) {
+ break;
+ }
+ /*
+ * check for proper alignment
+ */
+ if (aoff % sizeof(verneed_atype)) {
+ seterr(ERROR_VERNEED_FORMAT);
+ return (size_t)-1;
+ }
+ /*
+ * copy and check src
+ */
+ svna = (vernaux_stype*)(src + aoff);
+ dvna = (vernaux_dtype*)(dst + aoff);
+ copy_vernaux_srctotmp(&vna, svna, enc);
+ copy_vernaux_tmptodst(dvna, &vna, enc);
+ /*
+ * advance to next vernaux
+ */
+ if (vna.vna_next == 0) {
+ /* end of list */
+ break;
+ }
+ aoff += vna.vna_next;
+ }
+ /*
+ * advance to next verneed
+ */
+ if (vn.vn_next == 0) {
+ /* end of list */
+ break;
+ }
+ off += vn.vn_next;
+ }
+ return n;
+}
+
+size_t
+translator(verneed,L11)(unsigned char *dst, const unsigned char *src, size_t n) {
+ return xlt_verneed(dst, src, n, ELFDATA2LSB);
+}
+
+size_t
+translator(verneed,M11)(unsigned char *dst, const unsigned char *src, size_t n) {
+ return xlt_verneed(dst, src, n, ELFDATA2MSB);
+}
diff --git a/lib/version.c b/lib/version.c
new file mode 100644
index 0000000..7a901d3
--- /dev/null
+++ b/lib/version.c
@@ -0,0 +1,44 @@
+/*
+ * version.c - implementation of the elf_version(3) function.
+ * Copyright (C) 1995 - 1998, 2007 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: version.c,v 1.8 2008/05/23 08:15:35 michael Exp $";
+#endif /* lint */
+
+unsigned
+elf_version(unsigned ver) {
+ const char *s;
+ unsigned tmp;
+
+ if ((s = getenv("LIBELF_SANITY_CHECKS"))) {
+ _elf_sanity_checks = (int)strtol(s, (char**)NULL, 0);
+ }
+ if (ver == EV_NONE) {
+ return EV_CURRENT;
+ }
+ if (!valid_version(ver)) {
+ seterr(ERROR_UNKNOWN_VERSION);
+ return EV_NONE;
+ }
+ tmp = _elf_version == EV_NONE ? EV_CURRENT : _elf_version;
+ _elf_version = ver;
+ return tmp;
+}
diff --git a/lib/x.elfext.c b/lib/x.elfext.c
new file mode 100644
index 0000000..cbd3539
--- /dev/null
+++ b/lib/x.elfext.c
@@ -0,0 +1,190 @@
+/*
+ * x.elfext.c -- handle ELF format extensions
+ * Copyright (C) 2002 - 2006 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: x.elfext.c,v 1.5 2009/07/07 17:57:43 michael Exp $";
+#endif /* lint */
+
+int
+elf_getphdrnum(Elf *elf, size_t *resultp) {
+ if (!elf) {
+ return -1;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ if (elf->e_kind != ELF_K_ELF) {
+ seterr(ERROR_NOTELF);
+ return -1;
+ }
+ if (!elf->e_ehdr && !_elf_cook(elf)) {
+ return -1;
+ }
+ if (resultp) {
+ *resultp = elf->e_phnum;
+ }
+ return 0;
+}
+
+int
+elf_getshdrnum(Elf *elf, size_t *resultp) {
+ size_t num = 0;
+ Elf_Scn *scn;
+
+ if (!elf) {
+ return -1;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ if (elf->e_kind != ELF_K_ELF) {
+ seterr(ERROR_NOTELF);
+ return -1;
+ }
+ if (!elf->e_ehdr && !_elf_cook(elf)) {
+ return -1;
+ }
+ if ((scn = elf->e_scn_n)) {
+ num = scn->s_index + 1;
+ }
+ if (resultp) {
+ *resultp = num;
+ }
+ return 0;
+}
+
+int
+elf_getshdrstrndx(Elf *elf, size_t *resultp) {
+ size_t num = 0;
+ size_t dummy;
+ Elf_Scn *scn;
+
+ if (!elf) {
+ return -1;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ if (resultp == NULL) {
+ resultp = &dummy; /* handle NULL pointer gracefully */
+ }
+ if (elf->e_kind != ELF_K_ELF) {
+ seterr(ERROR_NOTELF);
+ return -1;
+ }
+ if (!elf->e_ehdr && !_elf_cook(elf)) {
+ return -1;
+ }
+ if (elf->e_class == ELFCLASS32) {
+ num = ((Elf32_Ehdr*)elf->e_ehdr)->e_shstrndx;
+ }
+#if __LIBELF64
+ else if (elf->e_class == ELFCLASS64) {
+ num = ((Elf64_Ehdr*)elf->e_ehdr)->e_shstrndx;
+ }
+#endif /* __LIBELF64 */
+ else {
+ if (valid_class(elf->e_class)) {
+ seterr(ERROR_UNIMPLEMENTED);
+ }
+ else {
+ seterr(ERROR_UNKNOWN_CLASS);
+ }
+ return -1;
+ }
+ if (num != SHN_XINDEX) {
+ *resultp = num;
+ return 0;
+ }
+ /*
+ * look at first section header
+ */
+ if (!(scn = elf->e_scn_1)) {
+ seterr(ERROR_NOSUCHSCN);
+ return -1;
+ }
+ elf_assert(scn->s_magic == SCN_MAGIC);
+#if __LIBELF64
+ if (elf->e_class == ELFCLASS64) {
+ *resultp = scn->s_shdr64.sh_link;
+ return 0;
+ }
+#endif /* __LIBELF64 */
+ *resultp = scn->s_shdr32.sh_link;
+ return 0;
+}
+
+int
+elf_getphnum(Elf *elf, size_t *resultp) {
+ return elf_getphdrnum(elf, resultp) ? LIBELF_FAILURE : LIBELF_SUCCESS;
+}
+
+int
+elf_getshnum(Elf *elf, size_t *resultp) {
+ return elf_getshdrnum(elf, resultp) ? LIBELF_FAILURE : LIBELF_SUCCESS;
+}
+
+int
+elf_getshstrndx(Elf *elf, size_t *resultp) {
+ return elf_getshdrstrndx(elf, resultp) ? LIBELF_FAILURE : LIBELF_SUCCESS;
+}
+
+int
+elfx_update_shstrndx(Elf *elf, size_t value) {
+ size_t extvalue = 0;
+ Elf_Scn *scn;
+
+ if (!elf) {
+ return LIBELF_FAILURE;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ if (value >= SHN_LORESERVE) {
+ extvalue = value;
+ value = SHN_XINDEX;
+ }
+ if (elf->e_kind != ELF_K_ELF) {
+ seterr(ERROR_NOTELF);
+ return LIBELF_FAILURE;
+ }
+ if (!elf->e_ehdr && !_elf_cook(elf)) {
+ return LIBELF_FAILURE;
+ }
+ if (!(scn = _elf_first_scn(elf))) {
+ return LIBELF_FAILURE;
+ }
+ elf_assert(scn->s_magic == SCN_MAGIC);
+ if (elf->e_class == ELFCLASS32) {
+ ((Elf32_Ehdr*)elf->e_ehdr)->e_shstrndx = value;
+ scn->s_shdr32.sh_link = extvalue;
+ }
+#if __LIBELF64
+ else if (elf->e_class == ELFCLASS64) {
+ ((Elf64_Ehdr*)elf->e_ehdr)->e_shstrndx = value;
+ scn->s_shdr64.sh_link = extvalue;
+ }
+#endif /* __LIBELF64 */
+ else {
+ if (valid_class(elf->e_class)) {
+ seterr(ERROR_UNIMPLEMENTED);
+ }
+ else {
+ seterr(ERROR_UNKNOWN_CLASS);
+ }
+ return LIBELF_FAILURE;
+ }
+ elf->e_ehdr_flags |= ELF_F_DIRTY;
+ scn->s_shdr_flags |= ELF_F_DIRTY;
+ return LIBELF_SUCCESS;
+}
diff --git a/lib/x.movscn.c b/lib/x.movscn.c
new file mode 100644
index 0000000..4f3d9d2
--- /dev/null
+++ b/lib/x.movscn.c
@@ -0,0 +1,112 @@
+/*
+x.movscn.c - implementation of the elfx_movscn(3) function.
+Copyright (C) 1995 - 2001, 2003 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: x.movscn.c,v 1.14 2008/05/23 08:15:35 michael Exp $";
+#endif /* lint */
+
+size_t
+elfx_movscn(Elf *elf, Elf_Scn *scn, Elf_Scn *after) {
+ Elf_Scn *prev;
+ Elf_Scn *tmp;
+ int off;
+
+ if (!elf || !scn || !after) {
+ return SHN_UNDEF;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ if (elf->e_kind != ELF_K_ELF) {
+ seterr(ERROR_NOTELF);
+ return SHN_UNDEF;
+ }
+ elf_assert(scn->s_magic == SCN_MAGIC);
+ elf_assert(after->s_magic == SCN_MAGIC);
+ if (scn->s_elf != elf || after->s_elf != elf) {
+ seterr(ERROR_ELFSCNMISMATCH);
+ return SHN_UNDEF;
+ }
+ elf_assert(elf->e_scn_1);
+ if (scn == elf->e_scn_1) {
+ seterr(ERROR_NULLSCN);
+ return SHN_UNDEF;
+ }
+ if (scn == after || scn == after->s_link) {
+ /* nothing to do */
+ return scn->s_index;
+ }
+
+ /*
+ * Find previous section.
+ */
+ prev = NULL;
+ for (tmp = elf->e_scn_1; tmp->s_link; tmp = tmp->s_link) {
+ if (tmp->s_link == scn) {
+ prev = tmp;
+ break;
+ }
+ }
+ elf_assert(prev != NULL);
+
+ /*
+ * Update section indices
+ */
+ off = 0;
+ for (tmp = elf->e_scn_1; tmp; tmp = tmp->s_link) {
+ if (off) {
+ tmp->s_index += off;
+ }
+ if (tmp == after) {
+ off++;
+ }
+ else if (tmp == scn) {
+ off--;
+ }
+ }
+ elf_assert(off == 0);
+
+ /*
+ * Move section.
+ */
+ prev->s_link = scn->s_link;
+ scn->s_link = after->s_link;
+ after->s_link = scn;
+ scn->s_index = after->s_index + 1;
+ if (elf->e_scn_n == scn) {
+ elf->e_scn_n = prev;
+ }
+ else if (elf->e_scn_n == after) {
+ elf->e_scn_n = scn;
+ }
+
+#if ENABLE_DEBUG
+ /*
+ * Check section indices
+ */
+ tmp = elf->e_scn_1;
+ elf_assert(tmp->s_index == 0);
+ while (tmp->s_link) {
+ elf_assert(tmp->s_link->s_index == tmp->s_index + 1);
+ tmp = tmp->s_link;
+ }
+#endif /* ENABLE_DEBUG */
+
+ return scn->s_index;
+}
diff --git a/lib/x.remscn.c b/lib/x.remscn.c
new file mode 100644
index 0000000..d04816e
--- /dev/null
+++ b/lib/x.remscn.c
@@ -0,0 +1,119 @@
+/*
+x.remscn.c - implementation of the elfx_remscn(3) function.
+Copyright (C) 1995 - 2001, 2003 Michael Riepe
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <private.h>
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: x.remscn.c,v 1.15 2008/05/23 08:15:35 michael Exp $";
+#endif /* lint */
+
+size_t
+elfx_remscn(Elf *elf, Elf_Scn *scn) {
+ Elf_Scn *pscn;
+ Scn_Data *sd;
+ Scn_Data *tmp;
+ size_t index;
+
+ if (!elf || !scn) {
+ return SHN_UNDEF;
+ }
+ elf_assert(elf->e_magic == ELF_MAGIC);
+ if (elf->e_kind != ELF_K_ELF) {
+ seterr(ERROR_NOTELF);
+ return SHN_UNDEF;
+ }
+ elf_assert(scn->s_magic == SCN_MAGIC);
+ elf_assert(elf->e_ehdr);
+ if (scn->s_elf != elf) {
+ seterr(ERROR_ELFSCNMISMATCH);
+ return SHN_UNDEF;
+ }
+ elf_assert(elf->e_scn_1);
+ if (scn == elf->e_scn_1) {
+ seterr(ERROR_NULLSCN);
+ return SHN_UNDEF;
+ }
+
+ /*
+ * Find previous section.
+ */
+ for (pscn = elf->e_scn_1; pscn->s_link; pscn = pscn->s_link) {
+ if (pscn->s_link == scn) {
+ break;
+ }
+ }
+ if (pscn->s_link != scn) {
+ seterr(ERROR_ELFSCNMISMATCH);
+ return SHN_UNDEF;
+ }
+
+ /*
+ * Unlink section.
+ */
+ if (elf->e_scn_n == scn) {
+ elf->e_scn_n = pscn;
+ }
+ pscn->s_link = scn->s_link;
+ index = scn->s_index;
+
+ /*
+ * Free section descriptor and data.
+ */
+ for (sd = scn->s_data_1; sd; sd = tmp) {
+ elf_assert(sd->sd_magic == DATA_MAGIC);
+ elf_assert(sd->sd_scn == scn);
+ tmp = sd->sd_link;
+ if (sd->sd_free_data && sd->sd_memdata) {
+ free(sd->sd_memdata);
+ }
+ if (sd->sd_freeme) {
+ free(sd);
+ }
+ }
+ if ((sd = scn->s_rawdata)) {
+ elf_assert(sd->sd_magic == DATA_MAGIC);
+ elf_assert(sd->sd_scn == scn);
+ if (sd->sd_free_data && sd->sd_memdata) {
+ free(sd->sd_memdata);
+ }
+ if (sd->sd_freeme) {
+ free(sd);
+ }
+ }
+ if (scn->s_freeme) {
+ elf_assert(scn->s_index > 0);
+ free(scn);
+ }
+
+ /*
+ * Adjust section indices.
+ */
+ for (scn = pscn->s_link; scn; scn = scn->s_link) {
+ elf_assert(scn->s_index > index);
+ scn->s_index--;
+ }
+
+ /*
+ * Adjust section count in ELF header
+ */
+ if (_elf_update_shnum(elf, elf->e_scn_n->s_index + 1)) {
+ return SHN_UNDEF;
+ }
+ return index;
+}
diff --git a/libelf.pc.in b/libelf.pc.in
new file mode 100644
index 0000000..9c85dfd
--- /dev/null
+++ b/libelf.pc.in
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: @PACKAGE@
+Description: ELF object file access library
+Version: @VERSION@
+Requires:
+Conflicts:
+Libs: -L${libdir} -lelf
+Cflags: -I${includedir}/libelf -I${includedir}
diff --git a/mkinstalldirs b/mkinstalldirs
new file mode 100755
index 0000000..0e29377
--- /dev/null
+++ b/mkinstalldirs
@@ -0,0 +1,35 @@
+#!/bin/sh
+# Make directory hierarchy.
+# Written by Noah Friedman <friedman@prep.ai.mit.edu>
+# Public domain.
+
+defaultIFS='
+'
+IFS="${IFS-${defaultIFS}}"
+
+errstatus=0
+
+for file in ${1+"$@"} ; do
+ oIFS="${IFS}"
+ # Some sh's can't handle IFS=/ for some reason.
+ IFS='%'
+ set - `echo ${file} | sed -e 's@/@%@g' -e 's@^%@/@'`
+ IFS="${oIFS}"
+
+ pathcomp=''
+
+ for d in ${1+"$@"} ; do
+ pathcomp="${pathcomp}${d}"
+
+ if test ! -d "${pathcomp}"; then
+ echo "mkdir $pathcomp" 1>&2
+ mkdir "${pathcomp}" || errstatus=$?
+ fi
+
+ pathcomp="${pathcomp}/"
+ done
+done
+
+exit $errstatus
+
+# eof
diff --git a/po/Makefile.in b/po/Makefile.in
new file mode 100644
index 0000000..ec4959c
--- /dev/null
+++ b/po/Makefile.in
@@ -0,0 +1,184 @@
+# po/Makefile for libelf.
+# Copyright (C) 1995 - 2006 Michael Riepe
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+# @(#) $Id: Makefile.in,v 1.18 2008/05/23 08:16:46 michael Exp $
+
+instroot =
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+localedir = @localedir@
+
+CC = @CC@
+RM = rm -f
+MV = mv -f
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+
+GENCAT = @GENCAT@
+GMSGFMT = @GMSGFMT@
+MSGFMT = @MSGFMT@
+XGETTEXT = @XGETTEXT@
+MSGMERGE = @MSGMERGE@
+
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+DEFS = -DHAVE_CONFIG_H
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+LIBINTL = @LIBINTL@
+
+# no user serviceable parts below
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+
+SHELL = /bin/sh
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+
+topdir = ..
+subdir = po
+
+.SUFFIXES:
+.SUFFIXES: .po .mo .gmo .msg .cat
+
+.po.mo:
+ @$(RM) $@
+ $(MSGFMT) -o $@ $<
+
+.po.gmo:
+ file=$(srcdir)/`echo $*|sed 's,.*/,,'`.gmo; \
+ $(RM) $$file && $(GMSGFMT) -o $$file $<
+
+.msg.cat:
+ @$(RM) $@
+ $(GENCAT) $@ $<
+
+POFILES = @POFILES@
+GMOFILES = @GMOFILES@
+MSGFILES = @MSGFILES@
+
+DISTFILES = \
+ gmo2msg.c Makefile.in $(PACKAGE).pot stamp-po \
+ $(POFILES) $(GMOFILES) $(MSGFILES)
+
+POTFILES = $(top_srcdir)/lib/errors.h
+
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+INSTOBJEXT = @INSTOBJEXT@
+
+all: $(CATALOGS)
+
+check:
+
+install: all install-data
+
+install-data: $(top_srcdir)/mkinstalldirs
+ catalogs="$(CATALOGS)"; for cat in $$catalogs; do \
+ lang=`echo $$cat | sed 's,$(CATOBJEXT)$$,,'`; \
+ dir=$(localedir)/$$lang/LC_MESSAGES; \
+ $(SHELL) $(top_srcdir)/mkinstalldirs $(instroot)$$dir; \
+ if test -r $$cat; then \
+ $(INSTALL_DATA) $$cat $(instroot)$$dir/$(PACKAGE)$(INSTOBJEXT); \
+ else \
+ $(INSTALL_DATA) $(srcdir)/$$cat $(instroot)$$dir/$(PACKAGE)$(INSTOBJEXT); \
+ fi; \
+ done
+
+uninstall:
+ catalogs="$(CATALOGS)"; for cat in $$catalogs; do \
+ lang=`echo $$cat | sed 's,$(CATOBJEXT)$$,,'`; \
+ $(RM) $(instroot)$(localedir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT); \
+ done
+
+mostlyclean:
+ $(RM) core core.* $(PACKAGE).po *.po.tmp
+
+clean: mostlyclean
+
+distclean: clean
+ $(RM) gmo2msg *.mo *.cat
+ $(RM) Makefile
+
+maintainer-clean: distclean
+ $(RM) stamp-po
+
+$(PACKAGE).pot: $(POTFILES)
+ $(XGETTEXT) -c -d$(PACKAGE) -k_ $(POTFILES)
+ if cmp -s $(PACKAGE).po $(srcdir)/$(PACKAGE).pot; then \
+ $(RM) $(PACKAGE).po; \
+ else \
+ $(RM) $(srcdir)/$(PACKAGE).pot && \
+ $(MV) $(PACKAGE).po $(srcdir)/$(PACKAGE).pot; \
+ fi
+
+update-po: stamp-po
+stamp-po: $(PACKAGE).pot
+ pofiles="$(POFILES)"; cd $(srcdir) && for po in $$pofiles; do \
+ $(RM) $$po.tmp; \
+ if $(MSGMERGE) $$po $(PACKAGE).pot > $$po.tmp; then \
+ $(RM) $$po; \
+ $(MV) $$po.tmp $$po; \
+ else \
+ echo "update for $$po failed!"; \
+ $(RM) $$po.tmp; \
+ fi; \
+ done
+ $(RM) $@ && echo timestamp > $@
+
+# Create X/Open message catalog sources from .gmo files.
+
+.gmo.msg:
+ $(MAKE) $(srcdir)/gmo2msg
+ cd $(srcdir) && ./gmo2msg `echo $*|sed 's,.*/,,'`
+
+.SUFFIXES: .c
+
+.c:
+ @$(RM) $@
+ $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) \
+ $(LDFLAGS) $*.c $(LIBS) $(LIBINTL) -o $@
+
+INCLUDES = -I$(topdir) -I. -I$(topdir)/lib -I$(srcdir) -I$(top_srcdir)/lib
+
+# maintainer only
+
+MAINT = @MAINT@
+
+distdir = $(PACKAGE)-$(VERSION)
+distsubdir = $(topdir)/$(distdir)/$(subdir)
+$(MAINT)dist: update-po $(DISTFILES)
+ if test -d $(distsubdir); then true; else mkdir $(distsubdir); fi
+ files="$(DISTFILES)"; for file in $$files; do \
+ ln $(srcdir)/$$file $(distsubdir) >/dev/null 2>&1 || \
+ cp -p $(srcdir)/$$file $(distsubdir) || exit 1; \
+ done
+
+# For the justification of the following Makefile rules, see node
+# `Automatic Remaking' in GNU Autoconf documentation.
+
+$(MAINT)Makefile: Makefile.in $(topdir)/config.status
+ cd $(topdir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./config.status
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/po/de.gmo b/po/de.gmo
new file mode 100644
index 0000000..4c96eaf
--- /dev/null
+++ b/po/de.gmo
Binary files differ
diff --git a/po/de.msg b/po/de.msg
new file mode 100644
index 0000000..93d76f2
--- /dev/null
+++ b/po/de.msg
@@ -0,0 +1 @@
+$set 1 Automatically created from de.gmo by gmo2msg
diff --git a/po/de.po b/po/de.po
new file mode 100644
index 0000000..f0e29ee
--- /dev/null
+++ b/po/de.po
@@ -0,0 +1,345 @@
+# po/de.po - German messages for libelf.
+# Copyright (C) 1999 - 2003 Michael Riepe
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+# @(#) $Id: de.po,v 1.18 2008/05/23 08:57:07 michael Exp $
+#
+msgid ""
+msgstr ""
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-05-23 10:18+0200\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Date: 2001-10-06 20:40:10+0200\n"
+"From: Michael Riepe <michael@thrai>\n"
+"Xgettext-Options: -c -dlibelf -k_\n"
+"Files: ../lib/errors.h\n"
+
+#: ../lib/errors.h:25
+msgid "no error"
+msgstr "Kein Fehler"
+
+#: ../lib/errors.h:26
+msgid "unknown error"
+msgstr "Unbekannter Fehler"
+
+#: ../lib/errors.h:27
+msgid "Internal error: unknown reason"
+msgstr "Interner Fehler: Ursache unbekannt"
+
+#: ../lib/errors.h:28
+msgid "Internal error: not implemented"
+msgstr "Interner Fehler: Diese Funktion ist nicht implementiert"
+
+#: ../lib/errors.h:29
+msgid "Request error: cntl(ELF_C_FDREAD) on write-only file"
+msgstr "Aufruffehler: cntl(ELF_C_FDREAD) ohne Leseberechtigung"
+
+#: ../lib/errors.h:30
+msgid "Request error: invalid ELF_C_* argument"
+msgstr "Aufruffehler: Das ELF_C_*-Argument ist ungültig"
+
+#: ../lib/errors.h:31
+msgid "Request error: file descriptor disabled"
+msgstr "Aufruffehler: Der Zugriff auf diese Datei ist nicht mehr möglich"
+
+#: ../lib/errors.h:32
+msgid "Request error: not an archive"
+msgstr "Aufruffehler: Die bearbeitete Datei ist kein Archiv (.a)"
+
+#: ../lib/errors.h:33
+msgid "Request error: offset out of range"
+msgstr "Aufruffehler: Die gewünschte Byteposition liegt außerhalb der Datei"
+
+#: ../lib/errors.h:34
+msgid "Request error: unknown ELF version"
+msgstr "Aufruffehler: unbekannte ELF-Version"
+
+#: ../lib/errors.h:35
+msgid "Request error: ELF_C_* argument does not match"
+msgstr "Aufruffehler: Das ELF_C_*-Argument paßt nicht zu den Zugriffsrechten"
+
+#: ../lib/errors.h:36
+msgid "Request error: archive member begin() for writing"
+msgstr "Aufruffehler: Der Archivinhalt ist nicht schreibbar"
+
+#: ../lib/errors.h:37
+msgid "Request error: archive/member file descriptor mismatch"
+msgstr "Aufruffehler: Die Datei- und Archiv-Deskriptoren passen nicht zusammen"
+
+#: ../lib/errors.h:38
+msgid "Request error: not an ELF file"
+msgstr "Aufruffehler: Dies ist keine ELF-Datei"
+
+#: ../lib/errors.h:39
+msgid "Request error: class file/memory mismatch"
+msgstr "Aufruffehler: Die Datei gehört zur falschen ELF-Klasse (32/64 Bit)"
+
+#: ../lib/errors.h:40
+msgid "Request error: invalid ELF_T_* argument"
+msgstr "Aufruffehler: Das ELF_T_*-Argument ist ungültig"
+
+#: ../lib/errors.h:41
+msgid "Request error: unknown data encoding"
+msgstr "Aufruffehler: unbekannte Datenrepräsentation (big/little endian)"
+
+#: ../lib/errors.h:42
+msgid "Request error: destination buffer too small"
+msgstr "Aufruffehler: Der Zielpuffer ist zu klein"
+
+#: ../lib/errors.h:43
+msgid "Request error: d_buf is NULL"
+msgstr "Aufruffehler: d_buf ist NULL"
+
+#: ../lib/errors.h:44
+msgid "Request error: unknown ELF class"
+msgstr "Aufruffehler: unbekannte ELF-Klasse (32/64 Bit)"
+
+#: ../lib/errors.h:45
+msgid "Request error: section does not belong to file"
+msgstr "Aufruffehler: Der Dateiabschnitt gehört nicht zu dieser Datei"
+
+#: ../lib/errors.h:46
+msgid "Request error: no section at index"
+msgstr "Aufruffehler: Ein Abschnitt mit dieser Nummer existiert nicht"
+
+#: ../lib/errors.h:47
+msgid "Request error: can't manipulate null section"
+msgstr "Aufruffehler: Sie versuchen, den \"Null\"-Abschnitt zu bearbeiten"
+
+#: ../lib/errors.h:48
+msgid "Request error: data does not belong to section"
+msgstr ""
+"Aufruffehler: Dieser Datenblock gehört nicht zum angegebenen Dateiabschnitt"
+
+#: ../lib/errors.h:49
+msgid "Request error: no string table"
+msgstr "Aufruffehler: Die Namenliste fehlt"
+
+#: ../lib/errors.h:50
+msgid "Request error: string table offset out of range"
+msgstr "Aufruffehler: Die gewünschte Position liegt außerhalb der Namenliste"
+
+#: ../lib/errors.h:51
+msgid "Request error: update(ELF_C_WRITE) on read-only file"
+msgstr "Aufruffehler: update(ELF_C_WRITE) ohne Schreibberechtigung"
+
+#: ../lib/errors.h:52
+msgid "I/O error: seek"
+msgstr "Ein-/Ausgabefehler: Das Positionieren innerhalb der Datei schlug fehl"
+
+#: ../lib/errors.h:53
+msgid "I/O error: file too big for memory"
+msgstr "Ein-/Ausgabefehler: Die Datei ist zu groß"
+
+#: ../lib/errors.h:54
+msgid "I/O error: raw read"
+msgstr "Ein-/Ausgabefehler: Lesefehler"
+
+#: ../lib/errors.h:55
+msgid "I/O error: get file size"
+msgstr "Ein-/Ausgabefehler: Die Dateigröße ist nicht zu ermitteln"
+
+#: ../lib/errors.h:56
+msgid "I/O error: output write"
+msgstr "Ein-/Ausgabefehler: Schreibfehler"
+
+#: ../lib/errors.h:57
+msgid "I/O error: can't truncate output file"
+msgstr "Ein-/Ausgabefehler: Das Verkürzen der Datei schlug fehl"
+
+#: ../lib/errors.h:58
+msgid "Sequence error: must set ELF version first"
+msgstr "Falsche Reihenfolge: Sie müssen zuerst elf_version() aufrufen"
+
+#: ../lib/errors.h:59
+msgid "Sequence error: must create ELF header first"
+msgstr "Falsche Reihenfolge: Sie müssen zuerst elf{32,64}_newehdr() aufrufen"
+
+#: ../lib/errors.h:60
+msgid "Format error: reference outside file"
+msgstr ""
+"Fehler in der Datei: Eine Positionsangabe zeigt auf einen Punkt außerhalb "
+"der Datei"
+
+#: ../lib/errors.h:61
+msgid "Format error: archive header truncated"
+msgstr "Fehler in der Datei: Der Archiv-Header ist unvollständig"
+
+#: ../lib/errors.h:62
+msgid "Format error: archive fmag"
+msgstr "Fehler in der Datei: Die Archiv-Kennung ist falsch"
+
+#: ../lib/errors.h:63
+msgid "Format error: archive header"
+msgstr "Fehler in der Datei: Der Archiv-Header ist fehlerhaft"
+
+#: ../lib/errors.h:64
+msgid "Format error: archive member truncated"
+msgstr "Fehler in der Datei: Der Archivinhalt ist unvollständig"
+
+#: ../lib/errors.h:65
+msgid "Format error: archive symbol table size"
+msgstr "Fehler in der Datei: Die Größe der Archiv-Symboltabelle ist falsch"
+
+#: ../lib/errors.h:66
+msgid "Format error: archive string table"
+msgstr "Fehler in der Datei: Die Archiv-Namenliste ist defekt"
+
+#: ../lib/errors.h:67
+msgid "Format error: archive special name unknown"
+msgstr ""
+"Fehler in der Datei: Es existiert ein internes Archiv-Objekt mit unbekanntem "
+"Namen"
+
+#: ../lib/errors.h:68
+msgid "Format error: ELF header truncated"
+msgstr "Fehler in der Datei: Der ELF-Header ist unvollständig"
+
+#: ../lib/errors.h:69
+msgid "Format error: program header table truncated"
+msgstr "Fehler in der Datei: Die ELF Program Header Table ist unvollständig"
+
+#: ../lib/errors.h:70
+msgid "Format error: section header table truncated"
+msgstr "Fehler in der Datei: Die ELF Section Header Table ist unvollständig"
+
+#: ../lib/errors.h:71
+msgid "Format error: data region truncated"
+msgstr "Fehler in der Datei: Ein Datenblock ist unvollständig"
+
+#: ../lib/errors.h:72
+msgid "Format error: program header table alignment"
+msgstr ""
+"Fehler in der Datei: Die ELF Program Header Table liegt nicht auf einer "
+"Wortgrenze"
+
+#: ../lib/errors.h:73
+msgid "Format error: section header table alignment"
+msgstr ""
+"Fehler in der Datei: Die ELF Section Header Table liegt nicht auf einer "
+"Wortgrenze"
+
+#: ../lib/errors.h:74
+msgid "Format error: bad parameter in Verdef record"
+msgstr "Fehler in der Datei: Verdef-Datensatz enthält ungültige Parameter"
+
+#: ../lib/errors.h:75
+msgid "Format error: unknown Verdef version"
+msgstr "Fehler in der Datei: libelf unterstützt die Verdef-Version nicht"
+
+#: ../lib/errors.h:76
+msgid "Format error: bad parameter in Verneed record"
+msgstr "Fehler in der Datei: Verneed-Datensatz enthält ungültige Parameter"
+
+#: ../lib/errors.h:77
+msgid "Format error: unknown Verneed version"
+msgstr "Fehler in der Datei: libelf unterstützt die Verneed-Version nicht"
+
+#: ../lib/errors.h:78
+msgid "Format error: bad e_shnum value"
+msgstr "Fehler in der Datei: e_shnum enthält einen ungültigen Wert"
+
+#: ../lib/errors.h:79
+#, fuzzy
+msgid "Format error: bad e_shentsize value"
+msgstr "Fehler in der Datei: e_shentsize enthält einen ungültigen Wert"
+
+#: ../lib/errors.h:80
+#, fuzzy
+msgid "Format error: bad e_phentsize value"
+msgstr "Fehler in der Datei: e_phentsize enthält einen ungültigen Wert"
+
+#: ../lib/errors.h:81
+msgid "Format error: unterminated string in string table"
+msgstr ""
+"Fehler in der Datei: Der Eintrag in der String-Tabelle ist nicht terminiert"
+
+#: ../lib/errors.h:82
+msgid "Layout error: section size too small for data"
+msgstr ""
+"Layout-Fehler: Ein Dateiabschnitt ist zu kurz für die darin enthaltenen Daten"
+
+#: ../lib/errors.h:83
+msgid "Layout error: overlapping sections"
+msgstr "Layout-Fehler: Zwei (oder mehr) Dateiabschnitte überlappen sich"
+
+#: ../lib/errors.h:84
+msgid "Memory error: elf descriptor"
+msgstr "Zu wenig Speicher: für den Elf-Deskriptor"
+
+#: ../lib/errors.h:85
+msgid "Memory error: archive symbol table"
+msgstr "Zu wenig Speicher: für die Archiv-Symboltabelle"
+
+#: ../lib/errors.h:86
+msgid "Memory error: archive member header"
+msgstr "Zu wenig Speicher: für die Archiv-Verwaltungsinformationen"
+
+#: ../lib/errors.h:87
+msgid "Memory error: ELF header"
+msgstr "Zu wenig Speicher: für den ELF-Header"
+
+#: ../lib/errors.h:88
+msgid "Memory error: program header table"
+msgstr "Zu wenig Speicher: für die Program Header Table"
+
+#: ../lib/errors.h:89
+msgid "Memory error: section header table"
+msgstr "Zu wenig Speicher: für die Section Header Table"
+
+#: ../lib/errors.h:90
+msgid "Memory error: section descriptor"
+msgstr "Zu wenig Speicher: für den Elf_Scn-Deskriptor"
+
+#: ../lib/errors.h:91
+msgid "Memory error: section data"
+msgstr "Zu wenig Speicher: für die Daten dieses Abschnitts"
+
+#: ../lib/errors.h:92
+msgid "Memory error: output file space"
+msgstr "Zu wenig Speicher: für die Ausgabe"
+
+#: ../lib/errors.h:93
+msgid "Memory error: temporary buffer"
+msgstr "Zu wenig Speicher: für einen temporären Puffer"
+
+#: ../lib/errors.h:94
+msgid "GElf error: value out of range"
+msgstr "GElf-Fehler: eine Zahl ist außerhalb des darstellbaren Bereichs"
+
+#: ../lib/errors.h:95
+msgid "GElf error: index out of range"
+msgstr "GElf-Fehler: Index außerhalb des erlaubten Bereichs"
+
+#: ../lib/errors.h:96
+msgid "GElf error: type mismatch"
+msgstr "GElf-Fehler: Typfehler"
+
+#: ../lib/errors.h:97
+msgid "GElf error: not enough memory for GElf_Sym"
+msgstr "GElf-Fehler: zu wenig Speicher für eine Variable vom Typ GElf_Sym"
+
+#: ../lib/errors.h:98
+msgid "GElf error: not enough memory for GElf_Dyn"
+msgstr "GElf-Fehler: zu wenig Speicher für eine Variable vom Typ GElf_Dyn"
+
+#: ../lib/errors.h:99
+msgid "GElf error: not enough memory for GElf_Rela"
+msgstr "GElf-Fehler: zu wenig Speicher für eine Variable vom Typ GElf_Rela"
+
+#: ../lib/errors.h:100
+msgid "GElf error: not enough memory for GElf_Rel"
+msgstr "GElf-Fehler: zu wenig Speicher für eine Variable vom Typ GElf_Rel"
diff --git a/po/gmo2msg.c b/po/gmo2msg.c
new file mode 100644
index 0000000..acddcca
--- /dev/null
+++ b/po/gmo2msg.c
@@ -0,0 +1,121 @@
+/*
+ * gmo2msg.c - create X/Open message source file for libelf.
+ * Copyright (C) 1996 - 2005 Michael Riepe
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef lint
+static const char rcsid[] = "@(#) $Id: gmo2msg.c,v 1.11 2008/05/23 08:16:46 michael Exp $";
+#endif /* lint */
+
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <libintl.h>
+
+#define DOMAIN "libelf"
+
+static const char *msgs[] = {
+#define __err__(a,b) b,
+#include <errors.h>
+#undef __err__
+};
+
+int
+main(int argc, char **argv) {
+ char buf[1024], *lang, *progname, *s;
+ unsigned i;
+ FILE *fp;
+
+ setlocale(LC_ALL, "");
+
+ if (*argv && (progname = strrchr(argv[0], '/'))) {
+ progname++;
+ }
+ else if (!(progname = *argv)) {
+ progname = "gmo2msg";
+ }
+
+ if (argc <= 1 || !(lang = argv[1])) {
+ fprintf(stderr, "Usage: gmo2msg <language>\n");
+ exit(1);
+ }
+
+ /*
+ * Fool gettext...
+ */
+ unlink(DOMAIN ".mo");
+ unlink("LC_MESSAGES");
+ unlink(lang);
+ sprintf(buf, "%s.gmo", lang);
+ if (link(buf, DOMAIN ".mo") == -1) {
+ fprintf(stderr, "Cannot link %s to " DOMAIN ".mo\n", buf);
+ perror("");
+ exit(1);
+ }
+ symlink(".", "LC_MESSAGES");
+ symlink(".", lang);
+ textdomain(DOMAIN);
+ getcwd(buf, sizeof(buf));
+ bindtextdomain(DOMAIN, buf);
+
+ sprintf(buf, "%s.msg", lang);
+ unlink(buf);
+ if (!(fp = fopen(buf, "w"))) {
+ perror(buf);
+ exit(1);
+ }
+
+ fprintf(fp, "$set 1 Automatically created from %s.gmo by %s\n", lang, progname);
+
+ /*
+ * Translate messages.
+ */
+ setlocale(LC_MESSAGES, lang);
+ if ((s = gettext("")) && (s = strdup(s))) {
+ s = strtok(s, "\n");
+ while (s) {
+ fprintf(fp, "$ %s\n", s);
+ s = strtok(NULL, "\n");
+ }
+ }
+ /*
+ * Assume that messages contain printable ASCII characters ONLY.
+ * That means no tabs, linefeeds etc.
+ */
+ for (i = 0; i < sizeof(msgs)/sizeof(*msgs); i++) {
+ s = gettext(msgs[i]);
+ if (s != msgs[i] && strcmp(s, msgs[i]) != 0) {
+ fprintf(fp, "$ \n$ Original message: %s\n", msgs[i]);
+ fprintf(fp, "%u %s\n", i + 1, s);
+ }
+ }
+ setlocale(LC_MESSAGES, "");
+
+ if (fclose(fp)) {
+ perror("writing output file");
+ exit(1);
+ }
+
+ /*
+ * Cleanup.
+ */
+ unlink(DOMAIN ".mo");
+ unlink("LC_MESSAGES");
+ unlink(lang);
+ exit(0);
+}
diff --git a/po/libelf.pot b/po/libelf.pot
new file mode 100644
index 0000000..060c056
--- /dev/null
+++ b/po/libelf.pot
@@ -0,0 +1,321 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-05-23 10:18+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../lib/errors.h:25
+msgid "no error"
+msgstr ""
+
+#: ../lib/errors.h:26
+msgid "unknown error"
+msgstr ""
+
+#: ../lib/errors.h:27
+msgid "Internal error: unknown reason"
+msgstr ""
+
+#: ../lib/errors.h:28
+msgid "Internal error: not implemented"
+msgstr ""
+
+#: ../lib/errors.h:29
+msgid "Request error: cntl(ELF_C_FDREAD) on write-only file"
+msgstr ""
+
+#: ../lib/errors.h:30
+msgid "Request error: invalid ELF_C_* argument"
+msgstr ""
+
+#: ../lib/errors.h:31
+msgid "Request error: file descriptor disabled"
+msgstr ""
+
+#: ../lib/errors.h:32
+msgid "Request error: not an archive"
+msgstr ""
+
+#: ../lib/errors.h:33
+msgid "Request error: offset out of range"
+msgstr ""
+
+#: ../lib/errors.h:34
+msgid "Request error: unknown ELF version"
+msgstr ""
+
+#: ../lib/errors.h:35
+msgid "Request error: ELF_C_* argument does not match"
+msgstr ""
+
+#: ../lib/errors.h:36
+msgid "Request error: archive member begin() for writing"
+msgstr ""
+
+#: ../lib/errors.h:37
+msgid "Request error: archive/member file descriptor mismatch"
+msgstr ""
+
+#: ../lib/errors.h:38
+msgid "Request error: not an ELF file"
+msgstr ""
+
+#: ../lib/errors.h:39
+msgid "Request error: class file/memory mismatch"
+msgstr ""
+
+#: ../lib/errors.h:40
+msgid "Request error: invalid ELF_T_* argument"
+msgstr ""
+
+#: ../lib/errors.h:41
+msgid "Request error: unknown data encoding"
+msgstr ""
+
+#: ../lib/errors.h:42
+msgid "Request error: destination buffer too small"
+msgstr ""
+
+#: ../lib/errors.h:43
+msgid "Request error: d_buf is NULL"
+msgstr ""
+
+#: ../lib/errors.h:44
+msgid "Request error: unknown ELF class"
+msgstr ""
+
+#: ../lib/errors.h:45
+msgid "Request error: section does not belong to file"
+msgstr ""
+
+#: ../lib/errors.h:46
+msgid "Request error: no section at index"
+msgstr ""
+
+#: ../lib/errors.h:47
+msgid "Request error: can't manipulate null section"
+msgstr ""
+
+#: ../lib/errors.h:48
+msgid "Request error: data does not belong to section"
+msgstr ""
+
+#: ../lib/errors.h:49
+msgid "Request error: no string table"
+msgstr ""
+
+#: ../lib/errors.h:50
+msgid "Request error: string table offset out of range"
+msgstr ""
+
+#: ../lib/errors.h:51
+msgid "Request error: update(ELF_C_WRITE) on read-only file"
+msgstr ""
+
+#: ../lib/errors.h:52
+msgid "I/O error: seek"
+msgstr ""
+
+#: ../lib/errors.h:53
+msgid "I/O error: file too big for memory"
+msgstr ""
+
+#: ../lib/errors.h:54
+msgid "I/O error: raw read"
+msgstr ""
+
+#: ../lib/errors.h:55
+msgid "I/O error: get file size"
+msgstr ""
+
+#: ../lib/errors.h:56
+msgid "I/O error: output write"
+msgstr ""
+
+#: ../lib/errors.h:57
+msgid "I/O error: can't truncate output file"
+msgstr ""
+
+#: ../lib/errors.h:58
+msgid "Sequence error: must set ELF version first"
+msgstr ""
+
+#: ../lib/errors.h:59
+msgid "Sequence error: must create ELF header first"
+msgstr ""
+
+#: ../lib/errors.h:60
+msgid "Format error: reference outside file"
+msgstr ""
+
+#: ../lib/errors.h:61
+msgid "Format error: archive header truncated"
+msgstr ""
+
+#: ../lib/errors.h:62
+msgid "Format error: archive fmag"
+msgstr ""
+
+#: ../lib/errors.h:63
+msgid "Format error: archive header"
+msgstr ""
+
+#: ../lib/errors.h:64
+msgid "Format error: archive member truncated"
+msgstr ""
+
+#: ../lib/errors.h:65
+msgid "Format error: archive symbol table size"
+msgstr ""
+
+#: ../lib/errors.h:66
+msgid "Format error: archive string table"
+msgstr ""
+
+#: ../lib/errors.h:67
+msgid "Format error: archive special name unknown"
+msgstr ""
+
+#: ../lib/errors.h:68
+msgid "Format error: ELF header truncated"
+msgstr ""
+
+#: ../lib/errors.h:69
+msgid "Format error: program header table truncated"
+msgstr ""
+
+#: ../lib/errors.h:70
+msgid "Format error: section header table truncated"
+msgstr ""
+
+#: ../lib/errors.h:71
+msgid "Format error: data region truncated"
+msgstr ""
+
+#: ../lib/errors.h:72
+msgid "Format error: program header table alignment"
+msgstr ""
+
+#: ../lib/errors.h:73
+msgid "Format error: section header table alignment"
+msgstr ""
+
+#: ../lib/errors.h:74
+msgid "Format error: bad parameter in Verdef record"
+msgstr ""
+
+#: ../lib/errors.h:75
+msgid "Format error: unknown Verdef version"
+msgstr ""
+
+#: ../lib/errors.h:76
+msgid "Format error: bad parameter in Verneed record"
+msgstr ""
+
+#: ../lib/errors.h:77
+msgid "Format error: unknown Verneed version"
+msgstr ""
+
+#: ../lib/errors.h:78
+msgid "Format error: bad e_shnum value"
+msgstr ""
+
+#: ../lib/errors.h:79
+msgid "Format error: bad e_shentsize value"
+msgstr ""
+
+#: ../lib/errors.h:80
+msgid "Format error: bad e_phentsize value"
+msgstr ""
+
+#: ../lib/errors.h:81
+msgid "Format error: unterminated string in string table"
+msgstr ""
+
+#: ../lib/errors.h:82
+msgid "Layout error: section size too small for data"
+msgstr ""
+
+#: ../lib/errors.h:83
+msgid "Layout error: overlapping sections"
+msgstr ""
+
+#: ../lib/errors.h:84
+msgid "Memory error: elf descriptor"
+msgstr ""
+
+#: ../lib/errors.h:85
+msgid "Memory error: archive symbol table"
+msgstr ""
+
+#: ../lib/errors.h:86
+msgid "Memory error: archive member header"
+msgstr ""
+
+#: ../lib/errors.h:87
+msgid "Memory error: ELF header"
+msgstr ""
+
+#: ../lib/errors.h:88
+msgid "Memory error: program header table"
+msgstr ""
+
+#: ../lib/errors.h:89
+msgid "Memory error: section header table"
+msgstr ""
+
+#: ../lib/errors.h:90
+msgid "Memory error: section descriptor"
+msgstr ""
+
+#: ../lib/errors.h:91
+msgid "Memory error: section data"
+msgstr ""
+
+#: ../lib/errors.h:92
+msgid "Memory error: output file space"
+msgstr ""
+
+#: ../lib/errors.h:93
+msgid "Memory error: temporary buffer"
+msgstr ""
+
+#: ../lib/errors.h:94
+msgid "GElf error: value out of range"
+msgstr ""
+
+#: ../lib/errors.h:95
+msgid "GElf error: index out of range"
+msgstr ""
+
+#: ../lib/errors.h:96
+msgid "GElf error: type mismatch"
+msgstr ""
+
+#: ../lib/errors.h:97
+msgid "GElf error: not enough memory for GElf_Sym"
+msgstr ""
+
+#: ../lib/errors.h:98
+msgid "GElf error: not enough memory for GElf_Dyn"
+msgstr ""
+
+#: ../lib/errors.h:99
+msgid "GElf error: not enough memory for GElf_Rela"
+msgstr ""
+
+#: ../lib/errors.h:100
+msgid "GElf error: not enough memory for GElf_Rel"
+msgstr ""
diff --git a/po/stamp-po b/po/stamp-po
new file mode 100644
index 0000000..9788f70
--- /dev/null
+++ b/po/stamp-po
@@ -0,0 +1 @@
+timestamp
diff --git a/stamp-h.in b/stamp-h.in
new file mode 100644
index 0000000..9788f70
--- /dev/null
+++ b/stamp-h.in
@@ -0,0 +1 @@
+timestamp