/* $Id: elf.h 2208 2009-07-22 05:45:03Z peter $
 * ELF object format helpers
 *
 *  Copyright (C) 2003-2007  Michael Urman
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef ELF_H_INCLUDED
#define ELF_H_INCLUDED

typedef struct elf_reloc_entry elf_reloc_entry;
typedef struct elf_reloc_head elf_reloc_head;
typedef struct elf_secthead elf_secthead;
typedef struct elf_strtab_entry elf_strtab_entry;
typedef struct elf_strtab_head elf_strtab_head;
typedef struct elf_symtab_entry elf_symtab_entry;
typedef struct elf_symtab_head elf_symtab_head;

typedef struct elf_machine_handler elf_machine_handler;

typedef unsigned long   elf_address;
typedef unsigned long   elf_offset;
typedef unsigned long   elf_size;
typedef unsigned long   elf_section_info;

typedef enum {
    ET_NONE = 0,
    ET_REL = 1,                                 /* Relocatable */
    ET_EXEC = 2,                                /* Executable */
    ET_DYN = 3,                                 /* Shared object */
    ET_CORE = 4,                                /* Core */
    ET_LOOS = 0xfe00,                           /* Environment specific */
    ET_HIOS = 0xfeff,
    ET_LOPROC = 0xff00,                         /* Processor specific */
    ET_HIPROC = 0xffff
} elf_file_type;

typedef enum {
    EM_NONE = 0,
    EM_M32 = 1,                                 /* AT&T WE 32100 */
    EM_SPARC = 2,                               /* SPARC */
    EM_386 = 3,                                 /* Intel 80386 */
    EM_68K = 4,                                 /* Motorola 68000 */
    EM_88K = 5,                                 /* Motorola 88000 */
    EM_860 = 7,                                 /* Intel 80860 */
    EM_MIPS = 8,                                /* MIPS RS3000 */

    EM_S370 = 9,                                /* IBM System/370 */
    EM_MIPS_RS4_BE = 10,                        /* MIPS R4000 Big-Endian (dep)*/
    EM_PARISC = 15,                             /* HPPA */
    EM_SPARC32PLUS = 18,                        /* SPARC v8plus */
    EM_PPC = 20,                                /* PowerPC 32-bit */
    EM_PPC64 = 21,                              /* PowerPC 64-bit */
    EM_ARM = 40,                                /* ARM */
    EM_SPARCV9 = 43,                            /* SPARC v9 64-bit */
    EM_IA_64 = 50,                              /* Intel IA-64 */
    EM_X86_64 = 62,                             /* AMD x86-64 */
    EM_ALPHA = 0x9026                           /* Alpha (no ABI) */
} elf_machine;

typedef enum {
    ELFMAG0 = 0x7f,
    ELFMAG1 = 0x45,
    ELFMAG2 = 0x4c,
    ELFMAG3 = 0x46 
} elf_magic;

typedef enum {
    EV_NONE = 0,                                /* invalid */
    EV_CURRENT = 1                              /* current */
} elf_version;

typedef enum {
    EI_MAG0 = 0,                                /* File id */
    EI_MAG1 = 1,
    EI_MAG2 = 2,
    EI_MAG3 = 3,
    EI_CLASS = 4,                               /* File class */
    EI_DATA = 5,                                /* Data encoding */
    EI_VERSION = 6,                             /* File version */
    EI_OSABI = 7,                               /* OS and ABI */
    EI_ABIVERSION = 8,                          /* version of ABI */

    EI_PAD = 9,                                 /* Pad to end; start here */
    EI_NIDENT = 16                              /* Sizeof e_ident[] */
} elf_identification_index;

typedef enum {
    ELFOSABI_SYSV = 0,                          /* System V ABI */
    ELFOSABI_HPUX = 1,                          /* HP-UX os */
    ELFOSABI_STANDALONE = 255                   /* Standalone / embedded app */
} elf_osabi_index;

typedef enum {
    ELFCLASSNONE = 0,                           /* invalid */
    ELFCLASS32 = 1,                             /* 32-bit */
    ELFCLASS64 = 2                              /* 64-bit */
} elf_class;

