Executable and Linkable Format.(ELF.rfh):
Class: Executable and Object, Status: Almost Complete, Last change: 03.01.2018 22:00:34

/*
 *  Source:
 */

type

TElfClass enum byte (
  ELFCLASSNONE=0, //Invalid class
  ELFCLASS32=1, //32-bit objects
  ELFCLASS64=2 //64-bit objects
)

TElfEncoding enum byte (
  ELFDATANONE=0, //Invalid data encoding
  ELFDATA2LSB=1,
  ELFDATA2MSB=2
)

TEVersionB enum Byte (
  EV_NONE=0, //Invalid Version
  EV_CURRENT=1 //Current version
) 

TEOSABI enum Byte (
  ELFOSABI_NONE, //No extensions or unspecified
  ELFOSABI_HPUX, //Hewlett-Packard HP-UX
  ELFOSABI_NETBSD, //NetBSD
  ELFOSABI_GNU, //GNU
  ELFOSABI_SOLARIS, //Sun Solaris
  ELFOSABI_AIX, //AIX
  ELFOSABI_IRIX, //IRIX
  ELFOSABI_FREEBSD, //FreeBSD
  ELFOSABI_TRU64, //10, //Compaq TRU64 UNIX
  ELFOSABI_MODESTO1, //Novell Modesto
  ELFOSABI_OPENBSD2, //Open BSD
  ELFOSABI_OPENVMS3, //Open VMS
  ELFOSABI_NSK4, //Hewlett-Packard Non-Stop Kernel
  ELFOSABI_AROS5, //Amiga Research OS
  ELFOSABI_FENIXOS6, //The FenixOS highly scalable multi-core OS
  ELFOSABI_CLOUDABI7, //Nuxi CloudABI
  ELFOSABI_OPENVOS8, //Stratus Technologies OpenVOS
  ELFOSABI_ARM_AEABI = 64
 //4-255 Architecture-specific value range
)

TEABIVersion Byte

TElfIdent struc
  array[4] of char ei_magic
  TElfClass ei_class //File class
  TElfEncoding ei_encoding //Data Encoding
  TEVersionB ei_version //File Version
  TEOSABI ei_osabi //Operating system/ABI identification
  TEABIVersion ei_abiversion //ABI version
  array[7] of byte ei_pad //Padding bytes
ends

data

0 TElfIdent Ident

assert (Ident.ei_magic='ELF') and 
  ((Ident.ei_class=TElfClass.ELFCLASS32)or(Ident.ei_class=TElfClass.ELFCLASS64))
  and (Ident.ei_version=TEVersionB.EV_CURRENT);

descr ('Executable and Linkable Format.',NL,
  'Info Source: ELF.PS in (ELF11G.ZIP, www.wotsit.org).',NL,
  'Info Source: Executable and Linkable Format (ELF), Tool Interface Standards (TIS), Portable Format Specification, Version 1.1',NL,
  'Info Source: ELF-64 Object File Format, Version 1.5 Draft 2,May 27, 1998',NL,
  'Info Source: System V Application Binary Interface - DRAFT - 10 June 2013 http://www.sco.com/developers/gabi/latest/contents.html',NL,
  'Info Source: ELF.H in Linux and SUN (Some addition machine specific).',NL)

set byteorder rev=(Ident.ei_encoding=TElfEncoding.ELFDATA2MSB);

type

EHalf num+(2)
EWord num+(4)
ESWord num-(4)

%$IF Ident.ei_class=TElfClass.ELFCLASS64;
const 
  MemWB = 8;

type
EAddr num+(8)
EOff num+(8)
ER_TYPE num+(4)

%$ELSE
const 
  MemWB = 4;

type
EAddr num+(4)
EOff num+(4)                             
ER_TYPE num+(1)
%$END

const 
  MemWidth = MemWB*8;

type
EXWord num+(MemWB)
ESXWord num-(MemWB)

TEType enum EHalf (
  ET_NONE=0, //No file type
  ET_REL=1,  //Relocatable file
  ET_EXEC=2, //Executable file
  ET_DYN=3,  //Shared object file
  ET_CORE=4  //Core file
) // else Processor-specific

