xref: /third_party/elfutils/libasm/libasmP.h (revision da0c48c4)
1/* Internal definitions for libasm.
2   Copyright (C) 2002, 2004, 2005, 2016 Red Hat, Inc.
3   This file is part of elfutils.
4
5   This file is free software; you can redistribute it and/or modify
6   it under the terms of either
7
8     * the GNU Lesser General Public License as published by the Free
9       Software Foundation; either version 3 of the License, or (at
10       your option) any later version
11
12   or
13
14     * the GNU General Public License as published by the Free
15       Software Foundation; either version 2 of the License, or (at
16       your option) any later version
17
18   or both in parallel, as here.
19
20   elfutils is distributed in the hope that it will be useful, but
21   WITHOUT ANY WARRANTY; without even the implied warranty of
22   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
23   General Public License for more details.
24
25   You should have received copies of the GNU General Public License and
26   the GNU Lesser General Public License along with this program.  If
27   not, see <http://www.gnu.org/licenses/>.  */
28
29#ifndef _LIBASMP_H
30#define _LIBASMP_H 1
31
32#include <stdio.h>
33
34#include <libasm.h>
35
36#include <system.h>
37
38#include "libebl.h"
39
40#include "libdwelf.h"
41
42
43/* Known error codes.  */
44enum
45  {
46    ASM_E_NOERROR,
47    ASM_E_NOMEM,		/* No more memory.  */
48    ASM_E_CANNOT_CREATE,	/* Output file cannot be created.  */
49    ASM_E_INVALID,		/* Invalid parameters.  */
50    ASM_E_CANNOT_CHMOD,		/* Cannot change mode of output file.  */
51    ASM_E_CANNOT_RENAME,	/* Cannot rename output file.  */
52    ASM_E_DUPLSYM,		/* Duplicate symbol definition.  */
53    ASM_E_LIBELF,		/* Refer to error in libelf.  */
54    ASM_E_TYPE,			/* Invalid section type for operation.  */
55    ASM_E_IOERROR,		/* Error during output of data.  */
56    ASM_E_ENOSUP,		/* No backend support.  */
57    ASM_E_NUM			/* Keep this entry as the last.  */
58  };
59
60
61/* Special sections.  */
62#define ASM_ABS_SCN ((Elf_Scn *) 1)
63#define ASM_COM_SCN ((Elf_Scn *) 2)
64
65
66/* And the hash table for symbols.  */
67#include <symbolhash.h>
68
69
70/* Descriptor for a section.  */
71struct AsmScn
72{
73  /* The underlying assembler context.  */
74  AsmCtx_t *ctx;
75
76  /* Subsection ID.  */
77  unsigned int subsection_id;
78
79  /* Section type.  */
80  GElf_Word type;
81
82  union
83  {
84    /* Data only stored in the record for subsection zero.  */
85    struct
86    {
87      /* The ELF section.  */
88      Elf_Scn *scn;
89
90      /* Entry in the section header string table.  */
91      Dwelf_Strent *strent;
92
93      /* Next member of group.  */
94      struct AsmScn *next_in_group;
95    } main;
96
97    /* Pointer to the record for subsection zero.  */
98    AsmScn_t *up;
99  } data;
100
101  /* Current offset in the (sub)section.  */
102  GElf_Off offset;
103  /* Maximum alignment of the section so far.  */
104  GElf_Word max_align;
105
106  /* Section content.  */
107  struct AsmData
108  {
109    /* Currently used number of bytes in the block.  */
110    size_t len;
111
112    /* Number of bytes allocated.  */
113    size_t maxlen;
114
115    /* Pointer to the next block.  */
116    struct AsmData *next;
117
118    /* The actual data.  */
119    char data[flexarr_size];
120  } *content;
121
122  /* Fill pattern.  */
123  struct FillPattern
124  {
125    size_t len;
126    char bytes[flexarr_size];
127  } *pattern;
128
129  /* Next subsection.  */
130  AsmScn_t *subnext;
131
132  /* List of all allocated sections.  */
133  AsmScn_t *allnext;
134
135  /* Name of the section.  */
136  char name[flexarr_size];
137};
138
139
140/* Descriptor used for the assembling session.  */
141struct AsmCtx
142{
143  /* File descriptor of the temporary file.  */
144  int fd;
145
146  /* True if text output is wanted.  */
147  bool textp;
148
149  /* Output file handle.  */
150  union
151  {
152    /* ELF descriptor of the temporary file.  */
153    Elf *elf;
154    /* I/O stream for text output.  */
155    FILE *file;
156  } out;
157
158
159  /* List with defined sections.  */
160  AsmScn_t *section_list;
161  /* Section header string table.  */
162  Dwelf_Strtab *section_strtab;
163
164  /* Table with defined symbols.  */
165  asm_symbol_tab symbol_tab;
166  /* Number of symbols in the table.  */
167  unsigned int nsymbol_tab;
168  /* Symbol string table.  */
169  Dwelf_Strtab *symbol_strtab;
170
171  /* List of section groups.  */
172  struct AsmScnGrp *groups;
173  /* Number of section groups.  */
174  size_t ngroups;
175
176  /* Current required alignment for common symbols.  */
177  GElf_Word common_align;
178
179  /* Lock to handle multithreaded programs.  */
180  rwlock_define (,lock);
181
182  /* Counter for temporary symbols.  */
183  unsigned int tempsym_count;
184
185  /* Name of the output file.  */
186  char *fname;
187  /* The name of the temporary file.  */
188  char tmp_fname[flexarr_size];
189};
190
191
192/* Descriptor for a symbol.  */
193struct AsmSym
194{
195  /* Reference to the section which contains the symbol.  */
196  AsmScn_t *scn;
197
198  /* Type of the symbol.  */
199  int8_t type;
200  /* Binding of the symbol.  */
201  int8_t binding;
202
203  /* Size of the symbol.  */
204  GElf_Xword size;
205
206  /* Offset in the section.  */
207  GElf_Off offset;
208
209  /* Symbol table index of the symbol in the symbol table.  */
210  size_t symidx;
211
212  /* Reference to name of the symbol.  */
213  Dwelf_Strent *strent;
214};
215
216
217/* Descriptor for section group.  */
218struct AsmScnGrp
219{
220  /* Entry in the section header string table.  */
221  Dwelf_Strent *strent;
222
223  /* The ELF section.  */
224  Elf_Scn *scn;
225
226  /* The signature.  */
227  struct AsmSym *signature;
228
229  /* First member.  */
230  struct AsmScn *members;
231  /* Number of members.  */
232  size_t nmembers;
233
234  /* Flags.  */
235  Elf32_Word flags;
236
237  /* Next group.  */
238  struct AsmScnGrp *next;
239
240  /* Name of the section group.  */
241  char name[flexarr_size];
242};
243
244
245/* Descriptor for disassembler.   */
246struct DisasmCtx
247{
248  /* Handle for the backend library with the disassembler routine.  */
249  Ebl *ebl;
250
251  /* ELF file containing all the data passed to the function.  This
252     allows to look up symbols.  */
253  Elf *elf;
254
255  /* Callback function to determine symbol names.  */
256  DisasmGetSymCB_t symcb;
257};
258
259
260/* The default fill pattern: one zero byte.  */
261extern const struct FillPattern *__libasm_default_pattern
262     attribute_hidden;
263
264
265/* Ensure there are at least LEN bytes available in the output buffer
266   for ASMSCN.  */
267extern int __libasm_ensure_section_space (AsmScn_t *asmscn, size_t len)
268     internal_function;
269
270/* Free all resources associated with the assembler context.  */
271extern void __libasm_finictx (AsmCtx_t *ctx) internal_function;
272
273/* Set error code.  */
274extern void __libasm_seterrno (int err) internal_function;
275
276/* Return handle for the named section.  If it was not used before
277   create it.  */
278extern AsmScn_t *__asm_newscn_internal (AsmCtx_t *ctx, const char *scnname,
279					GElf_Word type, GElf_Xword flags)
280     attribute_hidden;
281
282
283/* Internal aliases of the asm_addintXX functions.  */
284extern int __asm_addint8_internal (AsmScn_t *asmscn, int8_t num)
285     attribute_hidden;
286extern int __asm_addint16_internal (AsmScn_t *asmscn, int16_t num)
287     attribute_hidden;
288extern int __asm_addint32_internal (AsmScn_t *asmscn, int32_t num)
289     attribute_hidden;
290extern int __asm_addint64_internal (AsmScn_t *asmscn, int64_t num)
291     attribute_hidden;
292
293
294/* Produce disassembly output for given memory and output it using the
295   given callback functions.  */
296extern int __disasm_cb_internal (DisasmCtx_t *ctx, const uint8_t **startp,
297				 const uint8_t *end, GElf_Addr addr,
298				 const char *fmt, DisasmOutputCB_t outcb,
299				 void *outcbarp, void *symcbarg)
300     attribute_hidden;
301
302
303/* Test whether given symbol is an internal symbol and if yes, whether
304   we should nevertheless emit it in the symbol table.  */
305// XXX The second part should probably be controlled by an option which
306// isn't implemented yet
307// XXX Also, the format will change with the backend.
308#define asm_emit_symbol_p(name) (!startswith (name, ".L"))
309
310#endif	/* libasmP.h */
311