typedef enum {
    ELFDATANONE = 0,
    ELFDATA2LSB = 1,
    ELFDATA2MSB = 2
} elf_data_encoding;

/* elf section types - index of semantics */
typedef enum {
    SHT_NULL = 0,               /* inactive section - no associated data */
    SHT_PROGBITS = 1,           /* defined by program for its own meaning */
    SHT_SYMTAB = 2,             /* symbol table (primarily) for linking */
    SHT_STRTAB = 3,             /* string table - symbols need names */
    SHT_RELA = 4,               /* relocation entries w/ explicit addends */
    SHT_HASH = 5,               /* symbol hash table - for dynamic linking */
    SHT_DYNAMIC = 6,            /* information for dynamic linking */
    SHT_NOTE = 7,               /* extra data marking the file somehow */
    SHT_NOBITS = 8,             /* no stored data, but occupies runtime space */
    SHT_REL = 9,                /* relocations entries w/o explicit addends */
    SHT_SHLIB = 10,             /* reserved; unspecified semantics */
    SHT_DYNSYM = 11,            /* like symtab, but more for dynamic linking */

    SHT_LOOS = 0x60000000,      /* reserved for environment specific use */
    SHT_HIOS = 0x6fffffff,
    SHT_LOPROC = 0x70000000,    /* reserved for processor specific semantics */
    SHT_HIPROC = 0x7fffffff/*,
    SHT_LOUSER = 0x80000000,*/  /* reserved for applications; safe */
    /*SHT_HIUSER = 0xffffffff*/
} elf_section_type;

/* elf section flags - bitfield of attributes */
typedef enum {
    SHF_WRITE = 0x1,            /* data should be writable at runtime */
    SHF_ALLOC = 0x2,            /* occupies memory at runtime */
    SHF_EXECINSTR = 0x4,        /* contains machine instructions */
    SHF_MERGE = 0x10,           /* data can be merged */
    SHF_STRINGS = 0x20,         /* contains 0-terminated strings */
    SHF_GROUP = 0x200,          /* member of a section group */
    SHF_TLS = 0x400,            /* thread local storage */
    SHF_MASKOS = 0x0f000000/*,*//* environment specific use */
    /*SHF_MASKPROC = 0xf0000000*/       /* bits reserved for processor specific needs */
} elf_section_flags;

/* elf section index - just the special ones */
typedef enum {
    SHN_UNDEF = 0,              /* undefined symbol; requires other global */
    SHN_LORESERVE = 0xff00,     /* reserved for various semantics */
    SHN_LOPROC = 0xff00,        /* reserved for processor specific semantics */
    SHN_HIPROC = 0xff1f,
    SHN_LOOS = 0xff20,          /* reserved for environment specific use */
    SHN_HIOS = 0xff3f,
    SHN_ABS = 0xfff1,           /* associated symbols don't change on reloc */
    SHN_COMMON = 0xfff2,        /* associated symbols refer to unallocated */
    SHN_HIRESERVE = 0xffff
} elf_section_index;

/* elf symbol binding - index of visibility/behavior */
typedef enum {
    STB_LOCAL = 0,              /* invisible outside defining file */
    STB_GLOBAL = 1,             /* visible to all combined object files */
    STB_WEAK = 2,               /* global but lower precedence */

    STB_LOOS = 10,              /* Environment specific use */
    STB_HIOS = 12,
    STB_LOPROC = 13,            /* reserved for processor specific semantics */
    STB_HIPROC = 15
} elf_symbol_binding;

/* elf symbol type - index of classifications */
typedef enum {
    STT_NOTYPE = 0,             /* type not specified */
    STT_OBJECT = 1,             /* data object such as a variable, array, etc */
    STT_FUNC = 2,               /* a function or executable code */
    STT_SECTION = 3,            /* a section: often for relocation, STB_LOCAL */
    STT_FILE = 4,               /* often source filename: STB_LOCAL, SHN_ABS */
    STT_COMMON = 5,             /* Uninitialized common block. */
    STT_TLS = 6,                /* TLS object. */
    STT_NUM = 7,

    STT_LOOS = 10,              /* Environment specific use */
    STT_HIOS = 12,
    STT_LOPROC = 13,            /* reserved for processor specific semantics */
    STT_HIPROC = 15
} elf_symbol_type;

