/* Internal definitions for libasm. Copyright (C) 2002, 2004 Red Hat, Inc. This program is Open Source software; you can redistribute it and/or modify it under the terms of the Open Software License version 1.0 as published by the Open Source Initiative. You should have received a copy of the Open Software License along with this program; if not, you may obtain a copy of the Open Software License version 1.0 from http://www.opensource.org/licenses/osl.php or by writing the Open Source Initiative c/o Lawrence Rosen, Esq., 3001 King Ranch Road, Ukiah, CA 95482. */ #ifndef _LIBASMP_H #define _LIBASMP_H 1 #include <stdio.h> #include <libasm.h> #include <libebl.h> /* gettext helper macros. */ #define _(Str) dgettext ("elfutils", Str) /* Known error codes. */ enum { ASM_E_NOERROR, ASM_E_NOMEM, /* No more memory. */ ASM_E_CANNOT_CREATE, /* Output file cannot be created. */ ASM_E_INVALID, /* Invalid parameters. */ ASM_E_CANNOT_CHMOD, /* Cannot change mode of output file. */ ASM_E_CANNOT_RENAME, /* Cannot rename output file. */ ASM_E_DUPLSYM, /* Duplicate symbol definition. */ ASM_E_LIBELF, /* Refer to error in libelf. */ ASM_E_TYPE, /* Invalid section type for operation. */ ASM_E_NUM /* Keep this entry as the last. */ }; /* Special sections. */ #define ASM_ABS_SCN ((Elf_Scn *) 1) #define ASM_COM_SCN ((Elf_Scn *) 2) /* And the hash table for symbols. */ #include <symbolhash.h> /* Descriptor for a section. */ struct AsmScn { /* The underlying assembler context. */ AsmCtx_t *ctx; /* Subsection ID. */ unsigned int subsection_id; /* Section type. */ GElf_Word type; union { /* Data only stored in the record for subsection zero. */ struct { /* The ELF section. */ Elf_Scn *scn; /* Entry in the section header string table. */ struct Ebl_Strent *strent; /* Next member of group. */ struct AsmScn *next_in_group; } main; /* Pointer to the record for subsection zero. */ AsmScn_t *up; } data; /* Current offset in the (sub)section. */ GElf_Off offset; /* Maximum alignment of the section so far. */ GElf_Word max_align; /* Section content. */ struct AsmData { /* Currently used number of bytes in the block. */ size_t len; /* Number of bytes allocated. */ size_t maxlen; /* Pointer to the next block. */ struct AsmData *next; /* The actual data. */ char data[flexarr_size]; } *content; /* Fill pattern. */ struct FillPattern { size_t len; char bytes[flexarr_size]; } *pattern; /* Next subsection. */ AsmScn_t *subnext; /* List of all allocated sections. */ AsmScn_t *allnext; /* Name of the section. */ char name[flexarr_size]; }; /* Descriptor used for the assembling session. */ struct AsmCtx { /* File descriptor of the temporary file. */ int fd; /* True if text output is wanted. */ bool textp; /* Output file handle. */ union { /* ELF descriptor of the temporary file. */ Elf *elf; /* I/O stream for text output. */ FILE *file; } out; /* List with defined sections. */ AsmScn_t *section_list; /* Section header string table. */ struct Ebl_Strtab *section_strtab; /* Table with defined symbols. */ asm_symbol_tab symbol_tab; /* Number of symbols in the table. */ unsigned int nsymbol_tab; /* Symbol string table. */ struct Ebl_Strtab *symbol_strtab; /* List of section groups. */ struct AsmScnGrp *groups; /* Number of section groups. */ size_t ngroups; /* Current required alignment for common symbols. */ GElf_Word common_align; /* Lock to handle multithreaded programs. */ rwlock_define (,lock); /* Counter for temporary symbols. */ unsigned int tempsym_count; /* Name of the output file. */ char *fname; /* The name of the temporary file. */ char tmp_fname[flexarr_size]; }; /* Descriptor for a symbol. */ struct AsmSym { /* Reference to the section which contains the symbol. */ AsmScn_t *scn; /* Type of the symbol. */ int8_t type; /* Binding of the symbol. */ int8_t binding; /* Size of the symbol. */ GElf_Xword size; /* Offset in the section. */ GElf_Off offset; /* Symbol table index of the symbol in the symbol table. */ size_t symidx; /* Reference to name of the symbol. */ struct Ebl_Strent *strent; }; /* Descriptor for section group. */ struct AsmScnGrp { /* Entry in the section header string table. */ struct Ebl_Strent *strent; /* The ELF section. */ Elf_Scn *scn; /* The signature. */ struct AsmSym *signature; /* First member. */ struct AsmScn *members; /* Number of members. */ size_t nmembers; /* Flags. */ Elf32_Word flags; /* Next group. */ struct AsmScnGrp *next; /* Name of the section group. */ char name[flexarr_size]; }; /* The default fill pattern: one zero byte. */ extern const struct FillPattern *__libasm_default_pattern attribute_hidden; /* Ensure there are at least LEN bytes available in the output buffer for ASMSCN. */ extern int __libasm_ensure_section_space (AsmScn_t *asmscn, size_t len) internal_function; /* Free all resources associated with the assembler context. */ extern void __libasm_finictx (AsmCtx_t *ctx) internal_function; /* Set error code. */ extern void __libasm_seterrno (int err) internal_function; /* Return handle for the named section. If it was not used before create it. */ extern AsmScn_t *__asm_newscn_internal (AsmCtx_t *ctx, const char *scnname, GElf_Word type, GElf_Xword flags) attribute_hidden; /* Internal aliases of the asm_addintXX functions. */ extern int __asm_addint8_internal (AsmScn_t *asmscn, int8_t num) attribute_hidden; extern int __asm_addint16_internal (AsmScn_t *asmscn, int16_t num) attribute_hidden; extern int __asm_addint32_internal (AsmScn_t *asmscn, int32_t num) attribute_hidden; extern int __asm_addint64_internal (AsmScn_t *asmscn, int64_t num) attribute_hidden; /* Test whether given symbol is an internal symbol and if yes, whether we should nevertheless emit it in the symbol table. */ // XXX The second part should probably be controlled by an option which // isn't implemented yet // XXX Also, the format will change with the backend. #define asm_emit_symbol_p(name) (strncmp (name, ".L", 2) != 0) #endif /* libasmP.h */