]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - lib/libelf/_libelf.h
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.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 #define LIBELF_F_SHDRS_LOADED   0x040000 /* whether all shdrs were read in */
75
76 struct _Elf {
77         int             e_activations;  /* activation count */
78         Elf_Arhdr       *e_arhdr;       /* header for archive members */
79         unsigned int    e_byteorder;    /* ELFDATA* */
80         int             e_class;        /* ELFCLASS*  */
81         Elf_Cmd         e_cmd;          /* ELF_C_* used at creation time */
82         int             e_fd;           /* associated file descriptor */
83         unsigned int    e_flags;        /* ELF_F_*, LIBELF_F_* flags */
84         Elf_Kind        e_kind;         /* ELF_K_* */
85         Elf             *e_parent;      /* non-NULL for archive members */
86         char            *e_rawfile;     /* uninterpreted bytes */
87         size_t          e_rawsize;      /* size of uninterpreted bytes */
88         unsigned int    e_version;      /* file version */
89
90         union {
91                 struct {                /* ar(1) archives */
92                         off_t   e_next; /* set by elf_rand()/elf_next() */
93                         int     e_nchildren;
94                         char    *e_rawstrtab;   /* file name strings */
95                         size_t  e_rawstrtabsz;
96                         char    *e_rawsymtab;   /* symbol table */
97                         size_t  e_rawsymtabsz;
98                         Elf_Arsym *e_symtab;
99                         size_t  e_symtabsz;
100                 } e_ar;
101                 struct {                /* regular ELF files */
102                         union {
103                                 Elf32_Ehdr *e_ehdr32;
104                                 Elf64_Ehdr *e_ehdr64;
105                         } e_ehdr;
106                         union {
107                                 Elf32_Phdr *e_phdr32;
108                                 Elf64_Phdr *e_phdr64;
109                         } e_phdr;
110                         STAILQ_HEAD(, _Elf_Scn) e_scn;  /* section list */
111                         size_t  e_nphdr;        /* number of Phdr entries */
112                         size_t  e_nscn;         /* number of sections */
113                         size_t  e_strndx;       /* string table section index */
114                 } e_elf;
115         } e_u;
116 };
117
118 struct _Elf_Scn {
119         union {
120                 Elf32_Shdr      s_shdr32;
121                 Elf64_Shdr      s_shdr64;
122         } s_shdr;
123         STAILQ_HEAD(, _Elf_Data) s_data;        /* list of Elf_Data descriptors */
124         STAILQ_HEAD(, _Elf_Data) s_rawdata;     /* raw data for this section */
125         STAILQ_ENTRY(_Elf_Scn) s_next;
126         struct _Elf     *s_elf;         /* parent ELF descriptor */
127         unsigned int    s_flags;        /* flags for the section as a whole */
128         size_t          s_ndx;          /* index# for this section */
129         uint64_t        s_offset;       /* managed by elf_update() */
130         uint64_t        s_rawoff;       /* original offset in the file */
131         uint64_t        s_size;         /* managed by elf_update() */
132 };
133
134
135 enum {
136         ELF_TOFILE,
137         ELF_TOMEMORY
138 };
139
140 #define LIBELF_COPY_U32(DST,SRC,NAME)   do {            \
141                 if ((SRC)->NAME > UINT_MAX) {           \
142                         LIBELF_SET_ERROR(RANGE, 0);     \
143                         return (0);                     \
144                 }                                       \
145                 (DST)->NAME = (SRC)->NAME;              \
146         } while (0)
147
148 #define LIBELF_COPY_S32(DST,SRC,NAME)   do {            \
149                 if ((SRC)->NAME > INT_MAX ||            \
150                     (SRC)->NAME < INT_MIN) {            \
151                         LIBELF_SET_ERROR(RANGE, 0);     \
152                         return (0);                     \
153                 }                                       \
154                 (DST)->NAME = (SRC)->NAME;              \
155         } while (0)
156
157
158 /*
159  * Prototypes
160  */
161
162 Elf_Data *_libelf_allocate_data(Elf_Scn *_s);
163 Elf     *_libelf_allocate_elf(void);
164 Elf_Scn *_libelf_allocate_scn(Elf *_e, size_t _ndx);
165 Elf_Arhdr *_libelf_ar_gethdr(Elf *_e);
166 Elf     *_libelf_ar_open(Elf *_e);
167 Elf     *_libelf_ar_open_member(int _fd, Elf_Cmd _c, Elf *_ar);
168 int     _libelf_ar_get_member(char *_s, size_t _sz, int _base, size_t *_ret);
169 char    *_libelf_ar_get_string(const char *_buf, size_t _sz, int _rawname);
170 char    *_libelf_ar_get_name(char *_buf, size_t _sz, Elf *_e);
171 int     _libelf_ar_get_number(char *_buf, size_t _sz, int _base, size_t *_ret);
172 Elf_Arsym *_libelf_ar_process_symtab(Elf *_ar, size_t *_dst);
173 unsigned long _libelf_checksum(Elf *_e, int _elfclass);
174 void    *_libelf_ehdr(Elf *_e, int _elfclass, int _allocate);
175 int     _libelf_falign(Elf_Type _t, int _elfclass);
176 size_t  _libelf_fsize(Elf_Type _t, int _elfclass, unsigned int _version,
177     size_t count);
178 int     (*_libelf_get_translator(Elf_Type _t, int _direction, int _elfclass))
179             (char *_dst, size_t dsz, char *_src, size_t _cnt, int _byteswap);
180 void    *_libelf_getphdr(Elf *_e, int _elfclass);
181 void    *_libelf_getshdr(Elf_Scn *_scn, int _elfclass);
182 void    _libelf_init_elf(Elf *_e, Elf_Kind _kind);
183 int     _libelf_load_scn(Elf *e, void *ehdr);
184 int     _libelf_malign(Elf_Type _t, int _elfclass);
185 size_t  _libelf_msize(Elf_Type _t, int _elfclass, unsigned int _version);
186 void    *_libelf_newphdr(Elf *_e, int _elfclass, size_t _count);
187 Elf_Data *_libelf_release_data(Elf_Data *_d);
188 Elf     *_libelf_release_elf(Elf *_e);
189 Elf_Scn *_libelf_release_scn(Elf_Scn *_s);
190 int     _libelf_setphnum(Elf *_e, void *_eh, int _elfclass, size_t _phnum);
191 int     _libelf_setshnum(Elf *_e, void *_eh, int _elfclass, size_t _shnum);
192 int     _libelf_setshstrndx(Elf *_e, void *_eh, int _elfclass,
193     size_t _shstrndx);
194 Elf_Data *_libelf_xlate(Elf_Data *_d, const Elf_Data *_s,
195     unsigned int _encoding, int _elfclass, int _direction);
196 int     _libelf_xlate_shtype(uint32_t _sht);
197
198 #endif  /* __LIBELF_H_ */