typedef enum {
    STN_UNDEF = 0
} elf_symbol_index;

/* elf symbol visibility - lower two bits of OTHER field */
typedef enum {
    STV_DEFAULT = 0,            /* Default symbol visibility rules */
    STV_INTERNAL = 1,           /* Processor specific hidden class */
    STV_HIDDEN = 2,             /* Sym unavailable in other modules */
    STV_PROTECTED = 3           /* Not preemptable, not exported */
} elf_symbol_vis;


/* internal only object definitions */
#ifdef YASM_OBJFMT_ELF_INTERNAL

#define ELF_VISIBILITY_MASK             0x03
#define ELF_ST_VISIBILITY(v)            ((v) & ELF_VISIBILITY_MASK)

#define ELF32_ST_INFO(bind, type)       (((bind) << 4) + ((type) & 0xf))
#define ELF32_R_INFO(s,t)               (((s)<<8)+(unsigned char)(t))
#define ELF32_ST_OTHER(vis)             ELF_ST_VISIBILITY(vis)

#define ELF64_ST_INFO(bind, type)       (((bind) << 4) + ((type) & 0xf))
#define ELF64_R_INFO(s,t)               (((s)<<32) + ((t) & 0xffffffffL))
#define ELF64_ST_OTHER(vis)             ELF_ST_VISIBILITY(vis)

#define EHDR32_SIZE 52
#define EHDR64_SIZE 64
#define EHDR_MAXSIZE 64

#define SHDR32_SIZE 40
#define SHDR64_SIZE 64
#define SHDR_MAXSIZE 64

#define SYMTAB32_SIZE 16
#define SYMTAB64_SIZE 24
#define SYMTAB_MAXSIZE 24

#define SYMTAB32_ALIGN 4
#define SYMTAB64_ALIGN 8

#define RELOC32_SIZE 8
#define RELOC32A_SIZE 12
#define RELOC64_SIZE 16
#define RELOC64A_SIZE 24
#define RELOC_MAXSIZE 24

#define RELOC32_ALIGN 4
#define RELOC64_ALIGN 8


/* elf relocation type - index of semantics
 *
 * A = Addend (r_addend for RELA, value at location for REL)
 * B = Base address
 * G = Offset into global offset table (GOT)
 * GOT = Address of the global offset table (GOT)
 * L = Location of procedure linkage table (PLT)
 * P = Location of location being relocated (r_offset)
 * S = Value of symbol
 */
typedef enum {
    R_386_NONE = 0,             /* none */
    R_386_32 = 1,               /* word32, S + A */
    R_386_PC32 = 2,             /* word32, S + A - P */
    R_386_GOT32 = 3,            /* word32, G + A - P */
    R_386_PLT32 = 4,            /* word32, L + A - P */
    R_386_COPY = 5,             /* none */
    R_386_GLOB_DAT = 6,         /* word32, S */
    R_386_JMP_SLOT = 7,         /* word32, S */
    R_386_RELATIVE = 8,         /* word32, B + A */
    R_386_GOTOFF = 9,           /* word32, S + A - GOT */
    R_386_GOTPC = 10,           /* word32, GOT + A - P */
    R_386_TLS_TPOFF = 14,       /* Negative offset in static TLS block (GNU
                                   version) */
    R_386_TLS_IE = 15,          /* Absolute address of GOT entry for negative
                                   static TLS block offset */
    R_386_TLS_GOTIE = 16,       /* GOT entry for negative static TLS block
                                   offset */
    R_386_TLS_LE = 17,          /* Negative offset relative to static TLS
                                   (GNU version) */
    R_386_TLS_GD = 18,          /* Direct 32 bit for GNU version of GD TLS */
    R_386_TLS_LDM = 19,         /* Direct 32 bit for GNU version of LD TLS
                                   in LE code */
    R_386_16 = 20,              /* word16, S + A (GNU extension) */
    R_386_PC16 = 21,            /* word16, S + A - P (GNU extension) */
    R_386_8 = 22,               /* word8, S + A (GNU extension) */
    R_386_PC8 = 23,             /* word8, S + A - P (GNU extension) */
    R_386_TLS_GD_32 = 24,       /* Direct 32 bit for GD TLS */
    R_386_TLS_GD_PUSH = 25,     /* Tag for pushl in GD TLS code */
    R_386_TLS_GD_CALL = 26,     /* Relocation for call to */
    R_386_TLS_GD_POP = 27,      /* Tag for popl in GD TLS code */
    R_386_TLS_LDM_32 = 28,      /* Direct 32 bit for local dynamic code */
    R_386_TLS_LDM_PUSH = 29,    /* Tag for pushl in LDM TLS code */
    R_386_TLS_LDM_CALL = 30,    /* Relocation for call to */
    R_386_TLS_LDM_POP = 31,     /* Tag for popl in LDM TLS code */
    R_386_TLS_LDO_32 = 32,      /* Offset relative to TLS block */
    R_386_TLS_IE_32 = 33,       /* GOT entry for static TLS block */
    R_386_TLS_LE_32 = 34,       /* Offset relative to static TLS block */
    R_386_TLS_DTPMOD32 = 35,    /* ID of module containing symbol */
    R_386_TLS_DTPOFF32 = 36,    /* Offset in TLS block */
    R_386_TLS_TPOFF32 = 37,     /* Offset in static TLS block */
    R_386_TLS_GOTDESC = 39,
    R_386_TLS_DESC_CALL = 40,
    R_386_TLS_DESC = 41
} elf_386_relocation_type;

