summaryrefslogtreecommitdiff
path: root/src/arlib.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/arlib.h')
-rw-r--r--src/arlib.h96
1 files changed, 96 insertions, 0 deletions
diff --git a/src/arlib.h b/src/arlib.h
new file mode 100644
index 0000000..fd26d24
--- /dev/null
+++ b/src/arlib.h
@@ -0,0 +1,96 @@
+/* Copyright (C) 2007 Red Hat, Inc.
+ Written by Ulrich Drepper <drepper@redhat.com>, 2007.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat elfutils 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifndef _ARLIB_H
+#define _ARLIB_H 1
+
+#include <ar.h>
+#include <byteswap.h>
+#include <endian.h>
+#include <libelf.h>
+#include <obstack.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <sys/types.h>
+
+
+/* Maximum length of a file name that fits directly into the ar header.
+ We cannot use the final byte since a / goes there. */
+#define MAX_AR_NAME_LEN (sizeof (((struct ar_hdr *) NULL)->ar_name) - 1)
+
+
+/* Words matching in size to archive header. */
+#define AR_HDR_WORDS (sizeof (struct ar_hdr) / sizeof (uint32_t))
+
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+# define le_bswap_32(val) bswap_32 (val)
+#else
+# define le_bswap_32(val) (val)
+#endif
+
+
+/* Symbol table type. */
+struct arlib_symtab
+{
+ /* Symbol table handling. */
+ struct obstack symsoffob;
+ struct obstack symsnameob;
+ size_t symsofflen;
+ uint32_t *symsoff;
+ size_t symsnamelen;
+ char *symsname;
+
+ /* Long filename handling. */
+ struct obstack longnamesob;
+ size_t longnameslen;
+ char *longnames;
+};
+
+
+/* Global variable with symbol table. */
+extern struct arlib_symtab symtab;
+
+
+/* Initialize ARLIB_SYMTAB structure. */
+extern void arlib_init (void);
+
+/* Finalize ARLIB_SYMTAB content. */
+extern void arlib_finalize (void);
+
+/* Free resources for ARLIB_SYMTAB. */
+extern void arlib_fini (void);
+
+/* Add symbols from ELF with value OFFSET to the symbol table SYMTAB. */
+extern void arlib_add_symbols (Elf *elf, const char *arfname,
+ const char *membername, off_t off);
+
+/* Add name a file offset of a symbol. */
+extern void arlib_add_symref (const char *symname, off_t symoff);
+
+/* Add long file name FILENAME of length FILENAMELEN to the symbol table
+ SYMTAB. Return the offset into the long file name table. */
+extern long int arlib_add_long_name (const char *filename, size_t filenamelen);
+
+#endif /* arlib.h */