]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - lib/libelf/_libelf.h
This commit was generated by cvs2svn to compensate for changes in r165071,
[FreeBSD/FreeBSD.git] / lib / libelf / _libelf.h
1 /*-
2  * Copyright (c) 2006 Joseph Koshy
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  * $FreeBSD$
27  */
28
29 #ifndef __LIBELF_H_
30 #define __LIBELF_H_
31
32 #include <sys/queue.h>
33
34 #ifndef NULL
35 #define NULL    ((void *) 0)
36 #endif
37
38 /*
39  * Library-private data structures.
40  */
41
42 #define LIBELF_MSG_SIZE 256
43
44 struct _libelf_globals {
45         int             libelf_arch;
46         unsigned int    libelf_byteorder;
47         int             libelf_class;
48         int             libelf_error;
49         int             libelf_fillchar;
50         unsigned int    libelf_version;
51         char            libelf_msg[LIBELF_MSG_SIZE];
52 };
53
54 extern struct _libelf_globals _libelf;
55
56 #define LIBELF_PRIVATE(N)       (_libelf.libelf_##N)
57
58 #define LIBELF_ELF_ERROR_MASK   0xFF
59 #define LIBELF_OS_ERROR_SHIFT   8
60
61 #define LIBELF_SET_ERROR(E, O) do {                                     \
62         LIBELF_PRIVATE(error) = ((ELF_E_##E & LIBELF_ELF_ERROR_MASK)|   \
63             ((O) << LIBELF_OS_ERROR_SHIFT));                            \
64         } while (0)
65
66 #define LIBELF_ADJUST_AR_SIZE(S)        (((S) + 1U) & ~1U)
67
68 /*
69  * Flags for library internal use.  These use the upper 16 bits of a
70  * flags field.
71  */
72 #define LIBELF_F_MALLOCED       0x010000 /* whether data was malloc'ed */
73 #define LIBELF_F_MMAP           0x020000 /* whether e_rawfile was mmap'ed */
74
75 struct _Elf {
76         int             e_activations;  /* activation count */
77         Elf_Arhdr       *e_arhdr;       /* header for archive members */
78         unsigned int    e_byteorder;    /* ELFDATA* */
79         int             e_class;        /* ELFCLASS*  */
80         Elf_Cmd         e_cmd;          /* ELF_C_* used at creation time */
81         int             e_fd;           /* associated file descriptor */
82         unsigned int    e_flags;        /* ELF_F_*, LIBELF_F_* flags */
83         Elf_Kind        e_kind;         /* ELF_K_* */
84         Elf             *e_parent;      /* non-NULL for archive members */
85         char            *e_rawfile;     /* uninterpreted bytes */
86         size_t          e_rawsize;      /* size of uninterpreted bytes */
87         unsigned int    e_version;      /* file version */
88
89         union {
90                 struct {                /* ar(1) archives */
91                         off_t   e_next; /* set by elf_rand()/elf_next() */
92                         int     e_nchildren;
93                         char    *e_rawstrtab;   /* file name strings */
94                         size_t  e_rawstrtabsz;
95                         char    *e_rawsymtab;   /* symbol table */
96                         size_t  e_rawsymtabsz;
97                         Elf_Arsym *e_symtab;
98                         size_t  e_symtabsz;
99                 } e_ar;
100                 struct {                /* regular ELF files */
101                         union {
102                                 Elf32_Ehdr *e_ehdr32;
103                                 Elf64_Ehdr *e_ehdr64;
104                         } e_ehdr;
105                         union {
106                                 Elf32_Phdr *e_phdr32;
107                                 Elf64_Phdr *e_phdr64;
108                         } e_phdr;
109                         STAILQ_HEAD(, _Elf_Scn) e_scn;  /* section list */
110                 } e_elf;
111         } e_u;
112 };
113
114 struct _Elf_Scn {
115         union {
116                 Elf32_Shdr      s_shdr32;
117                 Elf64_Shdr      s_shdr64;
118         } s_shdr;
119         STAILQ_HEAD(, _Elf_Data) s_data;        /* list of Elf_Data descriptors */
120         STAILQ_HEAD(, _Elf_Data) s_rawdata;     /* raw data for this section */
121         STAILQ_ENTRY(_Elf_Scn) s_next;
122         struct _Elf     *s_elf;         /* parent ELF descriptor */
123         unsigned int    s_flags;        /* flags for the section as a whole */
124         size_t          s_ndx;          /* index# for this section */
125         uint64_t        s_offset;       /* managed by elf_update() */
126         uint64_t        s_rawoff;       /* original offset in the file */
127         uint64_t        s_size;         /* managed by elf_update() */
128 };
129
130
131 enum {
132         ELF_TOFILE,
133         ELF_TOMEMORY
134 };
135
136 #define LIBELF_COPY_U32(DST,SRC,NAME)   do {            \
137                 if ((SRC)->NAME > UINT_MAX) {           \
138                         LIBELF_SET_ERROR(RANGE, 0);     \
139                         return (0);                     \
140                 }                                       \
141                 (DST)->NAME = (SRC)->NAME;              \
142         } while (0)
143
144 #define LIBELF_COPY_S32(DST,SRC,NAME)   do {            \
145                 if ((SRC)->NAME > INT_MAX ||            \
146                     (SRC)->NAME < INT_MIN) {            \
147                         LIBELF_SET_ERROR(RANGE, 0);     \
148                         return (0);                     \
149                 }                                       \
150                 (DST)->NAME = (SRC)->NAME;              \
151         } while (0)
152
153
154 /*
155  * Prototypes
156  */
157
158 Elf_Data *_libelf_allocate_data(Elf_Scn *_s);
159 Elf     *_libelf_allocate_elf(void);
160 Elf_Scn *_libelf_allocate_scn(Elf *_e, size_t _ndx);
161 Elf_Arhdr *_libelf_ar_gethdr(Elf *_e);
162 Elf     *_libelf_ar_open(Elf *_e);
163 Elf     *_libelf_ar_open_member(int _fd, Elf_Cmd _c, Elf *_ar);
164 Elf_Arsym *_libelf_ar_process_symtab(Elf *_ar, size_t *_dst);
165 unsigned long _libelf_checksum(Elf *_e, int _elfclass);
166 void    *_libelf_ehdr(Elf *_e, int _elfclass, int _allocate);
167 int     _libelf_falign(Elf_Type _t, int _elfclass);
168 size_t  _libelf_fsize(Elf_Type _t, int _elfclass, unsigned int _version,
169     size_t count);
170 void    (*_libelf_get_translator(Elf_Type _t, int _direction, int _elfclass))
171             (char *_dst, char *_src, size_t _cnt, int _byteswap);
172 void    *_libelf_getphdr(Elf *_e, int _elfclass);
173 void    *_libelf_getshdr(Elf_Scn *_scn, int _elfclass);
174 int     _libelf_getshnum(Elf *_e, void *_eh, int _elfclass, size_t *_shnum);
175 int     _libelf_getshstrndx(Elf *_e, void *_eh, int _elfclass,
176     size_t *_shstrndx);
177 void    _libelf_init_elf(Elf *_e, Elf_Kind _kind);
178 int     _libelf_malign(Elf_Type _t, int _elfclass);
179 size_t  _libelf_msize(Elf_Type _t, int _elfclass, unsigned int _version);
180 void    *_libelf_newphdr(Elf *_e, int _elfclass, size_t _count);
181 Elf_Data *_libelf_release_data(Elf_Data *_d);
182 Elf     *_libelf_release_elf(Elf *_e);
183 Elf_Scn *_libelf_release_scn(Elf_Scn *_s);
184 int     _libelf_setshnum(Elf *_e, void *_eh, int _elfclass, size_t _shnum);
185 int     _libelf_setshstrndx(Elf *_e, void *_eh, int _elfclass,
186     size_t _shstrndx);
187 Elf_Data *_libelf_xlate(Elf_Data *_d, const Elf_Data *_s,
188     unsigned int _encoding, int _elfclass, int _direction);
189 int     _libelf_xlate_shtype(uint32_t _sht);
190
191 #endif  /* __LIBELF_H_ */