xref: /third_party/elfutils/libasm/libasm.h (revision da0c48c4)
1/* Interface for libasm.
2   Copyright (C) 2002, 2005, 2008 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 _LIBASM_H
30#define _LIBASM_H 1
31
32#include <stdbool.h>
33#include <stdint.h>
34#include <gelf.h>
35
36typedef struct ebl Ebl;
37
38
39/* Opaque type for the assembler context descriptor.  */
40typedef struct AsmCtx AsmCtx_t;
41
42/* Opaque type for a section.  */
43typedef struct AsmScn AsmScn_t;
44
45/* Opaque type for a section group.  */
46typedef struct AsmScnGrp AsmScnGrp_t;
47
48/* Opaque type for a symbol.  */
49typedef struct AsmSym AsmSym_t;
50
51
52/* Opaque type for the disassembler context descriptor.  */
53typedef struct DisasmCtx DisasmCtx_t;
54
55/* Type used for callback functions to retrieve symbol name.  The
56   symbol reference is in the section designated by the second parameter
57   at an offset described by the first parameter.  The value is the
58   third parameter.  */
59typedef int (*DisasmGetSymCB_t) (GElf_Addr, Elf32_Word, GElf_Addr, char **,
60				 size_t *, void *);
61
62/* Output function callback.  */
63typedef int (*DisasmOutputCB_t) (char *, size_t, void *);
64
65
66#ifdef __cplusplus
67extern "C" {
68#endif
69
70/* Create output file and return descriptor for assembler context.  If
71   TEXTP is true the output is an assembler format text file.
72   Otherwise an object file is created.  The MACHINE parameter
73   corresponds to an EM_ constant from <elf.h>, KLASS specifies the
74   class (32- or 64-bit), and DATA specifies the byte order (little or
75   big endian).  */
76extern AsmCtx_t *asm_begin (const char *fname, Ebl *ebl, bool textp);
77
78/* Abort the operation on the assembler context and free all resources.  */
79extern int asm_abort (AsmCtx_t *ctx);
80
81/* Finalize output file and free all resources.  */
82extern int asm_end (AsmCtx_t *ctx);
83
84
85/* Return handle for the named section.  If it was not used before
86   create it.  */
87extern AsmScn_t *asm_newscn (AsmCtx_t *ctx, const char *scnname,
88			     GElf_Word type, GElf_Xword flags);
89
90
91/* Similar to 'asm_newscn', but make it part of section group GRP.  */
92extern AsmScn_t *asm_newscn_ingrp (AsmCtx_t *ctx, const char *scnname,
93				   GElf_Word type, GElf_Xword flags,
94				   AsmScnGrp_t *grp);
95
96/* Create new subsection NR in the given section.  */
97extern AsmScn_t *asm_newsubscn (AsmScn_t *asmscn, unsigned int nr);
98
99
100/* Return handle for new section group.  The signature symbol can be
101   set later.  */
102extern AsmScnGrp_t *asm_newscngrp (AsmCtx_t *ctx, const char *grpname,
103				   AsmSym_t *signature, Elf32_Word flags);
104
105/* Set or overwrite signature symbol for group.  */
106extern int asm_scngrp_newsignature (AsmScnGrp_t *grp, AsmSym_t *signature);
107
108
109/* Add zero terminated string STR of size LEN to (sub)section ASMSCN.  */
110extern int asm_addstrz (AsmScn_t *asmscn, const char *str, size_t len);
111
112/* Add 8-bit signed integer NUM to (sub)section ASMSCN.  */
113extern int asm_addint8 (AsmScn_t *asmscn, int8_t num);
114
115/* Add 8-bit unsigned integer NUM to (sub)section ASMSCN.  */
116extern int asm_adduint8 (AsmScn_t *asmscn, uint8_t num);
117
118/* Add 16-bit signed integer NUM to (sub)section ASMSCN.  */
119extern int asm_addint16 (AsmScn_t *asmscn, int16_t num);
120
121/* Add 16-bit unsigned integer NUM to (sub)section ASMSCN.  */
122extern int asm_adduint16 (AsmScn_t *asmscn, uint16_t num);
123
124/* Add 32-bit signed integer NUM to (sub)section ASMSCN.  */
125extern int asm_addint32 (AsmScn_t *asmscn, int32_t num);
126
127/* Add 32-bit unsigned integer NUM to (sub)section ASMSCN.  */
128extern int asm_adduint32 (AsmScn_t *asmscn, uint32_t num);
129
130/* Add 64-bit signed integer NUM to (sub)section ASMSCN.  */
131extern int asm_addint64 (AsmScn_t *asmscn, int64_t num);
132
133/* Add 64-bit unsigned integer NUM to (sub)section ASMSCN.  */
134extern int asm_adduint64 (AsmScn_t *asmscn, uint64_t num);
135
136
137/* Add signed little endian base 128 integer NUM to (sub)section ASMSCN.  */
138extern int asm_addsleb128 (AsmScn_t *asmscn, int32_t num);
139
140/* Add unsigned little endian base 128 integer NUM to (sub)section ASMSCN.  */
141extern int asm_adduleb128 (AsmScn_t *asmscn, uint32_t num);
142
143
144/* Define new symbol NAME for current position in given section ASMSCN.  */
145extern AsmSym_t *asm_newsym (AsmScn_t *asmscn, const char *name,
146			     GElf_Xword size, int type, int binding);
147
148
149/* Define new common symbol NAME with given SIZE and alignment.  */
150extern AsmSym_t *asm_newcomsym (AsmCtx_t *ctx, const char *name,
151				GElf_Xword size, GElf_Addr align);
152
153/* Define new common symbol NAME with given SIZE, VALUE, TYPE, and BINDING.  */
154extern AsmSym_t *asm_newabssym (AsmCtx_t *ctx, const char *name,
155				GElf_Xword size, GElf_Addr value,
156				int type, int binding);
157
158
159/* Align (sub)section offset according to VALUE.  */
160extern int asm_align (AsmScn_t *asmscn, GElf_Word value);
161
162/* Set the byte pattern used to fill gaps created by alignment.  */
163extern int asm_fill (AsmScn_t *asmscn, void *bytes, size_t len);
164
165
166/* Return ELF descriptor created for the output file of the given context.  */
167extern Elf *asm_getelf (AsmCtx_t *ctx);
168
169
170/* Return error code of last failing function call.  This value is kept
171   separately for each thread.  */
172extern int asm_errno (void);
173
174/* Return error string for ERROR.  If ERROR is zero, return error string
175   for most recent error or NULL is none occurred.  If ERROR is -1 the
176   behaviour is similar to the last case except that not NULL but a legal
177   string is returned.  */
178extern const char *asm_errmsg (int __error);
179
180
181/* Create context descriptor for disassembler.  */
182extern DisasmCtx_t *disasm_begin (Ebl *ebl, Elf *elf, DisasmGetSymCB_t symcb);
183
184/* Release descriptor for disassembler.  */
185extern int disasm_end (DisasmCtx_t *ctx);
186
187/* Produce of disassembly output for given memory, store text in
188   provided buffer.  */
189extern int disasm_str (DisasmCtx_t *ctx, const uint8_t **startp,
190		       const uint8_t *end, GElf_Addr addr, const char *fmt,
191		       char **bufp, size_t len, void *symcbarg);
192
193/* Produce disassembly output for given memory and output it using the
194   given callback functions.  */
195extern int disasm_cb (DisasmCtx_t *ctx, const uint8_t **startp,
196		      const uint8_t *end, GElf_Addr addr, const char *fmt,
197		      DisasmOutputCB_t outcb, void *outcbarg, void *symcbarg);
198
199#ifdef __cplusplus
200}
201#endif
202
203#endif	/* libasm.h */
204