Blame libasm/libasmP.h

Packit Service 97d2fb
/* Internal definitions for libasm.
Packit Service 97d2fb
   Copyright (C) 2002, 2004, 2005, 2016 Red Hat, Inc.
Packit Service 97d2fb
   This file is part of elfutils.
Packit Service 97d2fb
Packit Service 97d2fb
   This file is free software; you can redistribute it and/or modify
Packit Service 97d2fb
   it under the terms of either
Packit Service 97d2fb
Packit Service 97d2fb
     * the GNU Lesser General Public License as published by the Free
Packit Service 97d2fb
       Software Foundation; either version 3 of the License, or (at
Packit Service 97d2fb
       your option) any later version
Packit Service 97d2fb
Packit Service 97d2fb
   or
Packit Service 97d2fb
Packit Service 97d2fb
     * the GNU General Public License as published by the Free
Packit Service 97d2fb
       Software Foundation; either version 2 of the License, or (at
Packit Service 97d2fb
       your option) any later version
Packit Service 97d2fb
Packit Service 97d2fb
   or both in parallel, as here.
Packit Service 97d2fb
Packit Service 97d2fb
   elfutils is distributed in the hope that it will be useful, but
Packit Service 97d2fb
   WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 97d2fb
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 97d2fb
   General Public License for more details.
Packit Service 97d2fb
Packit Service 97d2fb
   You should have received copies of the GNU General Public License and
Packit Service 97d2fb
   the GNU Lesser General Public License along with this program.  If
Packit Service 97d2fb
   not, see <http://www.gnu.org/licenses/>.  */
