| /* 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 */ |