typedef enum {
    R_X86_64_NONE = 0,          /* none */
    R_X86_64_64 = 1,            /* word64, S + A */
    R_X86_64_PC32 = 2,          /* word32, S + A - P */
    R_X86_64_GOT32 = 3,         /* word32, G + A */
    R_X86_64_PLT32 = 4,         /* word32, L + A - P */
    R_X86_64_COPY = 5,          /* none */
    R_X86_64_GLOB_DAT = 6,      /* word64, S, set GOT entry to data address */
    R_X86_64_JMP_SLOT = 7,      /* word64, S, set GOT entry to code address */
    R_X86_64_RELATIVE = 8,      /* word64, B + A */
    R_X86_64_GOTPCREL = 9,      /* word32, G + GOT + A - P */
    R_X86_64_32 = 10,           /* word32 (zero extend), S + A */
    R_X86_64_32S = 11,          /* word32 (sign extend), S + A */
    R_X86_64_16 = 12,           /* word16, S + A */
    R_X86_64_PC16 = 13,         /* word16, S + A - P */
    R_X86_64_8 = 14,            /* word8, S + A */
    R_X86_64_PC8 = 15,          /* word8, S + A - P */
    R_X86_64_DPTMOD64 = 16,     /* word64, ID of module containing symbol */
    R_X86_64_DTPOFF64 = 17,     /* word64, offset in TLS block */
    R_X86_64_TPOFF64 = 18,      /* word64, offset in initial TLS block */
    R_X86_64_TLSGD = 19,        /* word32, PC-rel offset to GD GOT block */
    R_X86_64_TLSLD = 20,        /* word32, PC-rel offset to LD GOT block */
    R_X86_64_DTPOFF32 = 21,     /* word32, offset to TLS block */
    R_X86_64_GOTTPOFF = 22,     /* word32, PC-rel offset to IE GOT entry */
    R_X86_64_TPOFF32 = 23,      /* word32, offset in initial TLS block */
    R_X86_64_PC64 = 24,         /* word64, PC relative */
    R_X86_64_GOTOFF64 = 25,     /* word64, offset to GOT */
    R_X86_64_GOTPC32 = 26,      /* word32, signed pc relative to GOT */
    R_X86_64_GOT64 = 27,        /* word64, GOT entry offset */
    R_X86_64_GOTPCREL64 = 28,   /* word64, signed pc relative to GOT entry */
    R_X86_64_GOTPC64 = 29,      /* word64, signed pc relative to GOT */
    R_X86_64_GOTPLT64 = 30,     /* like GOT64, but indicates PLT entry needed */
    R_X86_64_PLTOFF64 = 31,     /* word64, GOT relative offset to PLT entry */
    R_X86_64_GOTPC32_TLSDESC = 34, /* GOT offset for TLS descriptor */
    R_X86_64_TLSDESC_CALL = 35, /* Marker for call through TLS descriptor */
    R_X86_64_TLSDESC = 36       /* TLS descriptor */
} elf_x86_64_relocation_type;