Packit Service 97d2fb
Packit Service 97d2fb
#ifndef _LIBASMP_H
Packit Service 97d2fb
#define _LIBASMP_H 1
Packit Service 97d2fb
Packit Service 97d2fb
#include <stdio.h>
Packit Service 97d2fb
Packit Service 97d2fb
#include <libasm.h>
Packit Service 97d2fb
#include "libebl.h"
Packit Service 97d2fb
Packit Service 97d2fb
#include "libdwelf.h"
Packit Service 97d2fb
Packit Service 97d2fb
/* gettext helper macros.  */
Packit Service 97d2fb
#define _(Str) dgettext ("elfutils", Str)
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
/* Known error codes.  */
Packit Service 97d2fb
enum
Packit Service 97d2fb
  {
Packit Service 97d2fb
    ASM_E_NOERROR,
Packit Service 97d2fb
    ASM_E_NOMEM,		/* No more memory.  */
Packit Service 97d2fb
    ASM_E_CANNOT_CREATE,	/* Output file cannot be created.  */
Packit Service 97d2fb
    ASM_E_INVALID,		/* Invalid parameters.  */
Packit Service 97d2fb
    ASM_E_CANNOT_CHMOD,		/* Cannot change mode of output file.  */
Packit Service 97d2fb
    ASM_E_CANNOT_RENAME,	/* Cannot rename output file.  */
Packit Service 97d2fb
    ASM_E_DUPLSYM,		/* Duplicate symbol definition.  */
Packit Service 97d2fb
    ASM_E_LIBELF,		/* Refer to error in libelf.  */
Packit Service 97d2fb
    ASM_E_TYPE,			/* Invalid section type for operation.  */
Packit Service 97d2fb
    ASM_E_IOERROR,		/* Error during output of data.  */
Packit Service 97d2fb
    ASM_E_ENOSUP,		/* No backend support.  */
Packit Service 97d2fb
    ASM_E_NUM			/* Keep this entry as the last.  */
Packit Service 97d2fb
  };
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
/* Special sections.  */
Packit Service 97d2fb
#define ASM_ABS_SCN ((Elf_Scn *) 1)
Packit Service 97d2fb
#define ASM_COM_SCN ((Elf_Scn *) 2)
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
/* And the hash table for symbols.  */
Packit Service 97d2fb
#include <symbolhash.h>
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
/* Descriptor for a section.  */
Packit Service 97d2fb
struct AsmScn
Packit Service 97d2fb
{
Packit Service 97d2fb
  /* The underlying assembler context.  */
Packit Service 97d2fb
  AsmCtx_t *ctx;
Packit Service 97d2fb
Packit Service 97d2fb
  /* Subsection ID.  */
Packit Service 97d2fb
  unsigned int subsection_id;
Packit Service 97d2fb
Packit Service 97d2fb
  /* Section type.  */
Packit Service 97d2fb
  GElf_Word type;
Packit Service 97d2fb
Packit Service 97d2fb
  union
Packit Service 97d2fb
  {
Packit Service 97d2fb
    /* Data only stored in the record for subsection zero.  */
Packit Service 97d2fb
    struct
Packit Service 97d2fb
    {
Packit Service 97d2fb
      /* The ELF section.  */
Packit Service 97d2fb
      Elf_Scn *scn;
Packit Service 97d2fb
Packit Service 97d2fb
      /* Entry in the section header string table.  */
Packit Service 97d2fb
      Dwelf_Strent *strent;
Packit Service 97d2fb
Packit Service 97d2fb
      /* Next member of group.  */
Packit Service 97d2fb
      struct AsmScn *next_in_group;
Packit Service 97d2fb
    } main;
Packit Service 97d2fb
Packit Service 97d2fb
    /* Pointer to the record for subsection zero.  */
Packit Service 97d2fb
    AsmScn_t *up;
Packit Service 97d2fb
  } data;
Packit Service 97d2fb
Packit Service 97d2fb
  /* Current offset in the (sub)section.  */
Packit Service 97d2fb
  GElf_Off offset;
Packit Service 97d2fb
  /* Maximum alignment of the section so far.  */
Packit Service 97d2fb
  GElf_Word max_align;
Packit Service 97d2fb
Packit Service 97d2fb
  /* Section content.  */
Packit Service 97d2fb
  struct AsmData
Packit Service 97d2fb
  {
Packit Service 97d2fb
    /* Currently used number of bytes in the block.  */
Packit Service 97d2fb
    size_t len;
Packit Service 97d2fb
Packit Service 97d2fb
    /* Number of bytes allocated.  */
Packit Service 97d2fb
    size_t maxlen;
Packit Service 97d2fb
Packit Service 97d2fb
    /* Pointer to the next block.  */
Packit Service 97d2fb
    struct AsmData *next;
Packit Service 97d2fb
Packit Service 97d2fb
    /* The actual data.  */
Packit Service 97d2fb
    char data[flexarr_size];
Packit Service 97d2fb
  } *content;
Packit Service 97d2fb
Packit Service 97d2fb
  /* Fill pattern.  */
Packit Service 97d2fb
  struct FillPattern
Packit Service 97d2fb
  {
Packit Service 97d2fb
    size_t len;
Packit Service 97d2fb
    char bytes[flexarr_size];
Packit Service 97d2fb
  } *pattern;
Packit Service 97d2fb
Packit Service 97d2fb
  /* Next subsection.  */
Packit Service 97d2fb
  AsmScn_t *subnext;
Packit Service 97d2fb
Packit Service 97d2fb
  /* List of all allocated sections.  */
Packit Service 97d2fb
  AsmScn_t *allnext;
Packit Service 97d2fb
Packit Service 97d2fb
  /* Name of the section.  */
Packit Service 97d2fb
  char name[flexarr_size];
Packit Service 97d2fb
};
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
/* Descriptor used for the assembling session.  */
Packit Service 97d2fb
struct AsmCtx
Packit Service 97d2fb
{
Packit Service 97d2fb
  /* File descriptor of the temporary file.  */
Packit Service 97d2fb
  int fd;
Packit Service 97d2fb
Packit Service 97d2fb
  /* True if text output is wanted.  */
Packit Service 97d2fb
  bool textp;
Packit Service 97d2fb
Packit Service 97d2fb
  /* Output file handle.  */
Packit Service 97d2fb
  union
Packit Service 97d2fb
  {
Packit Service 97d2fb
    /* ELF descriptor of the temporary file.  */
Packit Service 97d2fb
    Elf *elf;
Packit Service 97d2fb
    /* I/O stream for text output.  */
Packit Service 97d2fb
    FILE *file;
Packit Service 97d2fb
  } out;
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
  /* List with defined sections.  */
Packit Service 97d2fb
  AsmScn_t *section_list;
Packit Service 97d2fb
  /* Section header string table.  */
Packit Service 97d2fb
  Dwelf_Strtab *section_strtab;
Packit Service 97d2fb
Packit Service 97d2fb
  /* Table with defined symbols.  */
Packit Service 97d2fb
  asm_symbol_tab symbol_tab;
Packit Service 97d2fb
  /* Number of symbols in the table.  */
Packit Service 97d2fb
  unsigned int nsymbol_tab;
Packit Service 97d2fb
  /* Symbol string table.  */
Packit Service 97d2fb
  Dwelf_Strtab *symbol_strtab;
Packit Service 97d2fb
Packit Service 97d2fb
  /* List of section groups.  */
Packit Service 97d2fb
  struct AsmScnGrp *groups;
Packit Service 97d2fb
  /* Number of section groups.  */
Packit Service 97d2fb
  size_t ngroups;
Packit Service 97d2fb
Packit Service 97d2fb
  /* Current required alignment for common symbols.  */
Packit Service 97d2fb
  GElf_Word common_align;
Packit Service 97d2fb
Packit Service 97d2fb
  /* Lock to handle multithreaded programs.  */
Packit Service 97d2fb
  rwlock_define (,lock);
Packit Service 97d2fb
Packit Service 97d2fb
  /* Counter for temporary symbols.  */
Packit Service 97d2fb
  unsigned int tempsym_count;
Packit Service 97d2fb
Packit Service 97d2fb
  /* Name of the output file.  */
Packit Service 97d2fb
  char *fname;
Packit Service 97d2fb
  /* The name of the temporary file.  */
Packit Service 97d2fb
  char tmp_fname[flexarr_size];
Packit Service 97d2fb
};
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
/* Descriptor for a symbol.  */
Packit Service 97d2fb
struct AsmSym
Packit Service 97d2fb
{
Packit Service 97d2fb
  /* Reference to the section which contains the symbol.  */
Packit Service 97d2fb
  AsmScn_t *scn;
Packit Service 97d2fb
Packit Service 97d2fb
  /* Type of the symbol.  */
Packit Service 97d2fb
  int8_t type;
Packit Service 97d2fb
  /* Binding of the symbol.  */
Packit Service 97d2fb
  int8_t binding;
Packit Service 97d2fb
Packit Service 97d2fb
  /* Size of the symbol.  */
Packit Service 97d2fb
  GElf_Xword size;
Packit Service 97d2fb
Packit Service 97d2fb
  /* Offset in the section.  */
Packit Service 97d2fb
  GElf_Off offset;
Packit Service 97d2fb
Packit Service 97d2fb
  /* Symbol table index of the symbol in the symbol table.  */
Packit Service 97d2fb
  size_t symidx;
Packit Service 97d2fb
Packit Service 97d2fb
  /* Reference to name of the symbol.  */
Packit Service 97d2fb
  Dwelf_Strent *strent;
Packit Service 97d2fb
};
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
/* Descriptor for section group.  */
Packit Service 97d2fb
struct AsmScnGrp
Packit Service 97d2fb
{
Packit Service 97d2fb
  /* Entry in the section header string table.  */
Packit Service 97d2fb
  Dwelf_Strent *strent;
Packit Service 97d2fb
Packit Service 97d2fb
  /* The ELF section.  */
Packit Service 97d2fb
  Elf_Scn *scn;
Packit Service 97d2fb
Packit Service 97d2fb
  /* The signature.  */
Packit Service 97d2fb
  struct AsmSym *signature;
Packit Service 97d2fb
Packit Service 97d2fb
  /* First member.  */
Packit Service 97d2fb
  struct AsmScn *members;
Packit Service 97d2fb
  /* Number of members.  */
Packit Service 97d2fb
  size_t nmembers;
Packit Service 97d2fb
Packit Service 97d2fb
  /* Flags.  */
Packit Service 97d2fb
  Elf32_Word flags;
Packit Service 97d2fb
Packit Service 97d2fb
  /* Next group.  */
Packit Service 97d2fb
  struct AsmScnGrp *next;
Packit Service 97d2fb
Packit Service 97d2fb
  /* Name of the section group.  */
Packit Service 97d2fb
  char name[flexarr_size];
Packit Service 97d2fb
};
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
/* Descriptor for disassembler.   */
Packit Service 97d2fb
struct DisasmCtx
Packit Service 97d2fb
{
Packit Service 97d2fb
  /* Handle for the backend library with the disassembler routine.  */
Packit Service 97d2fb
  Ebl *ebl;
Packit Service 97d2fb
Packit Service 97d2fb
  /* ELF file containing all the data passed to the function.  This
Packit Service 97d2fb
     allows to look up symbols.  */
Packit Service 97d2fb
  Elf *elf;
Packit Service 97d2fb
Packit Service 97d2fb
  /* Callback function to determine symbol names.  */
Packit Service 97d2fb
  DisasmGetSymCB_t symcb;
Packit Service 97d2fb
};
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
/* The default fill pattern: one zero byte.  */
Packit Service 97d2fb
extern const struct FillPattern *__libasm_default_pattern
Packit Service 97d2fb
     attribute_hidden;
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
/* Ensure there are at least LEN bytes available in the output buffer
Packit Service 97d2fb
   for ASMSCN.  */
Packit Service 97d2fb
extern int __libasm_ensure_section_space (AsmScn_t *asmscn, size_t len)
Packit Service 97d2fb
     internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Free all resources associated with the assembler context.  */
Packit Service 97d2fb
extern void __libasm_finictx (AsmCtx_t *ctx) internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Set error code.  */
Packit Service 97d2fb
extern void __libasm_seterrno (int err) internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Return handle for the named section.  If it was not used before
Packit Service 97d2fb
   create it.  */
Packit Service 97d2fb
extern AsmScn_t *__asm_newscn_internal (AsmCtx_t *ctx, const char *scnname,
Packit Service 97d2fb
					GElf_Word type, GElf_Xword flags)
Packit Service 97d2fb
     attribute_hidden;
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
/* Internal aliases of the asm_addintXX functions.  */
Packit Service 97d2fb
extern int __asm_addint8_internal (AsmScn_t *asmscn, int8_t num)
Packit Service 97d2fb
     attribute_hidden;
Packit Service 97d2fb
extern int __asm_addint16_internal (AsmScn_t *asmscn, int16_t num)
Packit Service 97d2fb
     attribute_hidden;
Packit Service 97d2fb
extern int __asm_addint32_internal (AsmScn_t *asmscn, int32_t num)
Packit Service 97d2fb
     attribute_hidden;
