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