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.2 2006/12/25 02:22:22 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 "elf_queue.h"
338349Sgblack@eecs.umich.edu#include "libelf.h"
344484Sbinkertn@umich.edu
354484Sbinkertn@umich.edu#ifndef	NULL
364484Sbinkertn@umich.edu#define NULL 	((void *) 0)
374484Sbinkertn@umich.edu#endif
384484Sbinkertn@umich.edu
394484Sbinkertn@umich.edu/*
404484Sbinkertn@umich.edu * Library-private data structures.
414484Sbinkertn@umich.edu */
424484Sbinkertn@umich.edu
434484Sbinkertn@umich.edu#define LIBELF_MSG_SIZE	256
444484Sbinkertn@umich.edu
454484Sbinkertn@umich.edustruct _libelf_globals {
464484Sbinkertn@umich.edu        int		libelf_arch;
474484Sbinkertn@umich.edu        unsigned int	libelf_byteorder;
484484Sbinkertn@umich.edu        int		libelf_class;
494484Sbinkertn@umich.edu        int		libelf_error;
504484Sbinkertn@umich.edu        int		libelf_fillchar;
514484Sbinkertn@umich.edu        unsigned int	libelf_version;
524484Sbinkertn@umich.edu        char		libelf_msg[LIBELF_MSG_SIZE];
534484Sbinkertn@umich.edu};
544484Sbinkertn@umich.edu
554484Sbinkertn@umich.edustruct _libelf_globals *_libelf_private();
564484Sbinkertn@umich.edu
574484Sbinkertn@umich.edu#define	LIBELF_PRIVATE(N)	(_libelf_private()->libelf_##N)
584484Sbinkertn@umich.edu
594484Sbinkertn@umich.edu#define	LIBELF_ELF_ERROR_MASK	0xFF
604484Sbinkertn@umich.edu#define	LIBELF_OS_ERROR_SHIFT	8
614484Sbinkertn@umich.edu
624484Sbinkertn@umich.edu#define	LIBELF_SET_ERROR(E, O) do {					\
634484Sbinkertn@umich.edu        LIBELF_PRIVATE(error) = ((ELF_E_##E & LIBELF_ELF_ERROR_MASK)|	\
644484Sbinkertn@umich.edu            ((O) << LIBELF_OS_ERROR_SHIFT));				\
654484Sbinkertn@umich.edu        } while (0)
664484Sbinkertn@umich.edu
674484Sbinkertn@umich.edu#define	LIBELF_ADJUST_AR_SIZE(S)	(((S) + 1U) & ~1U)
684484Sbinkertn@umich.edu
694484Sbinkertn@umich.edu/*
704484Sbinkertn@umich.edu * Flags for library internal use.  These use the upper 16 bits of a
714484Sbinkertn@umich.edu * flags field.
724484Sbinkertn@umich.edu */
734484Sbinkertn@umich.edu#define	LIBELF_F_MALLOCED	0x010000 /* whether data was malloc'ed */
744484Sbinkertn@umich.edu#define	LIBELF_F_MMAP		0x020000 /* whether e_rawfile was mmap'ed */
754484Sbinkertn@umich.edu#define	LIBELF_F_SHDRS_LOADED	0x040000 /* whether all shdrs were read in */
764484Sbinkertn@umich.edu
774484Sbinkertn@umich.edustruct _Elf {
784484Sbinkertn@umich.edu        int		e_activations;	/* activation count */
794484Sbinkertn@umich.edu        Elf_Arhdr	*e_arhdr;	/* header for archive members */
804484Sbinkertn@umich.edu        unsigned int	e_byteorder;	/* ELFDATA* */
814484Sbinkertn@umich.edu        int		e_class;	/* ELFCLASS*  */
824484Sbinkertn@umich.edu        Elf_Cmd		e_cmd;		/* ELF_C_* used at creation time */
834484Sbinkertn@umich.edu        int		e_fd;		/* associated file descriptor */
844484Sbinkertn@umich.edu        unsigned int	e_flags;	/* ELF_F_*, LIBELF_F_* flags */
854484Sbinkertn@umich.edu        Elf_Kind	e_kind;		/* ELF_K_* */
864484Sbinkertn@umich.edu        Elf		*e_parent; 	/* non-NULL for archive members */
874484Sbinkertn@umich.edu        char	 	*e_rawfile;	/* uninterpreted bytes */
884484Sbinkertn@umich.edu        size_t		e_rawsize;	/* size of uninterpreted bytes */
894484Sbinkertn@umich.edu        unsigned int	e_version;	/* file version */
904484Sbinkertn@umich.edu
914484Sbinkertn@umich.edu        union {
924484Sbinkertn@umich.edu                struct {		/* ar(1) archives */
934484Sbinkertn@umich.edu                        off_t	e_next;	/* set by elf_rand()/elf_next() */
944484Sbinkertn@umich.edu                        int	e_nchildren;
954484Sbinkertn@umich.edu                        char	*e_rawstrtab;	/* file name strings */
964484Sbinkertn@umich.edu                        size_t	e_rawstrtabsz;
974484Sbinkertn@umich.edu                        char	*e_rawsymtab;	/* symbol table */
984484Sbinkertn@umich.edu                        size_t	e_rawsymtabsz;
994484Sbinkertn@umich.edu                        Elf_Arsym *e_symtab;
1004484Sbinkertn@umich.edu                        size_t	e_symtabsz;
1014484Sbinkertn@umich.edu                } e_ar;
1024484Sbinkertn@umich.edu                struct {		/* regular ELF files */
1034484Sbinkertn@umich.edu                        union {
1044484Sbinkertn@umich.edu                                Elf32_Ehdr *e_ehdr32;
1054484Sbinkertn@umich.edu                                Elf64_Ehdr *e_ehdr64;
1064484Sbinkertn@umich.edu                        } e_ehdr;
1074484Sbinkertn@umich.edu                        union {
1084484Sbinkertn@umich.edu                                Elf32_Phdr *e_phdr32;
1094484Sbinkertn@umich.edu                                Elf64_Phdr *e_phdr64;
1104484Sbinkertn@umich.edu                        } e_phdr;
1114484Sbinkertn@umich.edu                        STAILQ_HEAD(, _Elf_Scn)	e_scn;	/* section list */
1124484Sbinkertn@umich.edu                        size_t	e_nphdr;	/* number of Phdr entries */
1134484Sbinkertn@umich.edu                        size_t	e_nscn;		/* number of sections */
1144484Sbinkertn@umich.edu                        size_t	e_strndx;	/* string table section index */
1154484Sbinkertn@umich.edu                } e_elf;
1164484Sbinkertn@umich.edu        } e_u;
1174484Sbinkertn@umich.edu};
1184484Sbinkertn@umich.edu
1194484Sbinkertn@umich.edustruct _Elf_Scn {
1204484Sbinkertn@umich.edu        union {
1214484Sbinkertn@umich.edu                Elf32_Shdr	s_shdr32;
1224484Sbinkertn@umich.edu                Elf64_Shdr	s_shdr64;
1234484Sbinkertn@umich.edu        } s_shdr;
1244484Sbinkertn@umich.edu        STAILQ_HEAD(, _Elf_Data) s_data;	/* list of Elf_Data descriptors */
1254484Sbinkertn@umich.edu        STAILQ_HEAD(, _Elf_Data) s_rawdata;	/* raw data for this section */
1264484Sbinkertn@umich.edu        STAILQ_ENTRY(_Elf_Scn) s_next;
1274484Sbinkertn@umich.edu        struct _Elf	*s_elf;		/* parent ELF descriptor */
1284484Sbinkertn@umich.edu        unsigned int	s_flags;	/* flags for the section as a whole */
1294484Sbinkertn@umich.edu        size_t		s_ndx;		/* index# for this section */
1304484Sbinkertn@umich.edu        uint64_t	s_offset;	/* managed by elf_update() */
1314484Sbinkertn@umich.edu        uint64_t	s_rawoff;	/* original offset in the file */
1324484Sbinkertn@umich.edu        uint64_t	s_size;		/* managed by elf_update() */
1334484Sbinkertn@umich.edu};
1344484Sbinkertn@umich.edu
1354484Sbinkertn@umich.edu
1364484Sbinkertn@umich.eduenum {
1374484Sbinkertn@umich.edu        ELF_TOFILE,
1384484Sbinkertn@umich.edu        ELF_TOMEMORY
1394484Sbinkertn@umich.edu};
1404484Sbinkertn@umich.edu
1414484Sbinkertn@umich.edu#define	LIBELF_COPY_U32(DST,SRC,NAME)	do {		\
1424484Sbinkertn@umich.edu                if ((SRC)->NAME > UINT_MAX) {		\
1434484Sbinkertn@umich.edu                        LIBELF_SET_ERROR(RANGE, 0);	\
1444484Sbinkertn@umich.edu                        return (0);			\
1454484Sbinkertn@umich.edu                }					\
1464484Sbinkertn@umich.edu                (DST)->NAME = (SRC)->NAME;		\
1474484Sbinkertn@umich.edu        } while (0)
1484484Sbinkertn@umich.edu
1494484Sbinkertn@umich.edu#define	LIBELF_COPY_S32(DST,SRC,NAME)	do {		\
1504484Sbinkertn@umich.edu                if ((SRC)->NAME > INT_MAX ||		\
1514484Sbinkertn@umich.edu                    (SRC)->NAME < INT_MIN) {		\
1524484Sbinkertn@umich.edu                        LIBELF_SET_ERROR(RANGE, 0);	\
1534484Sbinkertn@umich.edu                        return (0);			\
1544484Sbinkertn@umich.edu                }					\
1554484Sbinkertn@umich.edu                (DST)->NAME = (SRC)->NAME;		\
1564484Sbinkertn@umich.edu        } while (0)
1574484Sbinkertn@umich.edu
1584484Sbinkertn@umich.edu
1594484Sbinkertn@umich.edu/*
1604484Sbinkertn@umich.edu * Prototypes
1614484Sbinkertn@umich.edu */
1624484Sbinkertn@umich.edu
1634484Sbinkertn@umich.eduElf_Data *_libelf_allocate_data(Elf_Scn *_s);
1644484Sbinkertn@umich.eduElf	*_libelf_allocate_elf(void);
1654484Sbinkertn@umich.eduElf_Scn	*_libelf_allocate_scn(Elf *_e, size_t _ndx);
1664484Sbinkertn@umich.eduElf_Arhdr *_libelf_ar_gethdr(Elf *_e);
1674484Sbinkertn@umich.eduElf	*_libelf_ar_open(Elf *_e);
1684484Sbinkertn@umich.eduElf	*_libelf_ar_open_member(int _fd, Elf_Cmd _c, Elf *_ar);
1694484Sbinkertn@umich.eduElf_Arsym *_libelf_ar_process_symtab(Elf *_ar, size_t *_dst);
1704484Sbinkertn@umich.eduunsigned long _libelf_checksum(Elf *_e, int _elfclass);
1714484Sbinkertn@umich.eduvoid	*_libelf_ehdr(Elf *_e, int _elfclass, int _allocate);
1724484Sbinkertn@umich.eduint	_libelf_falign(Elf_Type _t, int _elfclass);
1734484Sbinkertn@umich.edusize_t	_libelf_fsize(Elf_Type _t, int _elfclass, unsigned int _version,
1744484Sbinkertn@umich.edu    size_t count);
1754484Sbinkertn@umich.eduvoid	(*_libelf_get_translator(Elf_Type _t, int _direction, int _elfclass))
1764484Sbinkertn@umich.edu            (char *_dst, char *_src, size_t _cnt, int _byteswap);
1774484Sbinkertn@umich.eduvoid	*_libelf_getphdr(Elf *_e, int _elfclass);
1784484Sbinkertn@umich.eduvoid	*_libelf_getshdr(Elf_Scn *_scn, int _elfclass);
1794484Sbinkertn@umich.eduvoid	_libelf_init_elf(Elf *_e, Elf_Kind _kind);
1804484Sbinkertn@umich.eduint	_libelf_malign(Elf_Type _t, int _elfclass);
1814484Sbinkertn@umich.edusize_t	_libelf_msize(Elf_Type _t, int _elfclass, unsigned int _version);
1824484Sbinkertn@umich.eduvoid	*_libelf_newphdr(Elf *_e, int _elfclass, size_t _count);
1834484Sbinkertn@umich.eduElf_Data *_libelf_release_data(Elf_Data *_d);
1844484Sbinkertn@umich.eduElf	*_libelf_release_elf(Elf *_e);
1854484Sbinkertn@umich.eduElf_Scn	*_libelf_release_scn(Elf_Scn *_s);
1864484Sbinkertn@umich.eduint	_libelf_setphnum(Elf *_e, void *_eh, int _elfclass, size_t _phnum);
1874484Sbinkertn@umich.eduint	_libelf_setshnum(Elf *_e, void *_eh, int _elfclass, size_t _shnum);
1884484Sbinkertn@umich.eduint	_libelf_setshstrndx(Elf *_e, void *_eh, int _elfclass,
1894484Sbinkertn@umich.edu    size_t _shstrndx);
1904484Sbinkertn@umich.eduElf_Data *_libelf_xlate(Elf_Data *_d, const Elf_Data *_s,
1914484Sbinkertn@umich.edu    unsigned int _encoding, int _elfclass, int _direction);
1924484Sbinkertn@umich.eduint	_libelf_xlate_shtype(uint32_t _sht);
1934484Sbinkertn@umich.edu
1944484Sbinkertn@umich.edu#endif	/* __LIBELF_H_ */
195