#ifndef S_SOL_SHOBJ_H
#define S_SOL_SHOBJ_H

#include <sccs.h>

#ifdef DEBUG
#ifdef SPARC
#include <sys/elf_SPARC.h>
#endif

static int Flag_p_long = FALSE;
static int Flag_p_every = FALSE;

#define BITDESC struct BITDESC_T
BITDESC {
	unsigned int mask;
	char *sdesc;
	char *ldesc;
};

#define NUMDESC struct NUMDESC_T
NUMDESC {
	unsigned int num;
	char *sdesc;
	char *ldesc;
};

static NUMDESC elf_kinds[] = {
    {ELF_K_NONE, "ELF_K_NONE", "unknown elf kind"},
    {ELF_K_AR, "ELF_K_AR", "archive"},
    {ELF_K_COFF, "EL_K_COFF", "COFF object file"},
    {ELF_K_ELF, "ELF_K_ELF", "ELF file"}
};
static NUMDESC eh_types[] = {
    {ET_NONE, "ET_NONE", "No file type"},
    {ET_REL, "ET_REL", "Relocatable type"},
    {ET_EXEC, "ET_EXEC", "Executable type"},
    {ET_DYN, "ET_DYN", "Shared object file"},
    {ET_CORE, "ET_CORE", "Core file"}
};
static NUMDESC eh_machines[] = {
    {EM_NONE, "EM_NONE", "No machine"},
    {EM_M32, "EM_M32", "AT&T WE 32100"},
    {EM_SPARC, "EM_SPARC", "SPARC"},
    {EM_386, "EM_386", "Intel 80386"},
    {EM_68K, "EM_68K", "Motorola 68000"},
    {EM_88K, "EM_88K", "Motorola 88000"},
    {EM_860, "EM_860", "Intel 80860"}
};
static NUMDESC st_types[] = {
    {STT_NOTYPE, "STT_NOTYPE", "No symbol type"},
    {STT_OBJECT, "STT_OBJECT", "data object"},
    {STT_FUNC, "STT_FUNC", "function or other executable code"},
    {STT_SECTION, "STT_SECTION", "section"},
    {STT_FILE, "STT_FILE", "name of source file"}
};
static NUMDESC st_binds[] = {
    {STB_GLOBAL, "STB_GLOBAL", "global symbol"},
    {STB_LOCAL, "STB_LOCAL", "local symbol"},
    {STB_WEAK, "STB_WEAK", "weak symbol"},
};
static NUMDESC reloc_types[] = {
    {R_SPARC_8, "R_SPARC_8", "S+A"},
    {R_SPARC_16, "R_SPARC_16", "S+A"},
    {R_SPARC_32, "R_SPARC_32", "S+A"},
    {R_SPARC_DISP8, "R_SPARC_DISP8", "S+A-P"},
    {R_SPARC_DISP16, "R_SPARC_DISP16", "S+A-P"},
    {R_SPARC_DISP32, "R_SPARC_DISP32", "S+A-P"},
    {R_SPARC_WDISP30, "R_SPARC_WDISP30", "(S+A-P)>>2"},
    {R_SPARC_WDISP22, "R_SPARC_WDISP22", "(S+A-P)>>2"},
    {R_SPARC_HI22, "R_SPARC_HI22", "(S+A)>>10"},
    {R_SPARC_22, "R_SPARC_22", "S+A"},
    {R_SPARC_13, "R_SPARC_13", "S+A"},
    {R_SPARC_LO10, "R_SPARC_LO10", "(S+A) & 0x3ff"},
    {R_SPARC_GOT10, "R_SPARC_GOT10", "G & 0x3ff"},
    {R_SPARC_GOT13, "R_SPARC_GOT13", "G"},
    {R_SPARC_GOT22, "R_SPARC_GOT22", "G>>10"},
    {R_SPARC_PC10, "R_SPARC_PC10", "(S+A-P) & 0x3ff"},
    {R_SPARC_PC22, "R_SPARC_PC22", "(S+A-P)>>10"},
    {R_SPARC_WPLT30, "R_SPARC_WPLT30", "(L+A-P)>>2"},
    {R_SPARC_COPY, "R_SPARC_COPY", "None"},
    {R_SPARC_GLOB_DAT, "R_SPARC_GLOB_DAT", "S+A"},
    {R_SPARC_JMP_SLOT, "R_SPARC_JMP_SLOT", "?"},
    {R_SPARC_RELATIVE, "R_SPARC_RELATIVE", "B+A"},
    {R_SPARC_UA32, "R_SPARC_UA32", "S+A"}
};
#if 0
static BITDESC eh_flags[] = {
    {STYP_DSECT, "STYP_DSECT", "reserved"},
};
#endif

static NUMDESC *nd;
static NUMDESC *nd1, *nd2;
static void print_bitdesc();
static NUMDESC *which_numdesc();
static FILE *debugo;
#endif
#endif