TEMachine enum EHalf (
  EM_NONE=0, //No machine
  EM_M32=1,  //AT&T WE 32100
  EM_SPARC=2,//SUN SPARC
  EM_386=3,  //Intel 80386
  EM_68K=4,  //Motorola 68000
  EM_88K=5,  //Motorola 88000
  EM_486=6,  /*Intel 80486 (Perhaps disused)*/
  EM_860=7,  //Intel 80860
  EM_MIPS=8, //MIPS RS3000 (officially, big-endian only)
  EM_S370=9, /* Amdahl */
  EM_MIPS_RS4_BE=10,  /* MIPS R4000 big-endian */
  EM_SPARC64=11, /* SPARC v9 (not official) 64-bit|RS6000 (in SUN`s elf.h) */
  EM_PARISC=15, /* Hewlett-Packard PA-RISC*/
  EM_nCUBE=16, /* nCUBE */
  EM_VPP500=17, /* Fujitsu VPP500 */
  EM_SPARC32PLUS = 18, /* Enhanced instruction set SPARC */
  EM_960=19, /* Intel 80960 */
  EM_PPC=20, /* PowerPC */
  EM_PPC64=21, /* 64-bit PowerPC */
  EM_S390=22, /* IBM System/390 Processor */
  EM_SPU=23, /* IBM SPU/SPC */
  EM_V800 = 36, //NEC V800
  EM_FR20 = 37, //Fujitsu FR20
  EM_RH32 = 38, //TRW RH-32
  EM_RCE = 39, //Motorola RCE
  EM_ARM = 40, //ARM 32-bit architecture (AARCH32)
  EM_ALPHA = 41, //Digital Alpha
  EM_SH = 42, //Hitachi SH
  EM_SPARCV9 = 43, //SPARC Version 9
  EM_TRICORE = 44, //Siemens TriCore embedded processor
  EM_ARC = 45, //Argonaut RISC Core, Argonaut Technologies Inc.
  EM_H8_300 = 46, //Hitachi H8/300
  EM_H8_300H = 47, //Hitachi H8/300H
  EM_H8S = 48, //Hitachi H8S
  EM_H8_500 = 49, //Hitachi H8/500
  EM_IA_64 = 50, //Intel IA-64 processor architecture
  EM_MIPS_X = 51, //Stanford MIPS-X
  EM_COLDFIRE = 52, //Motorola ColdFire
  EM_68HC12 = 53, //Motorola M68HC12
  EM_MMA = 54, //Fujitsu MMA Multimedia Accelerator
  EM_PCP = 55, //Siemens PCP
  EM_NCPU = 56, //Sony nCPU embedded RISC processor
  EM_NDR1 = 57, //Denso NDR1 microprocessor
  EM_STARCORE = 58, //Motorola Star*Core processor
  EM_ME16 = 59, //Toyota ME16 processor
  EM_ST100 = 60, //STMicroelectronics ST100 processor
  EM_TINYJ = 61, //Advanced Logic Corp. TinyJ embedded processor family
  EM_X86_64 = 62, //AMD x86-64 architecture
  EM_PDSP = 63, //Sony DSP Processor
  EM_PDP10 = 64, //Digital Equipment Corp. PDP-10
  EM_PDP11 = 65, //Digital Equipment Corp. PDP-11
  EM_FX66 = 66, //Siemens FX66 microcontroller
  EM_ST9PLUS = 67, //STMicroelectronics ST9+ 8/16 bit microcontroller
  EM_ST7 = 68, //STMicroelectronics ST7 8-bit microcontroller
  EM_68HC16 = 69, //Motorola MC68HC16 Microcontroller
  EM_68HC11 = 70, //Motorola MC68HC11 Microcontroller
  EM_68HC08 = 71, //Motorola MC68HC08 Microcontroller
  EM_68HC05 = 72, //Motorola MC68HC05 Microcontroller
  EM_SVX = 73, //Silicon Graphics SVx
  EM_ST19 = 74, //STMicroelectronics ST19 8-bit microcontroller
  EM_VAX = 75, //Digital VAX
  EM_CRIS = 76, //Axis Communications 32-bit embedded processor
  EM_JAVELIN = 77, //Infineon Technologies 32-bit embedded processor
  EM_FIREPATH = 78, //Element 14 64-bit DSP Processor
  EM_ZSP = 79, //LSI Logic 16-bit DSP Processor
  EM_MMIX = 80, //Donald Knuth's educational 64-bit processor
  EM_HUANY = 81, //Harvard University machine-independent object files
  EM_PRISM = 82, //SiTera Prism
  EM_AVR = 83, //Atmel AVR 8-bit microcontroller
  EM_FR30 = 84, //Fujitsu FR30
  EM_D10V = 85, //Mitsubishi D10V
  EM_D30V = 86, //Mitsubishi D30V
  EM_V850 = 87, //NEC v850
  EM_M32R = 88, //Mitsubishi M32R
  EM_MN10300 = 89, //Matsushita MN10300
  EM_MN10200 = 90, //Matsushita MN10200
  EM_PJ = 91, //picoJava
  EM_OPENRISC = 92, //OpenRISC 32-bit embedded processor
  EM_ARC_COMPACT = 93, //ARC International ARCompact processor (old spelling/synonym: EM_ARC_A5)
  EM_XTENSA = 94, //Tensilica Xtensa Architecture
  EM_VIDEOCORE = 95, //Alphamosaic VideoCore processor
  EM_TMM_GPP = 96, //Thompson Multimedia General Purpose Processor
  EM_NS32K = 97, //National Semiconductor 32000 series
  EM_TPC = 98, //Tenor Network TPC processor
  EM_SNP1K = 99, //Trebia SNP 1000 processor
  EM_ST200 = 100, //STMicroelectronics (www.st.com) ST200 microcontroller
  EM_IP2K = 101, //Ubicom IP2xxx microcontroller family
  EM_MAX = 102, //MAX Processor
  EM_CR = 103, //National Semiconductor CompactRISC microprocessor
  EM_F2MC16 = 104, //Fujitsu F2MC16
  EM_MSP430 = 105, //Texas Instruments embedded microcontroller msp430
  EM_BLACKFIN = 106, //Analog Devices Blackfin (DSP) processor
  EM_SE_C33 = 107, //S1C33 Family of Seiko Epson processors
  EM_SEP = 108, //Sharp embedded microprocessor
  EM_ARCA = 109, //Arca RISC Microprocessor
  EM_UNICORE = 110, //Microprocessor series from PKU-Unity Ltd. and MPRC of Peking University
  EM_EXCESS = 111, //eXcess: 16/32/64-bit configurable embedded CPU
  EM_DXP = 112, //Icera Semiconductor Inc. Deep Execution Processor
  EM_ALTERA_NIOS2 = 113, //Altera Nios II soft-core processor
  EM_CRX = 114, //National Semiconductor CompactRISC CRX microprocessor
  EM_XGATE = 115, //Motorola XGATE embedded processor
  EM_C166 = 116, //Infineon C16x/XC16x processor
  EM_M16C = 117, //Renesas M16C series microprocessors
  EM_DSPIC30F = 118, //Microchip Technology dsPIC30F Digital Signal Controller
  EM_CE = 119, //Freescale Communication Engine RISC core
  EM_M32C = 120, //Renesas M32C series microprocessors
  //reserved = 121-130, //Reserved for future use
  EM_TSK3000 = 131, //Altium TSK3000 core
  EM_RS08 = 132, //Freescale RS08 embedded processor
  EM_SHARC = 133, //Analog Devices SHARC family of 32-bit DSP processors
  EM_ECOG2 = 134, //Cyan Technology eCOG2 microprocessor
  EM_SCORE7 = 135, //Sunplus S+core7 RISC processor
  EM_DSP24 = 136, //New Japan Radio (NJR) 24-bit DSP Processor
  EM_VIDEOCORE3 = 137, //Broadcom VideoCore III processor
  EM_LATTICEMICO32 = 138, //RISC processor for Lattice FPGA architecture
  EM_SE_C17 = 139, //Seiko Epson C17 family
  EM_TI_C6000 = 140, //The Texas Instruments TMS320C6000 DSP family
  EM_TI_C2000 = 141, //The Texas Instruments TMS320C2000 DSP family
  EM_TI_C5500 = 142, //The Texas Instruments TMS320C55x DSP family
  EM_TI_ARP32 = 143, //Texas Instruments Application Specific RISC Processor, 32bit fetch
  EM_TI_PRU = 144, //Texas Instruments Programmable Realtime Unit
  //reserved = 145-159, //Reserved for future use
  EM_MMDSP_PLUS = 160, //STMicroelectronics 64bit VLIW Data Signal Processor
  EM_CYPRESS_M8C = 161, //Cypress M8C microprocessor
  EM_R32C = 162, //Renesas R32C series microprocessors
  EM_TRIMEDIA = 163, //NXP Semiconductors TriMedia architecture family
  EM_QDSP6 = 164, //QUALCOMM DSP6 Processor
  EM_8051 = 165, //Intel 8051 and variants
  EM_STXP7X = 166, //STMicroelectronics STxP7x family of configurable and extensible RISC processors
  EM_NDS32 = 167, //Andes Technology compact code size embedded RISC processor family
  EM_ECOG1X = 168, //Cyan Technology eCOG1X family
  EM_MAXQ30 = 169, //Dallas Semiconductor MAXQ30 Core Micro-controllers
  EM_XIMO16 = 170, //New Japan Radio (NJR) 16-bit DSP Processor
  EM_MANIK = 171, //M2000 Reconfigurable RISC Microprocessor
  EM_CRAYNV2 = 172, //Cray Inc. NV2 vector architecture
  EM_RX = 173, //Renesas RX family
  EM_METAG = 174, //Imagination Technologies META processor architecture
  EM_MCST_ELBRUS = 175, //MCST Elbrus general purpose hardware architecture
  EM_ECOG16 = 176, //Cyan Technology eCOG16 family
  EM_CR16 = 177, //National Semiconductor CompactRISC CR16 16-bit microprocessor
  EM_ETPU = 178, //Freescale Extended Time Processing Unit
  EM_SLE9X = 179, //Infineon Technologies SLE9X core
  EM_L10M = 180, //Intel L10M
  EM_K10M = 181, //Intel K10M
  //reserved = 182, //Reserved for future Intel use
  EM_AARCH64 = 183, //ARM 64-bit architecture (AARCH64)
  //reserved = 184, //Reserved for future ARM use
  EM_AVR32 = 185, //Atmel Corporation 32-bit microprocessor family
  EM_STM8 = 186, //STMicroeletronics STM8 8-bit microcontroller
  EM_TILE64 = 187, //Tilera TILE64 multicore architecture family
  EM_TILEPRO = 188, //Tilera TILEPro multicore architecture family
  EM_MICROBLAZE = 189, //Xilinx MicroBlaze 32-bit RISC soft processor core
  EM_CUDA = 190, //NVIDIA CUDA architecture
  EM_TILEGX = 191, //Tilera TILE-Gx multicore architecture family
  EM_CLOUDSHIELD = 192, //CloudShield architecture family
  EM_COREA_1ST = 193, //KIPO-KAIST Core-A 1st generation processor family
  EM_COREA_2ND = 194, //KIPO-KAIST Core-A 2nd generation processor family
  EM_ARC_COMPACT2 = 195, //Synopsys ARCompact V2
  EM_OPEN8 = 196, //Open8 8-bit RISC soft processor core
  EM_RL78 = 197, //Renesas RL78 family
  EM_VIDEOCORE5 = 198, //Broadcom VideoCore V processor
  EM_78KOR = 199, //Renesas 78KOR family
  EM_56800EX = 200, //Freescale 56800EX Digital Signal Controller (DSC)
  EM_BA1 = 201, //Beyond BA1 CPU architecture
  EM_BA2 = 202, //Beyond BA2 CPU architecture
  EM_XCORE = 203, //XMOS xCORE processor family
  EM_MCHP_PIC = 204, //Microchip 8-bit PIC(r) family
  EM_INTEL205 = 205, //Reserved by Intel
  EM_INTEL206 = 206, //Reserved by Intel
  EM_INTEL207 = 207, //Reserved by Intel
  EM_INTEL208 = 208, //Reserved by Intel
  EM_INTEL209 = 209, //Reserved by Intel
  EM_KM32 = 210, //KM211 KM32 32-bit processor
  EM_KMX32 = 211, //KM211 KMX32 32-bit processor
  EM_KMX16 = 212, //KM211 KMX16 16-bit processor
  EM_KMX8 = 213, //KM211 KMX8 8-bit processor
  EM_KVARC = 214, //KM211 KVARC processor
  EM_CDP = 215, //Paneve CDP architecture family
  EM_COGE = 216, //Cognitive Smart Memory Processor
  EM_COOL = 217, //Bluechip Systems CoolEngine
  EM_NORC = 218, //Nanoradio Optimized RISC
  EM_CSR_KALIMBA = 219, //CSR Kalimba architecture family
  EM_Z80 = 220, //Zilog Z80
  EM_VISIUM = 221, //Controls and Data Services VISIUMcore processor
  EM_FT32 = 222, //FTDI Chip FT32 high performance 32-bit RISC architecture
  EM_MOXIE = 223, //Moxie processor family
  EM_AMDGPU = 224, //AMD GPU architecture
  EM_RISCV = 243, //RISC-V

  EM_ALPHA1=0x9026
)

