14484Sbinkertn@umich.edu/*-
24484Sbinkertn@umich.edu * Copyright (c) 2006 Joseph Koshy
34484Sbinkertn@umich.edu * All rights reserved.
44484Sbinkertn@umich.edu *
54484Sbinkertn@umich.edu * Redistribution and use in source and binary forms, with or without
64484Sbinkertn@umich.edu * modification, are permitted provided that the following conditions
74484Sbinkertn@umich.edu * are met:
84484Sbinkertn@umich.edu * 1. Redistributions of source code must retain the above copyright
94484Sbinkertn@umich.edu *    notice, this list of conditions and the following disclaimer.
104484Sbinkertn@umich.edu * 2. Redistributions in binary form must reproduce the above copyright
114484Sbinkertn@umich.edu *    notice, this list of conditions and the following disclaimer in the
124484Sbinkertn@umich.edu *    documentation and/or other materials provided with the distribution.
134484Sbinkertn@umich.edu *
144484Sbinkertn@umich.edu * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
154484Sbinkertn@umich.edu * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
164484Sbinkertn@umich.edu * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
174484Sbinkertn@umich.edu * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
184484Sbinkertn@umich.edu * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
194484Sbinkertn@umich.edu * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
204484Sbinkertn@umich.edu * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
214484Sbinkertn@umich.edu * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
224484Sbinkertn@umich.edu * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
234484Sbinkertn@umich.edu * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
244484Sbinkertn@umich.edu * SUCH DAMAGE.
254484Sbinkertn@umich.edu *
264484Sbinkertn@umich.edu * $FreeBSD: src/lib/libelf/libelf.h,v 1.1 2006/11/11 17:16:33 jkoshy Exp $
274484Sbinkertn@umich.edu */
284484Sbinkertn@umich.edu
294484Sbinkertn@umich.edu#ifndef	_LIBELF_H_
304484Sbinkertn@umich.edu#define	_LIBELF_H_
314484Sbinkertn@umich.edu
324484Sbinkertn@umich.edu#include <sys/types.h>
334484Sbinkertn@umich.edu
344484Sbinkertn@umich.edu#ifdef __cplusplus
354484Sbinkertn@umich.eduextern "C" {
364484Sbinkertn@umich.edu#endif
374484Sbinkertn@umich.edu
384484Sbinkertn@umich.edu#include "elf_queue.h"
394484Sbinkertn@umich.edu#include "elf32.h"
404484Sbinkertn@umich.edu#include "elf64.h"
414484Sbinkertn@umich.edu
424484Sbinkertn@umich.edu/* Library private data structures */
434484Sbinkertn@umich.edutypedef struct _Elf Elf;
444484Sbinkertn@umich.edutypedef struct _Elf_Scn Elf_Scn;
454484Sbinkertn@umich.edu
464484Sbinkertn@umich.edu/* File types */
474484Sbinkertn@umich.edutypedef enum {
484484Sbinkertn@umich.edu        ELF_K_NONE = 0,
494484Sbinkertn@umich.edu        ELF_K_AR,	/* `ar' archives */
504484Sbinkertn@umich.edu        ELF_K_COFF,	/* COFF files (unsupported) */
514484Sbinkertn@umich.edu        ELF_K_ELF,	/* ELF files */
524484Sbinkertn@umich.edu        ELF_K_NUM
534484Sbinkertn@umich.edu} Elf_Kind;
544484Sbinkertn@umich.edu
554484Sbinkertn@umich.edu#define	ELF_K_FIRST	ELF_K_NONE
564484Sbinkertn@umich.edu#define	ELF_K_LAST	ELF_K_NUM
574484Sbinkertn@umich.edu
584484Sbinkertn@umich.edu/* Data types */
594484Sbinkertn@umich.edutypedef enum {
604484Sbinkertn@umich.edu        ELF_T_ADDR,
614484Sbinkertn@umich.edu        ELF_T_BYTE,
624484Sbinkertn@umich.edu        ELF_T_CAP,
634484Sbinkertn@umich.edu        ELF_T_DYN,
644484Sbinkertn@umich.edu        ELF_T_EHDR,
654484Sbinkertn@umich.edu        ELF_T_HALF,
664484Sbinkertn@umich.edu        ELF_T_LWORD,
674484Sbinkertn@umich.edu        ELF_T_MOVE,
684484Sbinkertn@umich.edu        ELF_T_MOVEP,
694484Sbinkertn@umich.edu        ELF_T_NOTE,
704484Sbinkertn@umich.edu        ELF_T_OFF,
714484Sbinkertn@umich.edu        ELF_T_PHDR,
724484Sbinkertn@umich.edu        ELF_T_REL,
734484Sbinkertn@umich.edu        ELF_T_RELA,
744484Sbinkertn@umich.edu        ELF_T_SHDR,
754484Sbinkertn@umich.edu        ELF_T_SWORD,
764484Sbinkertn@umich.edu        ELF_T_SXWORD,
774484Sbinkertn@umich.edu        ELF_T_SYMINFO,
784484Sbinkertn@umich.edu        ELF_T_SYM,
794484Sbinkertn@umich.edu        ELF_T_VDEF,
804484Sbinkertn@umich.edu        ELF_T_VNEED,
814484Sbinkertn@umich.edu        ELF_T_WORD,
824484Sbinkertn@umich.edu        ELF_T_XWORD,
834484Sbinkertn@umich.edu        ELF_T_NUM
844484Sbinkertn@umich.edu} Elf_Type;
854484Sbinkertn@umich.edu
864484Sbinkertn@umich.edu#define	ELF_T_FIRST	ELF_T_ADDR
874484Sbinkertn@umich.edu#define	ELF_T_LAST	ELF_T_XWORD
884484Sbinkertn@umich.edu
894484Sbinkertn@umich.edu/* Commands */
904484Sbinkertn@umich.edutypedef enum {
914484Sbinkertn@umich.edu        ELF_C_NULL = 0,
924484Sbinkertn@umich.edu        ELF_C_CLR,
934484Sbinkertn@umich.edu        ELF_C_FDDONE,
944484Sbinkertn@umich.edu        ELF_C_FDREAD,
954484Sbinkertn@umich.edu        ELF_C_RDWR,
964484Sbinkertn@umich.edu        ELF_C_READ,
974484Sbinkertn@umich.edu        ELF_C_SET,
984484Sbinkertn@umich.edu        ELF_C_WRITE,
994484Sbinkertn@umich.edu        ELF_C_NUM
1004484Sbinkertn@umich.edu} Elf_Cmd;
1014484Sbinkertn@umich.edu
1024484Sbinkertn@umich.edu#define	ELF_C_FIRST	ELF_C_NULL
1034484Sbinkertn@umich.edu#define	ELF_C_LAST	ELF_C_NUM
1044484Sbinkertn@umich.edu
1054484Sbinkertn@umich.edu/*
1064484Sbinkertn@umich.edu * An `Elf_Data' structure describes data in an
1074484Sbinkertn@umich.edu * ELF section.
1084484Sbinkertn@umich.edu */
1094484Sbinkertn@umich.edutypedef struct _Elf_Data {
1104484Sbinkertn@umich.edu        /*
1114484Sbinkertn@umich.edu         * `Public' members that are part of the ELF(3) API.
1124484Sbinkertn@umich.edu         */
1134484Sbinkertn@umich.edu        uint64_t	d_align;
1144484Sbinkertn@umich.edu        void		*d_buf;
1154484Sbinkertn@umich.edu        uint64_t	d_off;
1164484Sbinkertn@umich.edu        uint64_t	d_size;
1174484Sbinkertn@umich.edu        Elf_Type	d_type;
1184484Sbinkertn@umich.edu        unsigned int	d_version;
1194484Sbinkertn@umich.edu
1204484Sbinkertn@umich.edu        /*
1214484Sbinkertn@umich.edu         * Members that are not part of the public API.
1224484Sbinkertn@umich.edu         */
1234484Sbinkertn@umich.edu        Elf_Scn		*d_scn;		/* containing section */
1244484Sbinkertn@umich.edu        unsigned int	d_flags;
1254484Sbinkertn@umich.edu        STAILQ_ENTRY(_Elf_Data)	d_next;
1264484Sbinkertn@umich.edu} Elf_Data;
1274484Sbinkertn@umich.edu
1284484Sbinkertn@umich.edu/*
1294484Sbinkertn@umich.edu * An `Elf_Arhdr' structure describes an archive
1304484Sbinkertn@umich.edu * header.
1314484Sbinkertn@umich.edu */
1324484Sbinkertn@umich.edutypedef struct {
1334484Sbinkertn@umich.edu        time_t		ar_date;
1344484Sbinkertn@umich.edu        char		*ar_name;	/* archive member name */
1354484Sbinkertn@umich.edu        gid_t		ar_gid;
1364484Sbinkertn@umich.edu        mode_t		ar_mode;
1374484Sbinkertn@umich.edu        char		*ar_rawname;	/* 'raw' member name */
1384484Sbinkertn@umich.edu        size_t		ar_size;
1394484Sbinkertn@umich.edu        uid_t		ar_uid;
1404484Sbinkertn@umich.edu} Elf_Arhdr;
1414484Sbinkertn@umich.edu
1424484Sbinkertn@umich.edu/*
1434484Sbinkertn@umich.edu * An `Elf_Arsym' describes an entry in the archive
1444484Sbinkertn@umich.edu * symbol table.
1454484Sbinkertn@umich.edu */
1464484Sbinkertn@umich.edutypedef struct {
1474484Sbinkertn@umich.edu        off_t		as_off;		/* byte offset to member's header */
1484484Sbinkertn@umich.edu        unsigned long	as_hash;	/* elf_hash() value for name */
1494484Sbinkertn@umich.edu        char		*as_name; 	/* null terminated symbol name */
1504484Sbinkertn@umich.edu} Elf_Arsym;
1514484Sbinkertn@umich.edu
1524484Sbinkertn@umich.edu/*
1534484Sbinkertn@umich.edu * Error numbers.
1544484Sbinkertn@umich.edu */
1554484Sbinkertn@umich.edu
1564484Sbinkertn@umich.eduenum Elf_Error {
1574484Sbinkertn@umich.edu        ELF_E_NONE,	/* No error */
1584484Sbinkertn@umich.edu        ELF_E_ARCHIVE,	/* Malformed ar(1) archive */
1594484Sbinkertn@umich.edu        ELF_E_ARGUMENT,	/* Invalid argument */
1604484Sbinkertn@umich.edu        ELF_E_CLASS,	/* Mismatched ELF class */
1614484Sbinkertn@umich.edu        ELF_E_DATA,	/* Invalid data descriptor */
1624484Sbinkertn@umich.edu        ELF_E_HEADER,	/* Missing or malformed ELF header */
1634484Sbinkertn@umich.edu        ELF_E_IO,	/* I/O error */
1644484Sbinkertn@umich.edu        ELF_E_LAYOUT,	/* Layout constraint violation */
1654484Sbinkertn@umich.edu        ELF_E_MODE,	/* Wrong mode for ELF descriptor */
1664484Sbinkertn@umich.edu        ELF_E_RANGE,	/* Value out of range */
1674484Sbinkertn@umich.edu        ELF_E_RESOURCE,	/* Resource exhaustion */
1684484Sbinkertn@umich.edu        ELF_E_SECTION,	/* Invalid section descriptor */
1694484Sbinkertn@umich.edu        ELF_E_SEQUENCE,	/* API calls out of sequence */
1704484Sbinkertn@umich.edu        ELF_E_UNIMPL,	/* Feature is unimplemented */
1714484Sbinkertn@umich.edu        ELF_E_VERSION,	/* Unknown API version */
1724484Sbinkertn@umich.edu        ELF_E_NUM	/* Max error number */
1734484Sbinkertn@umich.edu};
1744484Sbinkertn@umich.edu
1754484Sbinkertn@umich.edu/*
1764484Sbinkertn@umich.edu * Flags defined by the API.
1774484Sbinkertn@umich.edu */
1784484Sbinkertn@umich.edu
1794484Sbinkertn@umich.edu#define	ELF_F_LAYOUT	0x001U	/* application will layout the file */
1804484Sbinkertn@umich.edu#define	ELF_F_DIRTY	0x002U	/* a section or ELF file is dirty */
1814484Sbinkertn@umich.edu
1824484Sbinkertn@umich.eduElf		*elf_begin(int _fd, Elf_Cmd _cmd, Elf *_elf);
1834484Sbinkertn@umich.eduint		elf_cntl(Elf *_elf, Elf_Cmd _cmd);
1844484Sbinkertn@umich.eduint		elf_end(Elf *_elf);
1854484Sbinkertn@umich.educonst char	*elf_errmsg(int _error);
1864484Sbinkertn@umich.eduint		elf_errno(void);
1874484Sbinkertn@umich.eduvoid		elf_fill(int _fill);
1884484Sbinkertn@umich.eduunsigned int	elf_flagdata(Elf_Data *_data, Elf_Cmd _cmd, unsigned int _flags);
1894484Sbinkertn@umich.eduunsigned int	elf_flagehdr(Elf *_elf, Elf_Cmd _cmd, unsigned int _flags);
1904484Sbinkertn@umich.eduunsigned int	elf_flagelf(Elf *_elf, Elf_Cmd _cmd, unsigned int _flags);
1914484Sbinkertn@umich.eduunsigned int	elf_flagphdr(Elf *_elf, Elf_Cmd _cmd, unsigned int _flags);
1924484Sbinkertn@umich.eduunsigned int	elf_flagscn(Elf_Scn *_scn, Elf_Cmd _cmd, unsigned int _flags);
1934484Sbinkertn@umich.eduunsigned int	elf_flagshdr(Elf_Scn *_scn, Elf_Cmd _cmd, unsigned int _flags);
1944484Sbinkertn@umich.eduElf_Arhdr	*elf_getarhdr(Elf *_elf);
1954484Sbinkertn@umich.eduElf_Arsym	*elf_getarsym(Elf *_elf, size_t *_ptr);
1964484Sbinkertn@umich.eduoff_t		elf_getbase(Elf *_elf);
1974484Sbinkertn@umich.eduElf_Data	*elf_getdata(Elf_Scn *, Elf_Data *);
1984484Sbinkertn@umich.educhar		*elf_getident(Elf *_elf, size_t *_ptr);
1994484Sbinkertn@umich.eduint		elf_getphnum(Elf *_elf, size_t *_dst);
2004484Sbinkertn@umich.eduElf_Scn		*elf_getscn(Elf *_elf, size_t _index);
2014484Sbinkertn@umich.eduint		elf_getshnum(Elf *_elf, size_t *_dst);
2024484Sbinkertn@umich.eduint		elf_getshstrndx(Elf *_elf, size_t *_dst);
2034484Sbinkertn@umich.eduunsigned long	elf_hash(const char *_name);
2044484Sbinkertn@umich.eduElf_Kind	elf_kind(Elf *_elf);
2054484Sbinkertn@umich.eduElf		*elf_memory(char *_image, size_t _size);
2064484Sbinkertn@umich.edusize_t		elf_ndxscn(Elf_Scn *_scn);
2074484Sbinkertn@umich.eduElf_Data	*elf_newdata(Elf_Scn *_scn);
2084484Sbinkertn@umich.eduElf_Scn		*elf_newscn(Elf *_elf);
2094484Sbinkertn@umich.eduElf_Scn		*elf_nextscn(Elf *_elf, Elf_Scn *_scn);
2104484Sbinkertn@umich.eduElf_Cmd		elf_next(Elf *_elf);
2114484Sbinkertn@umich.eduoff_t		elf_rand(Elf *_elf, off_t _off);
2124484Sbinkertn@umich.eduElf_Data	*elf_rawdata(Elf_Scn *_scn, Elf_Data *_data);
2134484Sbinkertn@umich.educhar		*elf_rawfile(Elf *_elf, size_t *_size);
2144484Sbinkertn@umich.eduint		elf_setshstrndx(Elf *_elf, size_t _shnum);
2154484Sbinkertn@umich.educhar		*elf_strptr(Elf *_elf, size_t _section, size_t _offset);
2164484Sbinkertn@umich.eduoff_t		elf_update(Elf *_elf, Elf_Cmd _cmd);
2174484Sbinkertn@umich.eduunsigned int	elf_version(unsigned int _version);
2184484Sbinkertn@umich.edu
2194484Sbinkertn@umich.edulong		elf32_checksum(Elf *_elf);
2204484Sbinkertn@umich.edusize_t		elf32_fsize(Elf_Type _type, size_t _count,
2214484Sbinkertn@umich.edu                        unsigned int _version);
2224484Sbinkertn@umich.eduElf32_Ehdr	*elf32_getehdr(Elf *_elf);
2234484Sbinkertn@umich.eduElf32_Phdr	*elf32_getphdr(Elf *_elf);
2244484Sbinkertn@umich.eduElf32_Shdr	*elf32_getshdr(Elf_Scn *_scn);
2254484Sbinkertn@umich.eduElf32_Ehdr	*elf32_newehdr(Elf *_elf);
2264484Sbinkertn@umich.eduElf32_Phdr	*elf32_newphdr(Elf *_elf, size_t _count);
2274484Sbinkertn@umich.eduElf_Data	*elf32_xlatetof(Elf_Data *_dst, const Elf_Data *_src,
2284484Sbinkertn@umich.edu                        unsigned int _enc);
2294484Sbinkertn@umich.eduElf_Data	*elf32_xlatetom(Elf_Data *_dst, const Elf_Data *_src,
2304484Sbinkertn@umich.edu                        unsigned int _enc);
2314484Sbinkertn@umich.edu
2324484Sbinkertn@umich.edulong		elf64_checksum(Elf *_elf);
2334484Sbinkertn@umich.edusize_t		elf64_fsize(Elf_Type _type, size_t _count,
2344484Sbinkertn@umich.edu                        unsigned int _version);
2354484Sbinkertn@umich.eduElf64_Ehdr	*elf64_getehdr(Elf *_elf);
2364484Sbinkertn@umich.eduElf64_Phdr	*elf64_getphdr(Elf *_elf);
2374484Sbinkertn@umich.eduElf64_Shdr	*elf64_getshdr(Elf_Scn *_scn);
2384484Sbinkertn@umich.eduElf64_Ehdr	*elf64_newehdr(Elf *_elf);
2394484Sbinkertn@umich.eduElf64_Phdr	*elf64_newphdr(Elf *_elf, size_t _count);
2404484Sbinkertn@umich.eduElf_Data	*elf64_xlatetof(Elf_Data *_dst, const Elf_Data *_src,
2414484Sbinkertn@umich.edu                        unsigned int _enc);
2424484Sbinkertn@umich.eduElf_Data	*elf64_xlatetom(Elf_Data *_dst, const Elf_Data *_src,
2434484Sbinkertn@umich.edu                        unsigned int _enc);
2444484Sbinkertn@umich.edu
2454484Sbinkertn@umich.edu#ifdef __cplusplus
2464484Sbinkertn@umich.edu}
2474484Sbinkertn@umich.edu#endif
2484484Sbinkertn@umich.edu
2494484Sbinkertn@umich.edu#endif	/* _LIBELF_H_ */
250