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