176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * sys/elf32.h
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef _SYS_ELF32_H
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define _SYS_ELF32_H
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <sys/elfcommon.h>
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* ELF standard typedefs (yet more proof that <stdint.h> was way overdue) */
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef uint16_t Elf32_Half;
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef int16_t Elf32_SHalf;
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef uint32_t Elf32_Word;
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef int32_t Elf32_Sword;
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef uint64_t Elf32_Xword;
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef int64_t Elf32_Sxword;
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef uint32_t Elf32_Off;
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef uint32_t Elf32_Addr;
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef uint16_t Elf32_Section;
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Dynamic header */
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct elf32_dyn {
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Sword d_tag;
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    union {
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	Elf32_Sword d_val;
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	Elf32_Addr d_ptr;
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    } d_un;
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} Elf32_Dyn;
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Relocations */
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define ELF32_R_SYM(x)	((x) >> 8)
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define ELF32_R_TYPE(x)	((x) & 0xff)
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct elf32_rel {
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Addr r_offset;
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Word r_info;
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} Elf32_Rel;
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct elf32_rela {
4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Addr r_offset;
4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Word r_info;
4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Sword r_addend;
4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} Elf32_Rela;
4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Symbol */
4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct elf32_sym {
5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Word st_name;
5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Addr st_value;
5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Word st_size;
5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    unsigned char st_info;
5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    unsigned char st_other;
5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Half st_shndx;
5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} Elf32_Sym;
5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Main file header */
6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct elf32_hdr {
6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    unsigned char e_ident[EI_NIDENT];
6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Half e_type;
6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Half e_machine;
6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Word e_version;
6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Addr e_entry;
6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Off e_phoff;
6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Off e_shoff;
6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Word e_flags;
7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Half e_ehsize;
7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Half e_phentsize;
7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Half e_phnum;
7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Half e_shentsize;
7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Half e_shnum;
7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Half e_shstrndx;
7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} Elf32_Ehdr;
7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Program header */
7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct elf32_phdr {
8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Word p_type;
8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Off p_offset;
8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Addr p_vaddr;
8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Addr p_paddr;
8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Word p_filesz;
8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Word p_memsz;
8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Word p_flags;
8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Word p_align;
8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} Elf32_Phdr;
9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Section header */
9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct elf32_shdr {
9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Word sh_name;
9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Word sh_type;
9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Word sh_flags;
9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Addr sh_addr;
9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Off sh_offset;
9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Word sh_size;
10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Word sh_link;
10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Word sh_info;
10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Word sh_addralign;
10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Word sh_entsize;
10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} Elf32_Shdr;
10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Note header */
10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct elf32_note {
10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Word n_namesz;	/* Name size */
10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Word n_descsz;	/* Content size */
11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Elf32_Word n_type;		/* Content type */
11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} Elf32_Nhdr;
11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif /* _SYS_ELF32_H */
114