⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 libelf.h

📁 xen 3.2.2 源码
💻 H
字号:
#ifndef __XC_LIBELF__#define __XC_LIBELF__ 1#if defined(__i386__) || defined(__x86_64) || defined(__ia64__)#define XEN_ELF_LITTLE_ENDIAN#elif defined(__powerpc__)#define XEN_ELF_BIG_ENDIAN#else#error define architectural endianness#endif#undef ELFSIZE#include "elfnote.h"#include "elfstructs.h"#include "features.h"/* ------------------------------------------------------------------------ */typedef union {    Elf32_Ehdr e32;    Elf64_Ehdr e64;} elf_ehdr;typedef union {    Elf32_Phdr e32;    Elf64_Phdr e64;} elf_phdr;typedef union {    Elf32_Shdr e32;    Elf64_Shdr e64;} elf_shdr;typedef union {    Elf32_Sym e32;    Elf64_Sym e64;} elf_sym;typedef union {    Elf32_Rel e32;    Elf64_Rel e64;} elf_rel;typedef union {    Elf32_Rela e32;    Elf64_Rela e64;} elf_rela;typedef union {    Elf32_Note e32;    Elf64_Note e64;} elf_note;struct elf_binary {    /* elf binary */    const char *image;    size_t size;    char class;    char data;    const elf_ehdr *ehdr;    const char *sec_strtab;    const elf_shdr *sym_tab;    const char *sym_strtab;    /* loaded to */    char *dest;    uint64_t pstart;    uint64_t pend;    uint64_t reloc_offset;    uint64_t bsd_symtab_pstart;    uint64_t bsd_symtab_pend;#ifndef __XEN__    /* misc */    FILE *log;#endif    int verbose;};/* ------------------------------------------------------------------------ *//* accessing elf header fields                                              */#ifdef XEN_ELF_BIG_ENDIAN# define NATIVE_ELFDATA ELFDATA2MSB#else# define NATIVE_ELFDATA ELFDATA2LSB#endif#define elf_32bit(elf) (ELFCLASS32 == (elf)->class)#define elf_64bit(elf) (ELFCLASS64 == (elf)->class)#define elf_msb(elf)   (ELFDATA2MSB == (elf)->data)#define elf_lsb(elf)   (ELFDATA2LSB == (elf)->data)#define elf_swap(elf)  (NATIVE_ELFDATA != (elf)->data)#define elf_uval(elf, str, elem)                                        \    ((ELFCLASS64 == (elf)->class)                                       \     ? elf_access_unsigned((elf), (str),                                \                           offsetof(typeof(*(str)),e64.elem),           \                           sizeof((str)->e64.elem))                     \     : elf_access_unsigned((elf), (str),                                \                           offsetof(typeof(*(str)),e32.elem),           \                           sizeof((str)->e32.elem)))#define elf_sval(elf, str, elem)                                        \    ((ELFCLASS64 == (elf)->class)                                       \     ? elf_access_signed((elf), (str),                                  \                         offsetof(typeof(*(str)),e64.elem),             \                         sizeof((str)->e64.elem))                       \     : elf_access_signed((elf), (str),                                  \                         offsetof(typeof(*(str)),e32.elem),             \                         sizeof((str)->e32.elem)))#define elf_size(elf, str)                              \    ((ELFCLASS64 == (elf)->class)                       \     ? sizeof((str)->e64) : sizeof((str)->e32))uint64_t elf_access_unsigned(struct elf_binary *elf, const void *ptr,                             uint64_t offset, size_t size);int64_t elf_access_signed(struct elf_binary *elf, const void *ptr,                          uint64_t offset, size_t size);uint64_t elf_round_up(struct elf_binary *elf, uint64_t addr);/* ------------------------------------------------------------------------ *//* xc_libelf_tools.c                                                        */int elf_shdr_count(struct elf_binary *elf);int elf_phdr_count(struct elf_binary *elf);const elf_shdr *elf_shdr_by_name(struct elf_binary *elf, const char *name);const elf_shdr *elf_shdr_by_index(struct elf_binary *elf, int index);const elf_phdr *elf_phdr_by_index(struct elf_binary *elf, int index);const char *elf_section_name(struct elf_binary *elf, const elf_shdr * shdr);const void *elf_section_start(struct elf_binary *elf, const elf_shdr * shdr);const void *elf_section_end(struct elf_binary *elf, const elf_shdr * shdr);const void *elf_segment_start(struct elf_binary *elf, const elf_phdr * phdr);const void *elf_segment_end(struct elf_binary *elf, const elf_phdr * phdr);const elf_sym *elf_sym_by_name(struct elf_binary *elf, const char *symbol);const elf_sym *elf_sym_by_index(struct elf_binary *elf, int index);const char *elf_note_name(struct elf_binary *elf, const elf_note * note);const void *elf_note_desc(struct elf_binary *elf, const elf_note * note);uint64_t elf_note_numeric(struct elf_binary *elf, const elf_note * note);const elf_note *elf_note_next(struct elf_binary *elf, const elf_note * note);int elf_is_elfbinary(const void *image);int elf_phdr_is_loadable(struct elf_binary *elf, const elf_phdr * phdr);/* ------------------------------------------------------------------------ *//* xc_libelf_loader.c                                                       */int elf_init(struct elf_binary *elf, const char *image, size_t size);#ifdef __XEN__void elf_set_verbose(struct elf_binary *elf);#elsevoid elf_set_logfile(struct elf_binary *elf, FILE * log, int verbose);#endifvoid elf_parse_binary(struct elf_binary *elf);void elf_load_binary(struct elf_binary *elf);void *elf_get_ptr(struct elf_binary *elf, unsigned long addr);uint64_t elf_lookup_addr(struct elf_binary *elf, const char *symbol);void elf_parse_bsdsyms(struct elf_binary *elf, uint64_t pstart); /* private *//* ------------------------------------------------------------------------ *//* xc_libelf_relocate.c                                                     */int elf_reloc(struct elf_binary *elf);/* ------------------------------------------------------------------------ *//* xc_libelf_dominfo.c                                                      */#define UNSET_ADDR          ((uint64_t)-1)enum xen_elfnote_type {    XEN_ENT_NONE = 0,    XEN_ENT_LONG = 1,    XEN_ENT_STR  = 2};struct xen_elfnote {    enum xen_elfnote_type type;    const char *name;    union {        const char *str;        uint64_t num;    } data;};struct elf_dom_parms {    /* raw */    const char *guest_info;    const void *elf_note_start;    const void *elf_note_end;    struct xen_elfnote elf_notes[XEN_ELFNOTE_MAX + 1];      /* parsed */    char guest_os[16];    char guest_ver[16];    char xen_ver[16];    char loader[16];    int pae;    int bsd_symtab;    uint64_t virt_base;    uint64_t virt_entry;    uint64_t virt_hypercall;    uint64_t virt_hv_start_low;    uint64_t elf_paddr_offset;    uint32_t f_supported[XENFEAT_NR_SUBMAPS];    uint32_t f_required[XENFEAT_NR_SUBMAPS];    /* calculated */    uint64_t virt_offset;    uint64_t virt_kstart;    uint64_t virt_kend;};static inline void elf_xen_feature_set(int nr, uint32_t * addr){    addr[nr >> 5] |= 1 << (nr & 31);}static inline int elf_xen_feature_get(int nr, uint32_t * addr){    return !!(addr[nr >> 5] & (1 << (nr & 31)));}int elf_xen_parse_features(const char *features,                           uint32_t *supported,                           uint32_t *required);int elf_xen_parse_note(struct elf_binary *elf,                       struct elf_dom_parms *parms,                       const elf_note *note);int elf_xen_parse_guest_info(struct elf_binary *elf,                             struct elf_dom_parms *parms);int elf_xen_parse(struct elf_binary *elf,                  struct elf_dom_parms *parms);#endif /* __XC_LIBELF__ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -