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