• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Internal definitions for libasm.
2    Copyright (C) 2002, 2004 Red Hat, Inc.
3 
4    This program is Open Source software; you can redistribute it and/or
5    modify it under the terms of the Open Software License version 1.0 as
6    published by the Open Source Initiative.
7 
8    You should have received a copy of the Open Software License along
9    with this program; if not, you may obtain a copy of the Open Software
10    License version 1.0 from http://www.opensource.org/licenses/osl.php or
11    by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
12    3001 King Ranch Road, Ukiah, CA 95482.   */
13 
14 #ifndef _LIBASMP_H
15 #define _LIBASMP_H 1
16 
17 #include <stdio.h>
18 
19 #include <libasm.h>
20 #include <libebl.h>
21 
22 /* gettext helper macros.  */
23 #define _(Str) dgettext ("elfutils", Str)
24 
25 
26 /* Known error codes.  */
27 enum
28   {
29     ASM_E_NOERROR,
30     ASM_E_NOMEM,		/* No more memory.  */
31     ASM_E_CANNOT_CREATE,	/* Output file cannot be created.  */
32     ASM_E_INVALID,		/* Invalid parameters.  */
33     ASM_E_CANNOT_CHMOD,		/* Cannot change mode of output file.  */
34     ASM_E_CANNOT_RENAME,	/* Cannot rename output file.  */
35     ASM_E_DUPLSYM,		/* Duplicate symbol definition.  */
36     ASM_E_LIBELF,		/* Refer to error in libelf.  */
37     ASM_E_TYPE,			/* Invalid section type for operation.  */
38     ASM_E_NUM			/* Keep this entry as the last.  */
39   };
40 
41 
42 /* Special sections.  */
43 #define ASM_ABS_SCN ((Elf_Scn *) 1)
44 #define ASM_COM_SCN ((Elf_Scn *) 2)
45 
46 
47 /* And the hash table for symbols.  */
48 #include <symbolhash.h>
49 
50 
51 /* Descriptor for a section.  */
52 struct AsmScn
53 {
54   /* The underlying assembler context.  */
55   AsmCtx_t *ctx;
56 
57   /* Subsection ID.  */
58   unsigned int subsection_id;
59 
60   /* Section type.  */
61   GElf_Word type;
62 
63   union
64   {
65     /* Data only stored in the record for subsection zero.  */
66     struct
67     {
68       /* The ELF section.  */
69       Elf_Scn *scn;
70 
71       /* Entry in the section header string table.  */
72       struct Ebl_Strent *strent;
73 
74       /* Next member of group.  */
75       struct AsmScn *next_in_group;
76     } main;
77 
78     /* Pointer to the record for subsection zero.  */
79     AsmScn_t *up;
80   } data;
81 
82   /* Current offset in the (sub)section.  */
83   GElf_Off offset;
84   /* Maximum alignment of the section so far.  */
85   GElf_Word max_align;
86 
87   /* Section content.  */
88   struct AsmData
89   {
90     /* Currently used number of bytes in the block.  */
91     size_t len;
92 
93     /* Number of bytes allocated.  */
94     size_t maxlen;
95 
96     /* Pointer to the next block.  */
97     struct AsmData *next;
98 
99     /* The actual data.  */
100     char data[flexarr_size];
101   } *content;
102 
103   /* Fill pattern.  */
104   struct FillPattern
105   {
106     size_t len;
107     char bytes[flexarr_size];
108   } *pattern;
109 
110   /* Next subsection.  */
111   AsmScn_t *subnext;
112 
113   /* List of all allocated sections.  */
114   AsmScn_t *allnext;
115 
116   /* Name of the section.  */
117   char name[flexarr_size];
118 };
119 
120 
121 /* Descriptor used for the assembling session.  */
122 struct AsmCtx
123 {
124   /* File descriptor of the temporary file.  */
125   int fd;
126 
127   /* True if text output is wanted.  */
128   bool textp;
129 
130   /* Output file handle.  */
131   union
132   {
133     /* ELF descriptor of the temporary file.  */
134     Elf *elf;
135     /* I/O stream for text output.  */
136     FILE *file;
137   } out;
138 
139 
140   /* List with defined sections.  */
141   AsmScn_t *section_list;
142   /* Section header string table.  */
143   struct Ebl_Strtab *section_strtab;
144 
145   /* Table with defined symbols.  */
146   asm_symbol_tab symbol_tab;
147   /* Number of symbols in the table.  */
148   unsigned int nsymbol_tab;
149   /* Symbol string table.  */
150   struct Ebl_Strtab *symbol_strtab;
151 
152   /* List of section groups.  */
153   struct AsmScnGrp *groups;
154   /* Number of section groups.  */
155   size_t ngroups;
156 
157   /* Current required alignment for common symbols.  */
158   GElf_Word common_align;
159 
160   /* Lock to handle multithreaded programs.  */
161   rwlock_define (,lock);
162 
163   /* Counter for temporary symbols.  */
164   unsigned int tempsym_count;
165 
166   /* Name of the output file.  */
167   char *fname;
168   /* The name of the temporary file.  */
169   char tmp_fname[flexarr_size];
170 };
171 
172 
173 /* Descriptor for a symbol.  */
174 struct AsmSym
175 {
176   /* Reference to the section which contains the symbol.  */
177   AsmScn_t *scn;
178 
179   /* Type of the symbol.  */
180   int8_t type;
181   /* Binding of the symbol.  */
182   int8_t binding;
183 
184   /* Size of the symbol.  */
185   GElf_Xword size;
186 
187   /* Offset in the section.  */
188   GElf_Off offset;
189 
190   /* Symbol table index of the symbol in the symbol table.  */
191   size_t symidx;
192 
193   /* Reference to name of the symbol.  */
194   struct Ebl_Strent *strent;
195 };
196 
197 
198 /* Descriptor for section group.  */
199 struct AsmScnGrp
200 {
201   /* Entry in the section header string table.  */
202   struct Ebl_Strent *strent;
203 
204   /* The ELF section.  */
205   Elf_Scn *scn;
206 
207   /* The signature.  */
208   struct AsmSym *signature;
209 
210   /* First member.  */
211   struct AsmScn *members;
212   /* Number of members.  */
213   size_t nmembers;
214 
215   /* Flags.  */
216   Elf32_Word flags;
217 
218   /* Next group.  */
219   struct AsmScnGrp *next;
220 
221   /* Name of the section group.  */
222   char name[flexarr_size];
223 };
224 
225 
226 /* The default fill pattern: one zero byte.  */
227 extern const struct FillPattern *__libasm_default_pattern
228      attribute_hidden;
229 
230 
231 /* Ensure there are at least LEN bytes available in the output buffer
232    for ASMSCN.  */
233 extern int __libasm_ensure_section_space (AsmScn_t *asmscn, size_t len)
234      internal_function;
235 
236 /* Free all resources associated with the assembler context.  */
237 extern void __libasm_finictx (AsmCtx_t *ctx) internal_function;
238 
239 /* Set error code.  */
240 extern void __libasm_seterrno (int err) internal_function;
241 
242 /* Return handle for the named section.  If it was not used before
243    create it.  */
244 extern AsmScn_t *__asm_newscn_internal (AsmCtx_t *ctx, const char *scnname,
245 					GElf_Word type, GElf_Xword flags)
246      attribute_hidden;
247 
248 
249 /* Internal aliases of the asm_addintXX functions.  */
250 extern int __asm_addint8_internal (AsmScn_t *asmscn, int8_t num)
251      attribute_hidden;
252 extern int __asm_addint16_internal (AsmScn_t *asmscn, int16_t num)
253      attribute_hidden;
254 extern int __asm_addint32_internal (AsmScn_t *asmscn, int32_t num)
255      attribute_hidden;
256 extern int __asm_addint64_internal (AsmScn_t *asmscn, int64_t num)
257      attribute_hidden;
258 
259 
260 
261 /* Test whether given symbol is an internal symbol and if yes, whether
262    we should nevertheless emit it in the symbol table.  */
263 // XXX The second part should probably be controlled by an option which
264 // isn't implemented yet
265 // XXX Also, the format will change with the backend.
266 #define asm_emit_symbol_p(name) (strncmp (name, ".L", 2) != 0)
267 
268 #endif	/* libasmP.h */
269