struct elf_secthead {
    elf_section_type     type;
    elf_section_flags    flags;
    elf_address          offset;
    yasm_intnum         *size;
    elf_section_index    link;
    elf_section_info     info;      /* see note ESD1 */
    unsigned long        align;
    elf_size             entsize;

    yasm_symrec         *sym;
    elf_strtab_entry    *name;
    elf_section_index    index;

    elf_strtab_entry    *rel_name;
    elf_section_index    rel_index;
    elf_address          rel_offset;
    unsigned long        nreloc;
};

/* Note ESD1:
 *   for section types SHT_REL, SHT_RELA:
 *     link -> index of associated symbol table
 *     info -> index of relocated section
 *   for section types SHT_SYMTAB, SHT_DYNSYM:
 *     link -> index of associated string table
 *     info -> 1+index of last "local symbol" (bind == STB_LOCAL)
 *  (for section type SHT_DNAMIC:
 *     link -> index of string table
 *     info -> 0 )
 *  (for section type SHT_HASH:
 *     link -> index of symbol table to which hash applies
 *     info -> 0 )
 *   for all others:
 *     link -> SHN_UNDEF
 *     info -> 0
 */

struct elf_reloc_entry {
    yasm_reloc           reloc;
    int                  rtype_rel;
    size_t               valsize;
    yasm_intnum         *addend;
    /*@null@*/ yasm_symrec *wrt;
    int                  is_GOT_sym;
};

STAILQ_HEAD(elf_strtab_head, elf_strtab_entry);
struct elf_strtab_entry {
    STAILQ_ENTRY(elf_strtab_entry) qlink;
    unsigned long        index;
    char                *str;
};

STAILQ_HEAD(elf_symtab_head, elf_symtab_entry);
struct elf_symtab_entry {
    STAILQ_ENTRY(elf_symtab_entry) qlink;
    int                 in_table;
    yasm_symrec         *sym;
    yasm_section        *sect;
    elf_strtab_entry    *name;
    elf_address          value;
    /*@dependent@*/ yasm_expr *xsize;
    elf_size             size;
    elf_section_index    index;
    elf_symbol_binding   bind;
    elf_symbol_type      type;
    elf_symbol_vis       vis;
    elf_symbol_index     symindex;
};

#endif /* defined(YASM_OBJFMT_ELF_INTERNAL) */

extern const yasm_assoc_data_callback elf_section_data;
extern const yasm_assoc_data_callback elf_symrec_data;
extern const yasm_assoc_data_callback elf_ssym_symrec_data;


const elf_machine_handler *elf_set_arch(struct yasm_arch *arch,
                                        yasm_symtab *symtab,
                                        int bits_pref);

yasm_symrec *elf_get_special_sym(const char *name, const char *parser);

/* reloc functions */
int elf_is_wrt_sym_relative(yasm_symrec *wrt);
int elf_is_wrt_pos_adjusted(yasm_symrec *wrt);
elf_reloc_entry *elf_reloc_entry_create(yasm_symrec *sym,
                                        /*@null@*/ yasm_symrec *wrt,
                                        yasm_intnum *addr,
                                        int rel,
                                        size_t valsize,
                                        int is_GOT_sym);
void elf_reloc_entry_destroy(void *entry);

/* strtab functions */
elf_strtab_entry *elf_strtab_entry_create(const char *str);
void elf_strtab_entry_set_str(elf_strtab_entry *entry, const char *str);
elf_strtab_head *elf_strtab_create(void);
elf_strtab_entry *elf_strtab_append_str(elf_strtab_head *head, const char *str);
void elf_strtab_destroy(elf_strtab_head *head);
unsigned long elf_strtab_output_to_file(FILE *f, elf_strtab_head *head);

/* symtab functions */
elf_symtab_entry *elf_symtab_entry_create(elf_strtab_entry *name,
                                          struct yasm_symrec *sym);
