netlib.narod.ru< Назад | Оглавление | Далее >

include/linux/elf.h

14205 #ifndef _LINUX_ELF_H
14206 #define _LINUX_ELF_H
14207 
14208 #include <linux/types.h>
14209 #include <asm/elf.h>
14210 
14211 /* 32-bit ELF base types. */
14212 typedef __u32   Elf32_Addr;
14213 typedef __u16   Elf32_Half;
14214 typedef __u32   Elf32_Off;
14215 typedef __s32   Elf32_Sword;
14216 typedef __u32   Elf32_Word;
14217 
14218 /* 64-bit ELF base types. */
14219 typedef __u64   Elf64_Addr;
14220 typedef __u16   Elf64_Half;
14221 typedef __s16   Elf64_SHalf;
14222 typedef __u64   Elf64_Off;
14223 typedef __s64   Elf64_Sword;
14224 typedef __u64   Elf64_Word;
14225 
14226 /* These constants are for the segment types stored in
14227  * the image headers */
14228 #define PT_NULL    0
14229 #define PT_LOAD    1
14230 #define PT_DYNAMIC 2
14231 #define PT_INTERP  3
14232 #define PT_NOTE    4
14233 #define PT_SHLIB   5
14234 #define PT_PHDR    6
14235 #define PT_LOPROC  0x70000000
14236 #define PT_HIPROC  0x7fffffff
14237 
14238 /* These constants define the different elf file types */
14239 #define ET_NONE   0
14240 #define ET_REL    1
14241 #define ET_EXEC   2
14242 #define ET_DYN    3
14243 #define ET_CORE   4
14244 #define ET_LOPROC 5
14245 #define ET_HIPROC 6
14246 
14247 /* These constants define the various ELF target machs */
14248 #define EM_NONE  0
14249 #define EM_M32   1
14250 #define EM_SPARC 2
14251 #define EM_386   3
14252 #define EM_68K   4
14253 #define EM_88K   5
14254 #define EM_486   6   /* Perhaps disused */
14255 #define EM_860   7
14256 
14257 /* MIPS R3000 (officially, big-endian only) */
14258 #define EM_MIPS         8
14259 
14260 #define EM_MIPS_RS4_BE 10   /* MIPS R4000 big-endian */
14261 
14262 #define EM_PARISC      15   /* HPPA */
14263 
14264 #define EM_SPARC32PLUS 18   /* Sun's "v8plus" */
14265 
14266 #define EM_PPC         20   /* PowerPC */
14267 
14268 #define EM_SPARCV9     43   /* SPARC v9 64-bit */
14269 
14270 /* This is an interim value that we will use until the
14271  * committee comes up with a final number.  */
14272 #define EM_ALPHA        0x9026
14273 
14274 
14275 /* This is the info that is needed to parse the dynamic
14276  * section of the file */
14277 #define DT_NULL         0
14278 #define DT_NEEDED       1
14279 #define DT_PLTRELSZ     2
14280 #define DT_PLTGOT       3
14281 #define DT_HASH         4
14282 #define DT_STRTAB       5
14283 #define DT_SYMTAB       6
14284 #define DT_RELA         7
14285 #define DT_RELASZ       8
14286 #define DT_RELAENT      9
14287 #define DT_STRSZ        10
14288 #define DT_SYMENT       11
14289 #define DT_INIT         12
14290 #define DT_FINI         13
14291 #define DT_SONAME       14
14292 #define DT_RPATH        15
14293 #define DT_SYMBOLIC     16
14294 #define DT_REL          17
14295 #define DT_RELSZ        18
14296 #define DT_RELENT       19
14297 #define DT_PLTREL       20
14298 #define DT_DEBUG        21
14299 #define DT_TEXTREL      22
14300 #define DT_JMPREL       23
14301 #define DT_LOPROC       0x70000000
14302 #define DT_HIPROC       0x7fffffff
14303 
14304 /* This info is needed when parsing the symbol table */
14305 #define STB_LOCAL  0
14306 #define STB_GLOBAL 1
14307 #define STB_WEAK   2
14308 
14309 #define STT_NOTYPE  0
14310 #define STT_OBJECT  1
14311 #define STT_FUNC    2
14312 #define STT_SECTION 3
14313 #define STT_FILE    4
14314 
14315 #define ELF32_ST_BIND(x) ((x) >> 4)
14316 #define ELF32_ST_TYPE(x) (((unsigned int) x) & 0xf)
14317 
14318 /* Symbolic values for the entries in the auxiliary table
14319    put on the initial stack */
14320 #define AT_NULL   0    /* end of vector */
14321 #define AT_IGNORE 1    /* entry should be ignored */
14322 #define AT_EXECFD 2    /* file descriptor of program */
14323 #define AT_PHDR   3    /* program headers for program */
14324 #define AT_PHENT  4    /* size of program header entry */
14325 #define AT_PHNUM  5    /* number of program headers */
14326 #define AT_PAGESZ 6    /* system page size */
14327 #define AT_BASE   7    /* base address of interpreter */
14328 #define AT_FLAGS  8    /* flags */
14329 #define AT_ENTRY  9    /* entry point of program */
14330 #define AT_NOTELF 10   /* program is not ELF */
14331 #define AT_UID    11   /* real uid */
14332 #define AT_EUID   12   /* effective uid */
14333 #define AT_GID    13   /* real gid */
14334 #define AT_EGID   14   /* effective gid */
14335 #define AT_PLATFORM 15 /* string identifying CPU for
14336                         * optimizations */
14337 #define AT_HWCAP  16   /* arch dependent hints at CPU
14338                         * capabilities */
14339 
14340 typedef struct dynamic{
14341   Elf32_Sword d_tag;
14342   union{
14343     Elf32_Sword d_val;
14344     Elf32_Addr  d_ptr;
14345   } d_un;
14346 } Elf32_Dyn;
14347 
14348 typedef struct {
14349   Elf64_Word d_tag;             /* entry tag value */
14350   union {
14351     Elf64_Word d_val;
14352     Elf64_Word d_ptr;
14353   } d_un;
14354 } Elf64_Dyn;
14355 
14356 /* The following are used with relocations */
14357 #define ELF32_R_SYM(x) ((x) >> 8)
14358 #define ELF32_R_TYPE(x) ((x) & 0xff)
14359 
14360 #define R_386_NONE      0
14361 #define R_386_32        1
14362 #define R_386_PC32      2
14363 #define R_386_GOT32     3
14364 #define R_386_PLT32     4
14365 #define R_386_COPY      5
14366 #define R_386_GLOB_DAT  6
14367 #define R_386_JMP_SLOT  7
14368 #define R_386_RELATIVE  8
14369 #define R_386_GOTOFF    9
14370 #define R_386_GOTPC     10
14371 #define R_386_NUM       11
14372 
14373 /* Sparc ELF relocation types */
14374 #define R_SPARC_NONE            0
14375 #define R_SPARC_8               1
14376 #define R_SPARC_16              2
14377 #define R_SPARC_32              3
14378 #define R_SPARC_DISP8           4
14379 #define R_SPARC_DISP16          5
14380 #define R_SPARC_DISP32          6
14381 #define R_SPARC_WDISP30         7
14382 #define R_SPARC_WDISP22         8
14383 #define R_SPARC_HI22            9
14384 #define R_SPARC_22              10
14385 #define R_SPARC_13              11
14386 #define R_SPARC_LO10            12
14387 #define R_SPARC_GOT10           13
14388 #define R_SPARC_GOT13           14
14389 #define R_SPARC_GOT22           15
14390 #define R_SPARC_PC10            16
14391 #define R_SPARC_PC22            17
14392 #define R_SPARC_WPLT30          18
14393 #define R_SPARC_COPY            19
14394 #define R_SPARC_GLOB_DAT        20
14395 #define R_SPARC_JMP_SLOT        21
14396 #define R_SPARC_RELATIVE        22
14397 #define R_SPARC_UA32            23
14398 #define R_SPARC_PLT32           24
14399 #define R_SPARC_HIPLT22         25
14400 #define R_SPARC_LOPLT10         26
14401 #define R_SPARC_PCPLT32         27
14402 #define R_SPARC_PCPLT22         28
14403 #define R_SPARC_PCPLT10         29
14404 #define R_SPARC_10              30
14405 #define R_SPARC_11              31
14406 #define R_SPARC_WDISP16         40
14407 #define R_SPARC_WDISP19         41
14408 #define R_SPARC_7               43
14409 #define R_SPARC_5               44
14410 #define R_SPARC_6               45
14411 
14412 /* Bits present in AT_HWCAP, primarily for Sparc32.  */
14413 
14414 #define HWCAP_SPARC_FLUSH       1 /* CPU supports flush
14415                                    * instruction. */
14416 #define HWCAP_SPARC_STBAR       2
14417 #define HWCAP_SPARC_SWAP        4
14418 #define HWCAP_SPARC_MULDIV      8
14419 #define HWCAP_SPARC_V9          16
14420 
14421 
14422 /* 68k ELF relocation types */
14423 #define R_68K_NONE      0
14424 #define R_68K_32        1
14425 #define R_68K_16        2
14426 #define R_68K_8         3
14427 #define R_68K_PC32      4
14428 #define R_68K_PC16      5
14429 #define R_68K_PC8       6
14430 #define R_68K_GOT32     7
14431 #define R_68K_GOT16     8
14432 #define R_68K_GOT8      9
14433 #define R_68K_GOT32O    10
14434 #define R_68K_GOT16O    11
14435 #define R_68K_GOT8O     12
14436 #define R_68K_PLT32     13
14437 #define R_68K_PLT16     14
14438 #define R_68K_PLT8      15
14439 #define R_68K_PLT32O    16
14440 #define R_68K_PLT16O    17
14441 #define R_68K_PLT8O     18
14442 #define R_68K_COPY      19
14443 #define R_68K_GLOB_DAT  20
14444 #define R_68K_JMP_SLOT  21
14445 #define R_68K_RELATIVE  22
14446 
14447 /* Alpha ELF relocation types */
14448 #define R_ALPHA_NONE           0  /* No reloc */
14449 #define R_ALPHA_REFLONG        1  /* Direct 32 bit */
14450 #define R_ALPHA_REFQUAD        2  /* Direct 64 bit */
14451 #define R_ALPHA_GPREL32        3  /* GP relative 32 bit*/
14452 #define R_ALPHA_LITERAL        4  /* GP relative 16 bit
14453                                    * w/optimization */
14454 #define R_ALPHA_LITUSE         5  /* Optimization hint
14455                                    * for LITERAL */
14456 #define R_ALPHA_GPDISP         6  /* Add displacement to
14457                                    * GP */
14458 #define R_ALPHA_BRADDR         7  /* PC+4 relative 23 bit
14459                                    * shifted */
14460 #define R_ALPHA_HINT           8  /* PC+4 relative 16 bit
14461                                    * shifted */
14462 #define R_ALPHA_SREL16         9  /* PC relative 16 bit*/
14463 #define R_ALPHA_SREL32         10 /* PC relative 32 bit*/
14464 #define R_ALPHA_SREL64         11 /* PC relative 64 bit*/
14465 #define R_ALPHA_OP_PUSH        12 /* OP stack push */
14466 #define R_ALPHA_OP_STORE       13 /* OP stack pop and
14467                                    * store */
14468 #define R_ALPHA_OP_PSUB        14 /* OP stack subtract */
14469 #define R_ALPHA_OP_PRSHIFT     15 /* OP stack right shift
14470                                    */
14471 #define R_ALPHA_GPVALUE        16
14472 #define R_ALPHA_GPRELHIGH      17
14473 #define R_ALPHA_GPRELLOW       18
14474 #define R_ALPHA_IMMED_GP_16    19
14475 #define R_ALPHA_IMMED_GP_HI32  20
14476 #define R_ALPHA_IMMED_SCN_HI32 21
14477 #define R_ALPHA_IMMED_BR_HI32  22
14478 #define R_ALPHA_IMMED_LO32     23
14479 #define R_ALPHA_COPY           24 /* Copy symbol at
14480                                    * runtime */
14481 #define R_ALPHA_GLOB_DAT       25 /* Create GOT entry */
14482 #define R_ALPHA_JMP_SLOT       26 /* Create PLT entry */
14483 #define R_ALPHA_RELATIVE       27 /* Adjust by program
14484                                    * base */
14485 
14486 /* Legal values for e_flags field of Elf64_Ehdr.  */
14487 
14488 #define EF_ALPHA_32BIT          1 /* All addresses are
14489                                    * below 2GB */
14490 
14491 
14492 typedef struct elf32_rel {
14493   Elf32_Addr    r_offset;
14494   Elf32_Word    r_info;
14495 } Elf32_Rel;
14496 
14497 typedef struct elf64_rel {
14498   /* Location at which to apply the action */
14499   Elf64_Addr r_offset;
14500   Elf64_Word r_info;  /* index and type of relocation */
14501 } Elf64_Rel;
14502 
14503 typedef struct elf32_rela{
14504   Elf32_Addr    r_offset;
14505   Elf32_Word    r_info;
14506   Elf32_Sword   r_addend;
14507 } Elf32_Rela;
14508 
14509 typedef struct elf64_rela {
14510   /* Location at which to apply the action */
14511   Elf64_Addr r_offset;
14512   /* index and type of relocation */
14513   Elf64_Word r_info;
14514   /* Constant addend used to compute value */
14515   Elf64_Word r_addend;
14516 } Elf64_Rela;
14517 
14518 typedef struct elf32_sym{
14519   Elf32_Word    st_name;
14520   Elf32_Addr    st_value;
14521   Elf32_Word    st_size;
14522   unsigned char st_info;
14523   unsigned char st_other;
14524   Elf32_Half    st_shndx;
14525 } Elf32_Sym;
14526 
14527 typedef struct elf64_sym {
14528   Elf32_Word st_name;      /* Symbol name, index in
14529                             * string tbl (yes, Elf32) */
14530   unsigned char st_info;   /* Type and binding
14531                             * attributes */
14532   unsigned char st_other;  /* No defined meaning, 0 */
14533   Elf64_Half st_shndx;     /* Associated section index */
14534   Elf64_Addr st_value;     /* Value of the symbol */
14535   Elf64_Word st_size;      /* Associated symbol size */
14536 } Elf64_Sym;
14537 
14538 
14539 #define EI_NIDENT       16
14540 
14541 typedef struct elf32_hdr{
14542   unsigned char e_ident[EI_NIDENT];
14543   Elf32_Half    e_type;
14544   Elf32_Half    e_machine;
14545   Elf32_Word    e_version;
14546   Elf32_Addr    e_entry;  /* Entry point */
14547   Elf32_Off     e_phoff;
14548   Elf32_Off     e_shoff;
14549   Elf32_Word    e_flags;
14550   Elf32_Half    e_ehsize;
14551   Elf32_Half    e_phentsize;
14552   Elf32_Half    e_phnum;
14553   Elf32_Half    e_shentsize;
14554   Elf32_Half    e_shnum;
14555   Elf32_Half    e_shstrndx;
14556 } Elf32_Ehdr;
14557 
14558 typedef struct elf64_hdr {
14559   unsigned char e_ident[16]; /* ELF "magic number" */
14560   Elf64_SHalf e_type;
14561   Elf64_Half e_machine;
14562   __s32 e_version;
14563   Elf64_Addr e_entry; /* Entry point virtual address */
14564   Elf64_Off e_phoff;  /* Program hdr table file offset */
14565   Elf64_Off e_shoff;  /* Section hdr table file offset */
14566   __s32 e_flags;
14567   Elf64_SHalf e_ehsize;
14568   Elf64_SHalf e_phentsize;
14569   Elf64_SHalf e_phnum;
14570   Elf64_SHalf e_shentsize;
14571   Elf64_SHalf e_shnum;
14572   Elf64_SHalf e_shstrndx;
14573 } Elf64_Ehdr;
14574 
14575 /* These constants define the permissions on sections in
14576    the program header, p_flags. */
14577 #define PF_R            0x4
14578 #define PF_W            0x2
14579 #define PF_X            0x1
14580 
14581 typedef struct elf32_phdr{
14582   Elf32_Word    p_type;
14583   Elf32_Off     p_offset;
14584   Elf32_Addr    p_vaddr;
14585   Elf32_Addr    p_paddr;
14586   Elf32_Word    p_filesz;
14587   Elf32_Word    p_memsz;
14588   Elf32_Word    p_flags;
14589   Elf32_Word    p_align;
14590 } Elf32_Phdr;
14591 
14592 typedef struct elf64_phdr {
14593   __s32 p_type;
14594   __s32 p_flags;
14595   Elf64_Off p_offset;   /* Segment file offset */
14596   Elf64_Addr p_vaddr;   /* Segment virtual address */
14597   Elf64_Addr p_paddr;   /* Segment physical address */
14598   Elf64_Word p_filesz;  /* Segment size in file */
14599   Elf64_Word p_memsz;   /* Segment size in memory */
14600   Elf64_Word p_align;   /* Segment alignment,
14601                          * file & memory */
14602 } Elf64_Phdr;
14603 
14604 /* sh_type */
14605 #define SHT_NULL        0
14606 #define SHT_PROGBITS    1
14607 #define SHT_SYMTAB      2
14608 #define SHT_STRTAB      3
14609 #define SHT_RELA        4
14610 #define SHT_HASH        5
14611 #define SHT_DYNAMIC     6
14612 #define SHT_NOTE        7
14613 #define SHT_NOBITS      8
14614 #define SHT_REL         9
14615 #define SHT_SHLIB       10
14616 #define SHT_DYNSYM      11
14617 #define SHT_NUM         12
14618 #define SHT_LOPROC      0x70000000
14619 #define SHT_HIPROC      0x7fffffff
14620 #define SHT_LOUSER      0x80000000
14621 #define SHT_HIUSER      0xffffffff
14622 
14623 /* sh_flags */
14624 #define SHF_WRITE       0x1
14625 #define SHF_ALLOC       0x2
14626 #define SHF_EXECINSTR   0x4
14627 #define SHF_MASKPROC    0xf0000000
14628 
14629 /* special section indexes */
14630 #define SHN_UNDEF       0
14631 #define SHN_LORESERVE   0xff00
14632 #define SHN_LOPROC      0xff00
14633 #define SHN_HIPROC      0xff1f
14634 #define SHN_ABS         0xfff1
14635 #define SHN_COMMON      0xfff2
14636 #define SHN_HIRESERVE   0xffff
14637  
14638 typedef struct {
14639   Elf32_Word    sh_name;
14640   Elf32_Word    sh_type;
14641   Elf32_Word    sh_flags;
14642   Elf32_Addr    sh_addr;
14643   Elf32_Off     sh_offset;
14644   Elf32_Word    sh_size;
14645   Elf32_Word    sh_link;
14646   Elf32_Word    sh_info;
14647   Elf32_Word    sh_addralign;
14648   Elf32_Word    sh_entsize;
14649 } Elf32_Shdr;
14650 
14651 typedef struct elf64_shdr {
14652   Elf32_Word sh_name;      /* Section name, index in
14653                             * string tbl (yes Elf32) */
14654   Elf32_Word sh_type;      /* Type of section
14655                             * (yes Elf32) */
14656   Elf64_Word sh_flags;     /* Miscellaneous section
14657                             * attributes */
14658   Elf64_Addr sh_addr;      /* Section virtual addr at
14659                             * execution */
14660   Elf64_Off sh_offset;     /* Section file offset */
14661   Elf64_Word sh_size;      /* Size of section in bytes */
14662   Elf32_Word sh_link;      /* Index of another section
14663                             * (yes Elf32) */
14664   Elf32_Word sh_info;      /* Additional section
14665                             * information (yes Elf32) */
14666   Elf64_Word sh_addralign; /* Section alignment */
14667   Elf64_Word sh_entsize;   /* Entry size if section holds
14668                             * table */
14669 } Elf64_Shdr;
14670 
14671 #define EI_MAG0         0  /* e_ident[] indexes */
14672 #define EI_MAG1         1
14673 #define EI_MAG2         2
14674 #define EI_MAG3         3
14675 #define EI_CLASS        4
14676 #define EI_DATA         5
14677 #define EI_VERSION      6
14678 #define EI_PAD          7
14679 
14680 #define ELFMAG0         0x7f            /* EI_MAG */
14681 #define ELFMAG1         'E'
14682 #define ELFMAG2         'L'
14683 #define ELFMAG3         'F'
14684 #define ELFMAG          "\177ELF"
14685 #define SELFMAG         4
14686 
14687 #define ELFCLASSNONE    0               /* EI_CLASS */
14688 #define ELFCLASS32      1
14689 #define ELFCLASS64      2
14690 #define ELFCLASSNUM     3
14691 
14692 #define ELFDATANONE     0          /* e_ident[EI_DATA] */
14693 #define ELFDATA2LSB     1
14694 #define ELFDATA2MSB     2
14695 
14696 #define EV_NONE         0     /* e_version, EI_VERSION */
14697 #define EV_CURRENT      1
14698 #define EV_NUM          2
14699 
14700 /* Notes used in ET_CORE */
14701 #define NT_PRSTATUS     1
14702 #define NT_PRFPREG      2
14703 #define NT_PRPSINFO     3
14704 #define NT_TASKSTRUCT   4
14705 
14706 /* Note header in a PT_NOTE section */
14707 typedef struct elf32_note {
14708   Elf32_Word    n_namesz;       /* Name size */
14709   Elf32_Word    n_descsz;       /* Content size */
14710   Elf32_Word    n_type;         /* Content type */
14711 } Elf32_Nhdr;
14712 
14713 /* Note header in a PT_NOTE section */
14714 /* For now we use the 32 bit version of the structure
14715  * until we figure out whether we need anything better.
14716  * Note - on the Alpha, "unsigned int" is only 32 bits.*/
14717 typedef struct elf64_note {
14718   Elf32_Word n_namesz;  /* Name size */
14719   Elf32_Word n_descsz;  /* Content size */
14720   Elf32_Word n_type;    /* Content type */
14721 } Elf64_Nhdr;
14722 
14723 #if ELF_CLASS == ELFCLASS32
14724 
14725 extern Elf32_Dyn _DYNAMIC [];
14726 #define elfhdr          elf32_hdr
14727 #define elf_phdr        elf32_phdr
14728 #define elf_note        elf32_note
14729 
14730 #else
14731 
14732 extern Elf64_Dyn _DYNAMIC [];
14733 #define elfhdr          elf64_hdr
14734 #define elf_phdr        elf64_phdr
14735 #define elf_note        elf64_note
14736 
14737 #endif
14738 
14739 
14740 #endif /* _LINUX_ELF_H */

netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz