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