/*
* Copyright (c) 2002 Peter Edwards
*
* 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 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 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.
*
* $FreeBSD$
* $Id: elfinfo.h,v 1.2 2002/11/25 12:56:34 pmedwards Exp $
*/
/*
* elfinfo.h
* Utility interface for accessing ELF images.
*/
#ifndef elfinfo_h_guard
#define elfinfo_h_guard
struct ElfObject {
struct ElfObject *next;
Elf_Addr baseAddr; /* For loaded objects */
char *fileName;
size_t fileSize;
const char *fileData;
const Elf_Ehdr *elfHeader;
const Elf_Phdr **programHeaders;
const Elf_Shdr **sectionHeaders;
const Elf_Phdr *dynamic;
const char *sectionStrings;
const char *interpreterName;
const struct stab *stabs;
const char *stabStrings;
int stabCount;
};
struct stab {
unsigned long n_strx;
unsigned char n_type;
unsigned char n_other;
unsigned short n_desc;
unsigned long n_value;
};
enum StabType {
N_UNDF = 0x0,
N_ABS = 0x2,
N_ABS_EXT = 0x3,
N_TEXT = 0x4,
N_TEXT_EXT = 0x5,
N_DATA = 0x6,
N_DATA_EXT = 0x7,
N_BSS = 0x8,
N_BSS_EXT = 0x9,
N_FN_SEQ = 0x0c,
N_INDR = 0x0a,
N_COMM = 0x12,
N_SETA = 0x14,
N_SETA_EXT = 0x15,
N_SETT = 0x16,
N_SETT_EXT = 0x17,
N_SETD = 0x18,
N_SETD_EXT = 0x19,
N_SETB = 0x1a,
N_SETB_EXT = 0x1b,
N_SETV = 0x1c,
N_SETV_EXT = 0x1d,
N_WARNING = 0x1e,
N_FN = 0x1f,
N_GSYM = 0x20,
N_FNAME = 0x22,
N_FUN = 0x24,
N_STSYM = 0x26,
N_LCSYM = 0x28,
N_MAIN = 0x2a,
n_ROSYM = 0x2c,
N_PC = 0x30,
N_NSYMS = 0x32,
N_NOMAP = 0x34,
N_OBJ = 0x38,
N_OPT = 0x3c,
N_RSYM = 0x40,
N_M2C = 0x42,
N_SLINE = 0x44,
N_DSLINE = 0x46,
N_BSLINE = 0x48,
N_DEFD = 0x4a,
N_FLINE = 0x4c,
N_EHDECL = 0x50,
N_CATCH = 0x54,
N_SSYM = 0x60,
N_ENDM = 0x62,
N_SO = 0x64,
N_LSYM = 0x80,
N_BINCL = 0x82,
N_SOL = 0x84,
N_PSYM = 0xa0,
N_EINCL = 0xa2,
N_ENTRY = 0xa4,
N_LBRAC = 0xc0,
N_EXCL = 0xc2,
N_SCOPE = 0xc4,
N_RBRAC = 0xe0,
N_BCOMM = 0xe2,
N_ECOMM = 0xe4,
N_ECOML = 0xe8,
N_WITH = 0xea,
N_NBTEXT = 0xf0,
N_NBDATA = 0xf2,
N_NBBSS = 0xf4,
N_NBSTS = 0xf6,
N_NBLCS = 0xf8
};
int elfFindSectionByName(struct ElfObject *obj,
const char *name, const Elf_Shdr **sectionp);
int elfFindSymbolByAddress(struct ElfObject *obj,
Elf_Addr addr, int type,
const Elf_Sym **symp, const char **namep);
int elfLinearSymSearch(struct ElfObject *o,
const Elf_Shdr *hdr,
const char *name, const Elf_Sym **symp);
int elfFindSymbolByName(struct ElfObject *o,
const char *name, const Elf_Sym **symp);
int elfLoadObject(const char *fileName, struct ElfObject **objp);
int elfGetNote(struct ElfObject *obj, const char *name,
u_int32_t type, const void **datap, int *lenp);
int elfGetImageFromCore(struct ElfObject *obj, const char **name);
int elfUnloadObject(struct ElfObject *obj);
const char *elfGetAbiPrefix(struct ElfObject *o);
void elfDumpSymbol(FILE *f, const Elf_Sym *sym,
const char *strings, int indent);
void elfDumpDynamic(FILE *f, const Elf_Dyn *dyn, int indent);
void elfDumpObject(FILE *f, struct ElfObject *obj, int snap, int indent);
void elfDumpSection(FILE * f, struct ElfObject * obj,
const Elf_Shdr * hdr, int snap, int indent);
void elfDumpProgramSegment(FILE *f, struct ElfObject *obj,
const Elf_Phdr *hdr, int indent);
void hexdump(FILE *f, int indent, const char *p, int len);
const char * pad(int size);
#endif /* Guard. */
syntax highlighted by Code2HTML, v. 0.9.1