Packit Service 97d2fb
extern int __asm_addint64_internal (AsmScn_t *asmscn, int64_t num)
Packit Service 97d2fb
     attribute_hidden;
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
/* Produce disassembly output for given memory and output it using the
Packit Service 97d2fb
   given callback functions.  */
Packit Service 97d2fb
extern int __disasm_cb_internal (DisasmCtx_t *ctx, const uint8_t **startp,
Packit Service 97d2fb
				 const uint8_t *end, GElf_Addr addr,
Packit Service 97d2fb
				 const char *fmt, DisasmOutputCB_t outcb,
Packit Service 97d2fb
				 void *outcbarp, void *symcbarg)
Packit Service 97d2fb
     attribute_hidden;
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
/* Test whether given symbol is an internal symbol and if yes, whether
Packit Service 97d2fb
   we should nevertheless emit it in the symbol table.  */
Packit Service 97d2fb
// XXX The second part should probably be controlled by an option which
Packit Service 97d2fb
// isn't implemented yet
Packit Service 97d2fb
// XXX Also, the format will change with the backend.
Packit Service 97d2fb
#define asm_emit_symbol_p(name) (strncmp (name, ".L", 2) != 0)
Packit Service 97d2fb
Packit Service 97d2fb
#endif	/* libasmP.h */