elf_symtab_head *elf_symtab_create(void);
void elf_symtab_append_entry(elf_symtab_head *symtab, elf_symtab_entry *entry);
void elf_symtab_insert_local_sym(elf_symtab_head *symtab,
                                 elf_symtab_entry *entry);
void elf_symtab_destroy(elf_symtab_head *head);
unsigned long elf_symtab_assign_indices(elf_symtab_head *symtab);
unsigned long elf_symtab_write_to_file(FILE *f, elf_symtab_head *symtab,
                                       yasm_errwarns *errwarns);
void elf_symtab_set_nonzero(elf_symtab_entry    *entry,
                            struct yasm_section *sect,
                            elf_section_index    sectidx,
                            elf_symbol_binding   bind,
                            elf_symbol_type      type,
                            struct yasm_expr    *size,
                            elf_address         *value);
void elf_sym_set_visibility(elf_symtab_entry    *entry,
                            elf_symbol_vis       vis);
void elf_sym_set_type(elf_symtab_entry *entry, elf_symbol_type type);
void elf_sym_set_size(elf_symtab_entry *entry, struct yasm_expr *size);
int elf_sym_in_table(elf_symtab_entry *entry);

/* section header functions */
elf_secthead *elf_secthead_create(elf_strtab_entry      *name,
                                  elf_section_type      type,
                                  elf_section_flags     flags,
                                  elf_address           offset,
                                  elf_size              size);
void elf_secthead_destroy(elf_secthead *esd);
unsigned long elf_secthead_write_to_file(FILE *f, elf_secthead *esd,
                                         elf_section_index sindex);
void elf_secthead_append_reloc(yasm_section *sect, elf_secthead *shead,
                               elf_reloc_entry *reloc);
elf_section_type elf_secthead_get_type(elf_secthead *shead);
void elf_secthead_set_typeflags(elf_secthead *shead, elf_section_type type,
                                elf_section_flags flags);
int elf_secthead_is_empty(elf_secthead *shead);
struct yasm_symrec *elf_secthead_get_sym(elf_secthead *shead);
unsigned long elf_secthead_get_align(const elf_secthead *shead);
unsigned long elf_secthead_set_align(elf_secthead *shead, unsigned long align);
elf_section_index elf_secthead_get_index(elf_secthead *shead);
elf_section_info elf_secthead_set_info(elf_secthead *shead,
                                       elf_section_info info);
elf_section_index elf_secthead_set_index(elf_secthead *shead,
                                         elf_section_index sectidx);
elf_section_index elf_secthead_set_link(elf_secthead *shead,
                                        elf_section_index link);
elf_section_index elf_secthead_set_rel_index(elf_secthead *shead,
                                             elf_section_index sectidx);
elf_strtab_entry *elf_secthead_set_rel_name(elf_secthead *shead,
                                            elf_strtab_entry *entry);
elf_size elf_secthead_set_entsize(elf_secthead *shead, elf_size size);
struct yasm_symrec *elf_secthead_set_sym(elf_secthead *shead,
                                         struct yasm_symrec *sym);
void elf_secthead_add_size(elf_secthead *shead, yasm_intnum *size);
char *elf_secthead_name_reloc_section(const char *basesect);
void elf_handle_reloc_addend(yasm_intnum *intn,
                             elf_reloc_entry *reloc,
                             unsigned long offset);
unsigned long elf_secthead_write_rel_to_file(FILE *f, elf_section_index symtab,
                                             yasm_section *sect,
                                             elf_secthead *esd,
                                             elf_section_index sindex);
unsigned long elf_secthead_write_relocs_to_file(FILE *f, yasm_section *sect,
                                                elf_secthead *shead,
                                                yasm_errwarns *errwarns);
long elf_secthead_set_file_offset(elf_secthead *shead, long pos);

/* program header function */
unsigned long
elf_proghead_get_size(void);
unsigned long
elf_proghead_write_to_file(FILE *f,
                           elf_offset secthead_addr,
                           unsigned long secthead_count,
                           elf_section_index shstrtab_index);

#endif /* ELF_H_INCLUDED */