TEVersion enum EWord (
  EV_NONE=0, //Invalid Version
  EV_CURRENT=1 //Current version
)

PProgHdrTbl ^TProgHdrTbl near=EOff
PSectionsTbl ^TSectionsTbl near=EOff

TSectionNDX enum EHalf (
  SHN_UNDEF=0,
  SHN_LORESERVE=0xff00,
//  SHN_LOPROC=0xff00,
  SHN_HIPROC=0xff1f,
  SHN_ABS=0xfff1,
  SHN_COMMON=0xfff2,
  SHN_HIRESERVE=0xffff
)

TE_Machine_Flags forward //EWord

TEHdr struc
  TEType e_type
  TEMachine e_machine
  TEVersion e_version
  EAddr e_entry     //Virt. addr of entry point (0 - No entry point)
  PProgHdrTbl e_phoff //program header table's file offset (0 - No ph. offs.)
  PSectionsTbl e_shoff     //section header table's file offset (0 - No sh. offs.)
  TE_Machine_Flags e_flags     //processor-specific flags
  EHalf e_ehsize    //Header size
  EHalf e_phentsize //size of one entry in the program header table
  EHalf e_phnum     //number of entries in the program header table
  EHalf e_shentsize //section header size
  EHalf e_shnum     //number of entries in the section header table
  TSectionNDX e_shstrndx  //section header table index of the entry associated
                    //with the section name string table (=SHN_UNDEF => No table).
  raw[] rest
ends:[@:Size=@.e_ehsize-0x10]

data
Ident:Size TEHdr Hdr

type

TSectionType enum EWord (
  SHT_NULL=0,
  SHT_PROGBITS=1,
  SHT_SYMTAB=2,
  SHT_STRTAB=3,
  SHT_RELA=4,
  SHT_HASH=5,
  SHT_DYNAMIC=6,
  SHT_NOTE=7,
  SHT_NOBITS=8,
  SHT_REL=9,
  SHT_SHLIB=10,
  SHT_DYNSYM=11,
  SHT_INIT_ARRAY=14,
  SHT_FINI_ARRAY=15,
  SHT_PREINIT_ARRAY=16,
  SHT_GROUP=17,
  SHT_SYMTAB_SHNDX=18,
  SHT_LOPROC=0x70000000,
  SHT_HIPROC=0x7fffffff,
  SHT_LOUSER=0x80000000,
  SHT_HIUSER=0xffffffff
)

TSectionFlags set MemWidth of (
  SHF_WRITE ^ 1, //The section contains data that should be writable during process execution
  SHF_ALLOC ^ 2, //The section occupies memory during process execution
  SHF_EXECINSTR ^ 4, //The section contains executable machine instructions
  SHF_MERGE ^ 0x10, //The data in the section may be merged to eliminate duplication.
    //Unless the SHF_STRINGS flag is also set, the data elements in the section are
    //of a uniform size. The size of each element is specified in the section header's
    //sh_entsize field. If the SHF_STRINGS flag is also set, the data elements consist
    //of null-terminated character strings. The size of each character is specified
    //in the section header's sh_entsize field.
  SHF_STRINGS ^ 0x20, //The data elements in the section consist of null-terminated character strings
  SHF_INFO_LINK ^ 0x40, //The sh_info field of this section header holds a section header table index
  SHF_LINK_ORDER ^ 0x80, //This flag adds special ordering requirements for link editors
  SHF_OS_NONCONFORMING ^ 0x100, //This section requires special OS-specific processing
  SHF_GROUP ^ 0x200, //This section is a member (perhaps the only one) of a section group.
    //The section must be referenced by a section of type SHT_GROUP
  SHF_TLS ^ 0x400, //This section holds Thread-Local Storage, meaning that each separate
    //execution flow has its own distinct instance of this data.
  SHF_COMPRESSED ^ 0x800 //This flag identifies a section containing compressed data.
)

