/* Copyright (C) 1986-2001 by Digital Mars. $Revision: 1.1.1.1 $ */ #if __SC__ || __RCC__ #pragma once #endif #ifndef __ELF_H #define __ELF_H 1 #ifdef __cplusplus extern "C" { #endif #pragma pack(1) typedef unsigned long Elf32_Addr; typedef unsigned short Elf32_Half; typedef unsigned long Elf32_Off; typedef long Elf32_Sword; typedef unsigned long Elf32_Word; #define ELF32_FSZ_ADDR 4 #define ELF32_FSZ_HALF 2 #define ELF32_FSZ_OFF 4 #define ELF32_FSZ_SWORD 4 #define ELF32_FSZ_WORD 4 /* ELF header */ #define EI_NIDENT 16 typedef struct { unsigned char e_ident[EI_NIDENT]; /* ident bytes */ Elf32_Half e_type; /* file type */ Elf32_Half e_machine; /* target machine */ Elf32_Word e_version; /* file version */ Elf32_Addr e_entry; /* start address */ Elf32_Off e_phoff; /* phdr file offset */ Elf32_Off e_shoff; /* shdr file offset */ Elf32_Word e_flags; /* file flags */ Elf32_Half e_ehsize; /* sizeof ehdr */ Elf32_Half e_phentsize; /* sizeof phdr */ Elf32_Half e_phnum; /* number phdrs */ Elf32_Half e_shentsize; /* sizeof shdr */ Elf32_Half e_shnum; /* number shdrs */ Elf32_Half e_shstrndx; /* shdr string index */ } Elf32_Ehdr; #define EI_MAG0 0 /* e_ident[] indexes */ #define EI_MAG1 1 #define EI_MAG2 2 #define EI_MAG3 3 #define EI_CLASS 4 #define EI_DATA 5 #define EI_VERSION 6 #define EI_PAD 7 #define ELFMAG0 0x7f /* EI_MAG */ #define ELFMAG1 'E' #define ELFMAG2 'L' #define ELFMAG3 'F' #define ELFMAG "\177ELF" #define SELFMAG 4 // Where x = e_ident #define ISELF(x) (((x[EI_MAG0])==ELFMAG0) && \ ((x[EI_MAG1])==ELFMAG1) && \ ((x[EI_MAG2])==ELFMAG2) && \ ((x[EI_MAG3])==ELFMAG3)) #define ELFCLASSNONE 0 /* EI_CLASS */ #define ELFCLASS32 1 #define ELFCLASS64 2 #define ELFCLASSNUM 3 #define ELFDATANONE 0 /* EI_DATA */ #define ELFDATA2LSB 1 #define ELFDATA2MSB 2 #define ELFDATANUM 3 #define ET_NONE 0 /* e_type */ #define ET_REL 1 #define ET_EXEC 2 #define ET_DYN 3 #define ET_CORE 4 #define ET_NUM 5 #define ET_LOPROC 0xff00 /* processor specific range */ #define ET_HIPROC 0xffff #define EM_NONE 0 /* e_machine */ #define EM_M32 1 /* AT&T WE 32100 */ #define EM_SPARC 2 /* Sun SPARC */ #define EM_386 3 /* Intel 80386 */ #define EM_68K 4 /* Motorola 68000 */ #define EM_88K 5 /* Motorola 88000 */ #define EM_486 6 /* Intel 80486 */ #define EM_860 7 /* Intel i860 */ #define EM_NUM 8 #define EV_NONE 0 /* e_version, EI_VERSION */ #define EV_CURRENT 1 #define EV_NUM 2 /* Program header */ typedef struct { Elf32_Word p_type; /* entry type */ Elf32_Off p_offset; /* file offset */ Elf32_Addr p_vaddr; /* virtual address */ Elf32_Addr p_paddr; /* physical address */ Elf32_Word p_filesz; /* file size */ Elf32_Word p_memsz; /* memory size */ Elf32_Word p_flags; /* entry flags */ Elf32_Word p_align; /* memory/file alignment */ } Elf32_Phdr; #define PT_NULL 0 /* p_type */ #define PT_LOAD 1 #define PT_DYNAMIC 2 #define PT_INTERP 3 #define PT_NOTE 4 #define PT_SHLIB 5 #define PT_PHDR 6 #define PT_NUM 7 #define PT_LOPROC 0x70000000 /* processor specific range */ #define PT_HIPROC 0x7fffffff #define PF_R 0x4 /* p_flags */ #define PF_W 0x2 #define PF_X 0x1 #define PF_MASKPROC 0xf0000000 /* processor specific values */ /* Section header */ typedef struct { Elf32_Word sh_name; /* section name */ Elf32_Word sh_type; /* SHT_... */ Elf32_Word sh_flags; /* SHF_... */ Elf32_Addr sh_addr; /* virtual address */ Elf32_Off sh_offset; /* file offset */ Elf32_Word sh_size; /* section size */ Elf32_Word sh_link; /* misc info */ Elf32_Word sh_info; /* misc info */ Elf32_Word sh_addralign; /* memory alignment */ Elf32_Word sh_entsize; /* entry size if table */ } Elf32_Shdr; #define SHT_NULL 0 /* sh_type */ #define SHT_PROGBITS 1 #define SHT_SYMTAB 2 #define SHT_STRTAB 3 #define SHT_RELA 4 #define SHT_HASH 5 #define SHT_DYNAMIC 6 #define SHT_NOTE 7 #define SHT_NOBITS 8 #define SHT_REL 9 #define SHT_SHLIB 10 #define SHT_DYNSYM 11 #define SHT_NUM 12 #define SHT_LOUSER 0x80000000 #define SHT_HIUSER 0xffffffff #define SHT_LOPROC 0x70000000 /* processor specific range */ #define SHT_HIPROC 0x7fffffff #define SHF_WRITE 0x1 /* sh_flags */ #define SHF_ALLOC 0x2 #define SHF_EXECINSTR 0x4 #define SHF_MASKPROC 0xf0000000 /* processor specific values */ #define SHN_UNDEF 0 /* special section numbers */ #define SHN_TEXT 1 #define SHN_DATA 2 #define SHN_BSS 3 #define SHN_COMMENT 4 #define SHN_DEBUG 5 #define SHN_LINE 6 #define SHN_DATAXI 7 #define SHN_DATAXC 8 #define SHN_REL_TEXT 9 #define SHN_REL_DATA 10 #define SHN_SYMTAB 11 #define SHN_STRTAB 12 #define SHN_REL_DEBUG 13 #define SHN_REL_LINE 14 #define SHN_REL_DATAXI 15 #define SHN_REL_DATAXC 16 #define MAX_SCNS 17 #define SHN_REL SHN_DATAXC #define SHN_LORESERVE 0xff00 #define SHN_ABS 0xfff1 #define SHN_COMMON 0xfff2 #define SHN_HIRESERVE 0xffff #define SHN_LOPROC 0xff00 /* processor specific range */ #define SHN_HIPROC 0xff1f /* Symbol table */ typedef struct { Elf32_Word st_name; Elf32_Addr st_value; Elf32_Word st_size; unsigned char st_info; /* bind, type: ELF_32_ST_... */ unsigned char st_other; Elf32_Half st_shndx; /* SHN_... */ } Elf32_Sym; #define STN_UNDEF 0 /* The macros compose and decompose values for S.st_info * * bind = ELF32_ST_BIND(S.st_info) * type = ELF32_ST_TYPE(S.st_info) * S.st_info = ELF32_ST_INFO(bind, type) */ #define ELF32_ST_BIND(info) ((info) >> 4) #define ELF32_ST_TYPE(info) ((info) & 0xf) #define ELF32_ST_INFO(bind, type) (((bind)<<4)+((type)&0xf)) #define STB_LOCAL 0 /* BIND */ #define STB_GLOBAL 1 #define STB_WEAK 2 #define STB_NUM 3 #define STB_LOPROC 13 /* processor specific range */ #define STB_HIPROC 15 #define STT_NOTYPE 0 /* TYPE */ #define STT_OBJECT 1 #define STT_FUNC 2 #define STT_SECTION 3 #define STT_FILE 4 #define STT_NUM 5 #define STT_LOPROC 13 /* processor specific range */ #define STT_HIPROC 15 /* Relocation */ typedef struct { Elf32_Addr r_offset; Elf32_Word r_info; /* sym, type: ELF32_R_... */ } Elf32_Rel; typedef struct { Elf32_Addr r_offset; Elf32_Word r_info; /* sym, type: ELF32_R_... */ Elf32_Sword r_addend; } Elf32_Rela; /* The macros compose and decompose values for Rel.r_info, Rela.f_info * * sym = ELF32_R_SYM(R.r_info) * type = ELF32_R_TYPE(R.r_info) * R.r_info = ELF32_R_INFO(sym, type) */ #define ELF32_R_SYM(info) ((info)>>8) #define ELF32_R_TYPE(info) ((unsigned char)(info)) #define ELF32_R_INFO(sym, type) (((sym)<<8)+(unsigned char)(type)) /* Note entry header */ typedef struct { Elf32_Word n_namesz; /* length of note's name */ Elf32_Word n_descsz; /* length of note's "desc" */ Elf32_Word n_type; /* type of note */ } Elf32_Nhdr; /* Known values for note entry types (e_type == ET_CORE) */ #define NT_PRSTATUS 1 #define NT_PRFPREG 2 #define NT_PRPSINFO 3 #define R_386_NONE 0 /* relocation type */ #define R_386_32 1 #define R_386_PC32 2 #define R_386_GOT32 3 #define R_386_PLT32 4 #define R_386_COPY 5 #define R_386_GLOB_DAT 6 #define R_386_JMP_SLOT 7 #define R_386_RELATIVE 8 #define R_386_GOTOFF 9 #define R_386_GOTPC 10 #define R_386_NUM 11 #define ELF_386_MAXPGSZ 0x1000 /* maximum page size */ struct elf_section { Elf32_Shdr *shdr; unsigned char *data; }; union elf_relocation { Elf32_Rel rel; Elf32_Rela rela; }; #define SOURCE_NO_POS 0xffff struct elf_lineno { Elf32_Word linenum; Elf32_Half lineposn; // = SOURCE_NO_POS for whole line Elf32_Word offset; }; #pragma pack() #ifdef __cplusplus } #endif #endif