// Processor Specific definitions
%$IF Hdr.e_machine=TEMachine.EM_386; //Intel 80386
  include elf_386.rfi
%$ELSIF Hdr.e_machine=TEMachine.EM_SPARC; //SPARC
  include elfSPARC.rfi
%$ELSIF Hdr.e_machine=TEMachine.EM_M32; //AT&T WE 32100
  include elf_M32.rfi
%$ELSIF Hdr.e_machine=TEMachine.EM_PPC; /* PowerPC */
  include elf_ppc.rfi
%$ELSIF Hdr.e_machine=TEMachine.EM_ARM; /* ARM 32-bit architecture (AARCH32) */
  include elf_arm.rfi
%$ELSE
 type
  TE_R_TYPE ER_TYPE
  TE_Machine_Flags EWord
%$END Machine

type
//TStrNDX/*(hSec)*/ EWord//forward
TSecNameNDX(refbase) ^pchar hideref near=EWord,ref=@+@:refbase; :
  displ=(@^,'{',@,'}')

/*
const
//TSection.sh_flags
  SHF_WRITE=0x1
  SHF_ALLOC=0x2
  SHF_EXECINSTR=0x4
  SHF_MASKPROC=0xf0000000 //Processor specific
*/

type

//TRawSectionData(Sz) raw[@:Sz]
TRawSectionData raw[]
TSymTab(Sz,hSymSec) forward
TERelTbl(Sz,hSymSec) forward
TERelATbl(Sz,hSymSec) forward
TENoteTbl(Sz) forward
TDynamicSec(Sz,hSymSec) forward
THashTblSec(Sz) forward
TGroupSec(Sz) forward

TSectionData(Sz,Tp,hSymSec) case TSectionType @:Tp of
  SHT_SYMTAB,SHT_DYNSYM: TSymTab(@:Sz,@:hSymSec)
  SHT_REL: TERelTbl(@:Sz,@:hSymSec)
  SHT_RELA: TERelATbl(@:Sz,@:hSymSec)
  SHT_NOTE: TENoteTbl(@:Sz)
  SHT_DYNAMIC: TDynamicSec(@:Sz,@:hSymSec)
  SHT_HASH: THashTblSec(@:Sz)
  SHT_GROUP: TGroupSec(@:Sz)
  else TRawSectionData(@:Sz)
endc:[@:Size=@:Sz]

PSectionData(Sz,Tp,hSymSec) ^TSectionData(@:Sz,@:Tp,@:hSymSec) nil:
  (@:Tp=TSectionType.SHT_NOBITS)or(@:Tp=TSectionType.SHT_NULL)or(@=0) near=EOff

TSection forward

TSectionsTbl array[Hdr.e_shnum] of TSection

TSectionNDXW ESWord()
TSymNDX(hSymSec) ESWord()

TSection struc
// TStrNDX/*(Hdr.e_shstrndx)*/ sh_name
  TSecNameNDX sh_name
  TSectionType sh_type
  TSectionFlags sh_flags
  EAddr sh_addr
  PSectionData(Tp=@.sh_type) sh_offset
  EXWord sh_size
  TSectionNDXW sh_link
  case @.sh_type of
    SHT_REL,SHT_RELA: TSectionNDXW
    SHT_GROUP: TSymNDX(@@.sh_link)
  else ESWord
  endc sh_info
  EXWord sh_addralign
  EXWord sh_entsize
  raw[] sh_rest
ends:[@:Size=Hdr.e_shentsize,@.sh_offset:Sz=@.sh_size,@.sh_name:refbase=
  Hdr.e_shoff^[Hdr.e_shstrndx].sh_offset exc 0x10000000,
  @.sh_offset:hSymSec=@.sh_link
]:autoname=('SEC(',INT(@:#),')_',@.sh_name^)

TSectionNDX:displ=(Hdr.e_shoff^[@].sh_name^,'{',@,'}')
TSectionNDXW:displ=(Hdr.e_shoff^[@].sh_name^,'{',@,'}')

//TStrNDX/*(hSec)*/ ^pchar - Hdr.e_shoff^[/*@:hSec*/Hdr.e_shstrndx].
//  sh_offset exc 0x10000000 hideref near=TStrNDX :displ=(@^,'{',@,'}')

type

TProgHdrType enum EWord (
  PT_NULL=0,
  PT_LOAD=1,
  PT_DYNAMIC=2,
  PT_INTERP=3,
  PT_NOTE=4,
  PT_SHLIB=5,
  PT_PHDR=6,
  PT_LOPROC=0x70000000,
  PT_HIPROC=0x7fffffff
)

TProgHdrFlags set 32 of (
  PF_X=0,
  PF_W=1,
  PF_R=2
) //??? - guess values

TProgHdrEntry struc
  TProgHdrType p_type
  EOff p_ofs
  EAddr p_vaddr
  EAddr p_paddr
  EWord p_filesz
  EWord p_memsz
  TProgHdrFlags p_flags
  EWord p_align
  raw[] p_rest
ends:[@:Size=Hdr.e_phentsize]

TProgHdrTbl array[Hdr.e_phnum] of TProgHdrEntry

//autoname
//TSection .sh_name^ SEC_

/*** Symbol tables ***/

type

TStrNDX(hSec) ^pchar hideref near=EWord,ref=@+Hdr.e_shoff^[@:hSec].sh_offset exc 0x10000000; :
  displ=(@^,'{',@,'}')

set byteorder norm
type bit
  TBit2 num+(2)
  TBit4 num+(4)
  TBit6 num+(6)

//symbol's binding determines the linkage visibility and behavior
//st_info shr 4

TE_ST_Bind enum TBit4 (
  STB_LOCAL=0, //Local symbols are not visible outside the file
  STB_GLOBAL=1, //Global symbols are visible to all files
  STB_WEAK=2, //Like global but with lower precedence
  STB_LOPROC=13, //Processor-specific
  STB_HIPROC=15  //
)

//symbol's type provides a general classi\256cation for the associated entity
//st_info and 0xF
TE_ST_Type enum TBit4 (
  STT_NOTYPE=0, //Type is not specified
  STT_OBJECT=1, //Data object (variable,array,etc.)
  STT_FUNC=2, //Function or other executable code
  STT_SECTION=3, //Section (for relocation and almost always are STB_LOCAL)
  STT_FILE=4, //Name of the source file
  STT_COMMON=5, //The symbol labels an uninitialized common block
  STT_TLS=6, //The symbol specifies a Thread-Local Storage entity.
  STT_LOPROC=13, //Processor-specific
  STT_HIPROC=15  //
)

TE_ST_Info struc
  TE_ST_Type Typ
  TE_ST_Bind Bind
ends            

TST_OTHER_Visibility enum TBit2 (
  STV_DEFAULT=0,
  STV_INTERNAL=1,
  STV_HIDDEN=2,
  STV_PROTECTED=3
)

TE_ST_Other struc
  TST_OTHER_Visibility Visibility
  TBit6 Rest
ends            

set byteorder rev=(Ident.ei_encoding=TElfEncoding.ELFDATA2MSB);

type
%$IF Ident.ei_class=TElfClass.ELFCLASS64;
TSymEntry(hSymSec) struc
// TStrNDX(@:hSymSec) st_name
  TSecNameNDX(Hdr.e_shoff^[@:hSymSec].sh_offset exc 0x10000000) st_name
  TE_ST_Info st_info
  TE_ST_Other st_other
  TSectionNDX st_sh_ndx
  EAddr st_value
  EWord st_size
ends                                                              

TE_R_SYM(hSymSec) num+(4)
%$ELSE
TSymEntry(hSymSec) struc
// TStrNDX(@:hSymSec) st_name
  TSecNameNDX(Hdr.e_shoff^[@:hSymSec].sh_offset exc 0x10000000) st_name
  EAddr st_value
  EWord st_size
  TE_ST_Info st_info
  TE_ST_Other st_other
  TSectionNDX st_sh_ndx
ends                                                              

TE_R_SYM(hSymSec) num+(3)
%$END

TSymTab(Sz,hSymSec) array of TSymEntry(@:hSymSec):[@:Size=@:Sz]

TSymNDX:displ=(Hdr.e_shoff^[@:hSymSec].sh_offset^.SHT_SYMTAB[@].st_name,'{',@,'}')
TE_R_SYM:displ=(Hdr.e_shoff^[@:hSymSec].sh_offset^.SHT_SYMTAB[@].st_name,'{',@,'}')

/*** Relocation ***/

TE_R_INFO(hSymSec) struc byteorder
  TE_R_TYPE Typ
  TE_R_SYM(@:hSymSec) hSym
ends

type
TERel(hSymSec) struc
  EAddr r_ofs
  TE_R_INFO(@:hSymSec)/*EWord*/ r_info
ends

TERelTbl(Sz,hSymSec) array of TERel(@:hSymSec):[@:Size=@:Sz]

TERelA(hSymSec) struc
  EAddr r_ofs
  TE_R_INFO(@:hSymSec)/*EWord*/ r_info
  ESWord r_addend
ends

TERelATbl(Sz,hSymSec) array of TERelA(@:hSymSec):[@:Size=@:Sz]

/*** Notes ***/

TNoteRec struc
  EWord NameSz
  EWord DescSz
  EWord Typ
  array[(@.NameSz+7)and 0xFFFFFFF8] of Char Name
  array[(@.DescSz+7)and 0xFFFFFFF8] of Char Desc
ends

TENoteTbl(Sz) array of TNoteRec:[@:Size=@:Sz]

/*** Dynamic ***/

TDynRecTag enum ESWord (
DT_NULL=0, //ignored | end of array
DT_NEEDED=1, //d_val
DT_PLTRELSZ=2,//d_val
DT_PLTGOT=3, //d_ptr
DT_HASH=4, //d_ptr
DT_STRTAB=5, //d_ptr |address of the string table
DT_SYMTAB=6, //d_ptr
DT_RELA=7, //d_ptr
DT_RELASZ=8, //d_val
DT_RELAENT=9, //d_val
DT_STRSZ=10, //d_val
DT_SYMENT=11, //d_val
DT_INIT=12, //d_ptr
DT_FINI=13, //d_ptr
DT_SONAME=14, //d_val
DT_RPATH=15, //d_val
DT_SYMBOLIC=16, //ignored
DT_REL=17, //d_ptr
DT_RELSZ=18, //d_val
DT_RELENT=19, //d_val
DT_PLTREL=20, //d_val
DT_DEBUG=21, //d_ptr
DT_TEXTREL=22, //ignored
DT_JMPREL=23, //d_ptr
DT_LOPROC=0x70000000,//unspecified
DT_HIPROC=0x7fffffff //unspecified
)

TEDynRec(hSymSec) struc
  TDynRecTag d_tag
  case @.d_tag of
   DT_NEEDED,DT_SONAME,DT_RPATH: //TStrNDX(@@:hSymSec)
     TSecNameNDX(Hdr.e_shoff^[@@:hSymSec].sh_offset /*exc 0x10000000*/)
  else EWord
  endc d_val
ends

TEDynTbl(hSymSec) array of TEDynRec(@:hSymSec) ?@.d_tag=TDynRecTag.DT_NULL;

TDynamicSec(Sz,hSymSec) struc
  TEDynTbl(@:hSymSec) Tbl
  raw[] rest
ends:[@:Size=@:Sz]

/*** Hash table ***/

THashTblSec(Sz) struc
  ESWord nbucket
  ESWord nchain
  array[@.nbucket] of ESWord bucket
  array[@.nchain] of ESWord chain
  raw[] rest
ends:[@:Size=@:Sz]

/* Groups */

TGroupSecFlags set 32 of (
  GRP_COMDAT ^ 0x1
  //GRP_MASKOS 0x0ff00000 //reserved for operating system-specific semantics
  //GRP_MASKPROC 0xf0000000 //reserved for processor-specific semantics
)

TGroupSec(Sz) struc
  TGroupSecFlags Flags
  array of TSectionNDXW Parts
ends:[@:Size=@:Sz]



Other specifications.


FlexT home page, Author`s home page.