diff --git a/erlang/apps/lib/include/pdp10_elf36.hrl b/erlang/apps/lib/include/pdp10_elf36.hrl new file mode 100644 index 0000000..c931775 --- /dev/null +++ b/erlang/apps/lib/include/pdp10_elf36.hrl @@ -0,0 +1,1166 @@ +%%% -*- erlang-indent-level: 2 -*- +%%% +%%% pdp10_elf36.hrl -- ELF definitions for PDP10 +%%% Copyright (C) 2013-2019 Mikael Pettersson +%%% +%%% This file is part of pdp10-tools. +%%% +%%% pdp10-tools is free software: you can redistribute it and/or modify +%%% it under the terms of the GNU General Public License as published by +%%% the Free Software Foundation, either version 3 of the License, or +%%% (at your option) any later version. +%%% +%%% pdp10-tools is distributed in the hope that it will be useful, +%%% but WITHOUT ANY WARRANTY; without even the implied warranty of +%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +%%% GNU General Public License for more details. +%%% +%%% You should have received a copy of the GNU General Public License +%%% along with pdp10-tools. If not, see . +%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% +%%% This is essentially the standard Elf32 declarations with 8/16/32-bit +%%% primitive types replaced by 9/18/36-bit primitive types, and Elf32 +%%% replaced by elf36. + +-ifndef(PDP10_ELF36_HRL). +-define(PDP10_ELF36_HRL, 1). + +-include("pdp10_stdint.hrl"). + +-type elf36_Addr() :: uint36_t(). +-type elf36_Half() :: uint18_t(). +-type elf36_Off() :: uint36_t(). +-type elf36_Sword() :: int36_t(). +-type elf36_Uchar() :: uint9_t(). +-type elf36_Word() :: uint36_t(). + +%% ELF Header + +-define(EI_NIDENT, 16). + +-record(elf36_Ehdr, + { e_ident :: [elf36_Uchar()] % ELF magic, ?EI_NIDENT elements + , e_type :: elf36_Half() % Identifies object file type + , e_machine :: elf36_Half() % Specifies required architecture + , e_version :: elf36_Word() % Identifies object file version + , e_entry :: elf36_Addr() % Entry point virtual address + , e_phoff :: elf36_Off() % Program header table file offset + , e_shoff :: elf36_Off() % Section header table file offset + , e_flags :: elf36_Word() % Processor-specific flags + , e_ehsize :: elf36_Half() % ELF header size in bytes + , e_phentsize :: elf36_Half() % Program header table entry size + , e_phnum :: elf36_Half() % Program header table entry count + , e_shentsize :: elf36_Half() % Section header table entry size + , e_shnum :: elf36_Half() % Section header table entry count + , e_shstrndx :: elf36_Half() % Section header string table index + }). + +-define(ELF36_EHDR_SIZEOF, (8 * 2 + 5 * 4 + ?EI_NIDENT)). + +%% e_ident[] identification indexes + +-define(EI_MAG0, 0). % File identification byte 0 index +-define(EI_MAG1, 1). % File identification byte 1 index +-define(EI_MAG2, 2). % File identification byte 2 index +-define(EI_MAG3, 3). % File identification byte 3 index +-define(EI_CLASS, 4). % File class +-define(EI_DATA, 5). % Data encoding +-define(EI_VERSION, 6). % File version +-define(EI_OSABI, 7). % Operating System/ABI indication +-define(EI_ABIVERSION, 8). % ABI version +-define(EI_PAD, 9). % Start of padding bytes + +-define(ELFMAG0, 16#7F). % Magic number byte 0 +-define(ELFMAG1, $E). % Magic number byte 1 +-define(ELFMAG2, $L). % Magic number byte 2 +-define(ELFMAG3, $F). % Magic number byte 3 + +-define(ELFCLASSNONE, 0). % Invalid class +-define(ELFCLASS32, 1). % 32-bit objects +-define(ELFCLASS64, 2). % 64-bit objects +-define(ELFCLASS36, 36). % 36-bit objects (Elf36 extension) + +-define(ELFDATANONE, 0). % Invalid data encoding +-define(ELFDATA2LSB, 1). % 2's complement, little endian +-define(ELFDATA2MSB, 2). % 2's complement, big endian + +-define(ELFOSABI_NONE, 0). % UNIX System V ABI +-define(ELFOSABI_HPUX, 1). % HP-UX operating system +-define(ELFOSABI_NETBSD, 2). % NetBSD +-define(ELFOSABI_GNU, 3). % GNU +-define(ELFOSABI_LINUX, 3). % Alias for ELFOSABI_GNU +-define(ELFOSABI_SOLARIS, 6). % Solaris +-define(ELFOSABI_AIX, 7). % AIX +-define(ELFOSABI_IRIX, 8). % IRIX +-define(ELFOSABI_FREEBSD, 9). % FreeBSD +-define(ELFOSABI_TRU64, 10). % TRU64 UNIX +-define(ELFOSABI_MODESTO, 11). % Novell Modesto +-define(ELFOSABI_OPENBSD, 12). % OpenBSD +-define(ELFOSABI_OPENVMS, 13). % OpenVMS +-define(ELFOSABI_NSK, 14). % Hewlett-Packard Non-Stop Kernel +-define(ELFOSABI_AROS, 15). % AROS +-define(ELFOSABI_FENIXOS, 16). % FenixOS +-define(ELFOSABI_CLOUDABI, 17). % Nuxi CloudABI +-define(ELFOSABI_OPENVOS, 18). % Stratus Technologies OpenVOS +-define(ELFOSABI_C6000_ELFABI, 64). % Bare-metal TMS320C6000 +-define(ELFOSABI_C6000_LINUX, 65). % Linux TMS320C6000 +-define(ELFOSABI_ARM, 97). % ARM +-define(ELFOSABI_STANDALONE, 255). % Standalone (embedded) application + +%% Values for e_type, which identifies the object file type. + +-define(ET_NONE, 0). % No file type +-define(ET_REL, 1). % Relocatable file +-define(ET_EXEC, 2). % Executable file +-define(ET_DYN, 3). % Shared object file +-define(ET_CORE, 4). % Core file +-define(ET_LOOS, 16#FE00). % Operating system-specific +-define(ET_HIOS, 16#FEFF). % Operating system-specific +-define(ET_LOPROC, 16#FF00). % Processor-specific +-define(ET_HIPROC, 16#FFFF). % Processor-specific + +%% Values for e_machine, which identifies the architecture. These numbers +%% are officially assigned by registry@sco.com. See below for a list of +%% ad-hoc numbers used during initial development. + +-define(EM_NONE, 0). % No 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 m68k family +-define(EM_88K, 5). % Motorola m88k family +-define(EM_IAMCU, 6). % Intel MCU (was: Intel 80486) +-define(EM_860, 7). % Intel 80860 +-define(EM_MIPS, 8). % MIPS R3000 (officially, big-endian only) +-define(EM_S370, 9). % IBM System/370 +-define(EM_MIPS_RS3_LE, 10). % MIPS R3000 little-endian (Oct 4 1999 Draft) Deprecated +-define(EM_res011, 11). % Reserved +-define(EM_res012, 12). % Reserved +-define(EM_res013, 13). % Reserved +-define(EM_res014, 14). % Reserved +-define(EM_PARISC, 15). % HPPA +-define(EM_res016, 16). % Reserved +-define(EM_VPP550, 17). % Fujitsu VPP500 +-define(EM_SPARC32PLUS, 18). % Sun's "v8plus" +-define(EM_960, 19). % Intel 80960 +-define(EM_PPC, 20). % PowerPC +-define(EM_PPC64, 21). % 64-bit PowerPC +-define(EM_S390, 22). % IBM S/390 +-define(EM_SPU, 23). % Sony/Toshiba/IBM SPU +-define(EM_res024, 24). % Reserved +-define(EM_res025, 25). % Reserved +-define(EM_res026, 26). % Reserved +-define(EM_res027, 27). % Reserved +-define(EM_res028, 28). % Reserved +-define(EM_res029, 29). % Reserved +-define(EM_res030, 30). % Reserved +-define(EM_res031, 31). % Reserved +-define(EM_res032, 32). % Reserved +-define(EM_res033, 33). % Reserved +-define(EM_res034, 34). % Reserved +-define(EM_res035, 35). % Reserved +-define(EM_V800, 36). % NEC V800 series +-define(EM_FR20, 37). % Fujitsu FR20 +-define(EM_RH32, 38). % TRW RH32 +-define(EM_MCORE, 39). % Motorola M*Core (May also be taken by Fujitsu MMA) +-define(EM_RCE, 39). % Old name for MCore +-define(EM_ARM, 40). % ARM +-define(EM_OLD_ALPHA, 41). % Digital Alpha +-define(EM_SH, 42). % Renesas (formerly Hitachi) / SuperH SH +-define(EM_SPARCV9, 43). % SPARC v9 64-bit +-define(EM_TRICORE, 44). % Siemens Tricore embedded processor +-define(EM_ARC, 45). % ARC Cores +-define(EM_H8_300, 46). % Renesas (formerly Hitachi) H8/300 +-define(EM_H8_300H, 47). % Renesas (formerly Hitachi) H8/300H +-define(EM_H8S, 48). % Renesas (formerly Hitachi) H8S +-define(EM_H8_500, 49). % Renesas (formerly Hitachi) H8/500 +-define(EM_IA_64, 50). % Intel IA-64 Processor +-define(EM_MIPS_X, 51). % Stanford MIPS-X +-define(EM_COLDFIRE, 52). % Motorola Coldfire +-define(EM_68HC12, 53). % Motorola M68HC12 +-define(EM_MMA, 54). % Fujitsu Multimedia Accelerator +-define(EM_PCP, 55). % Siemens PCP +-define(EM_NCPU, 56). % Sony nCPU embedded RISC processor +-define(EM_NDR1, 57). % Denso NDR1 microprocessor +-define(EM_STARCORE, 58). % Motorola Star*Core processor +-define(EM_ME16, 59). % Toyota ME16 processor +-define(EM_ST100, 60). % STMicroelectronics ST100 processor +-define(EM_TINYJ, 61). % Advanced Logic Corp. TinyJ embedded processor +-define(EM_X86_64, 62). % Advanced Micro Devices X86-64 processor +-define(EM_PDSP, 63). % Sony DSP Processor +-define(EM_PDP10, 64). % Digital Equipment Corp. PDP-10 +-define(EM_PDP11, 65). % Digital Equipment Corp. PDP-11 +-define(EM_FX66, 66). % Siemens FX66 microcontroller +-define(EM_ST9PLUS, 67). % STMicroelectronics ST9+ 8/16 bit microcontroller +-define(EM_ST7, 68). % STMicroelectronics ST7 8-bit microcontroller +-define(EM_68HC16, 69). % Motorola MC68HC16 Microcontroller +-define(EM_68HC11, 70). % Motorola MC68HC11 Microcontroller +-define(EM_68HC08, 71). % Motorola MC68HC08 Microcontroller +-define(EM_68HC05, 72). % Motorola MC68HC05 Microcontroller +-define(EM_SVX, 73). % Silicon Graphics SVx +-define(EM_ST19, 74). % STMicroelectronics ST19 8-bit cpu +-define(EM_VAX, 75). % Digital VAX +-define(EM_CRIS, 76). % Axis Communications 32-bit embedded processor +-define(EM_JAVELIN, 77). % Infineon Technologies 32-bit embedded cpu +-define(EM_FIREPATH, 78). % Element 14 64-bit DSP processor +-define(EM_ZSP, 79). % LSI Logic's 16-bit DSP processor +-define(EM_MMIX, 80). % Donald Knuth's educational 64-bit processor +-define(EM_HUANY, 81). % Harvard's machine-independent format +-define(EM_PRISM, 82). % SiTera Prism +-define(EM_AVR, 83). % Atmel AVR 8-bit microcontroller +-define(EM_FR30, 84). % Fujitsu FR30 +-define(EM_D10V, 85). % Mitsubishi D10V +-define(EM_D30V, 86). % Mitsubishi D30V +-define(EM_V850, 87). % Renesas V850 (formerly NEC V850) +-define(EM_M32R, 88). % Renesas M32R (formerly Mitsubishi M32R) +-define(EM_MN10300, 89). % Matsushita MN10300 +-define(EM_MN10200, 90). % Matsushita MN10200 +-define(EM_PJ, 91). % picoJava +-define(EM_OPENRISC, 92). % OpenRISC 32-bit embedded processor +-define(EM_ARC_COMPACT, 93). % ARC International ARCompact processor +-define(EM_XTENSA, 94). % Tensilica Xtensa Architecture +-define(EM_VIDEOCORE, 95). % Alphamosaic VideoCore processor +-define(EM_TMM_GPP, 96). % Thompson Multimedia General Purpose Processor +-define(EM_NS32K, 97). % National Semiconductor 32000 series +-define(EM_TPC, 98). % Tenor Network TPC processor +-define(EM_SNP1K, 99). % Trebia SNP 1000 processor +-define(EM_ST200, 100). % STMicroelectronics ST200 microcontroller +-define(EM_IP2K, 101). % Ubicom IP2022 micro controller +-define(EM_MAX, 102). % MAX Processor +-define(EM_CR, 103). % National Semiconductor CompactRISC +-define(EM_F2MC16, 104). % Fujitsu F2MC16 +-define(EM_MSP430, 105). % TI msp430 micro controller +-define(EM_BLACKFIN, 106). % ADI Blackfin +-define(EM_SE_C33, 107). % S1C33 Family of Seiko Epson processors +-define(EM_SEP, 108). % Sharp embedded microprocessor +-define(EM_ARCA, 109). % Arca RISC Microprocessor +-define(EM_UNICORE, 110). % Microprocessor series from PKU-Unity Ltd. and MPRC of Peking University +-define(EM_EXCESS, 111). % eXcess: 16/32/64-bit configurable embedded CPU +-define(EM_DXP, 112). % Icera Semiconductor Inc. Deep Execution Processor +-define(EM_ALTERA_NIOS2,113). % Altera Nios II soft-core processor +-define(EM_CRX, 114). % National Semiconductor CRX +-define(EM_XGATE, 115). % Motorola XGATE embedded processor +-define(EM_C166, 116). % Infineon C16x/XC16x processor +-define(EM_M16C, 117). % Renesas M16C series microprocessors +-define(EM_DSPIC30F, 118). % Microchip Technology dsPIC30F Digital Signal Controller +-define(EM_CE, 119). % Freescale Communication Engine RISC core +-define(EM_M32C, 120). % Renesas M32C series microprocessors +-define(EM_res121, 121). % Reserved +-define(EM_res122, 122). % Reserved +-define(EM_res123, 123). % Reserved +-define(EM_res124, 124). % Reserved +-define(EM_res125, 125). % Reserved +-define(EM_res126, 126). % Reserved +-define(EM_res127, 127). % Reserved +-define(EM_res128, 128). % Reserved +-define(EM_res129, 129). % Reserved +-define(EM_res130, 130). % Reserved +-define(EM_TSK3000, 131). % Altium TSK3000 core +-define(EM_RS08, 132). % Freescale RS08 embedded processor +-define(EM_SHARC, 133). % Analog Devices SHARC family of 32-bit DSP processors +-define(EM_ECOG2, 134). % Cyan Technology eCOG2 microprocessor +-define(EM_SCORE, 135). % Sunplus Score +-define(EM_SCORE7, 135). % Sunplus S+core7 RISC processor +-define(EM_DSP24, 136). % New Japan Radio (NJR) 24-bit DSP Processor +-define(EM_VIDEOCORE3, 137). % Broadcom VideoCore III processor +-define(EM_LATTICEMICO32,138). % RISC processor for Lattice FPGA architecture +-define(EM_SE_C17, 139). % Seiko Epson C17 family +-define(EM_TI_C6000, 140). % Texas Instruments TMS320C6000 DSP family +-define(EM_TI_C2000, 141). % Texas Instruments TMS320C2000 DSP family +-define(EM_TI_C5500, 142). % Texas Instruments TMS320C55x DSP family +-define(EM_TI_ARP32, 143). % Texas Instruments Application Specific RISC Processor, 32bit fetch +-define(EM_TI_PRU, 144). % Texas Instruments Programmable Realtime Unit +-define(EM_res145, 145). % Reserved +-define(EM_res146, 146). % Reserved +-define(EM_res147, 147). % Reserved +-define(EM_res148, 148). % Reserved +-define(EM_res149, 149). % Reserved +-define(EM_res150, 150). % Reserved +-define(EM_res151, 151). % Reserved +-define(EM_res152, 152). % Reserved +-define(EM_res153, 153). % Reserved +-define(EM_res154, 154). % Reserved +-define(EM_res155, 155). % Reserved +-define(EM_res156, 156). % Reserved +-define(EM_res157, 157). % Reserved +-define(EM_res158, 158). % Reserved +-define(EM_res159, 159). % Reserved +-define(EM_MMDSP_PLUS, 160). % STMicroelectronics 64bit VLIW Data Signal Processor +-define(EM_CYPRESS_M8C, 161). % Cypress M8C microprocessor +-define(EM_R32C, 162). % Renesas R32C series microprocessors +-define(EM_TRIMEDIA, 163). % NXP Semiconductors TriMedia architecture family +-define(EM_QDSP6, 164). % QUALCOMM DSP6 Processor +-define(EM_8051, 165). % Intel 8051 and variants +-define(EM_STXP7X, 166). % STMicroelectronics STxP7x family +-define(EM_NDS32, 167). % Andes Technology compact code size embedded RISC processor family +-define(EM_ECOG1, 168). % Cyan Technology eCOG1X family +-define(EM_ECOG1X, 168). % Cyan Technology eCOG1X family +-define(EM_MAXQ30, 169). % Dallas Semiconductor MAXQ30 Core Micro-controllers +-define(EM_XIMO16, 170). % New Japan Radio (NJR) 16-bit DSP Processor +-define(EM_MANIK, 171). % M2000 Reconfigurable RISC Microprocessor +-define(EM_CRAYNV2, 172). % Cray Inc. NV2 vector architecture +-define(EM_RX, 173). % Renesas RX family +-define(EM_METAG, 174). % Imagination Technologies META processor architecture +-define(EM_MCST_ELBRUS, 175). % MCST Elbrus general purpose hardware architecture +-define(EM_ECOG16, 176). % Cyan Technology eCOG16 family +-define(EM_CR16, 177). % National Semiconductor CompactRISC 16-bit processor +-define(EM_ETPU, 178). % Freescale Extended Time Processing Unit +-define(EM_SLE9X, 179). % Infineon Technologies SLE9X core +-define(EM_L1OM, 180). % Intel L1OM +-define(EM_K1OM, 181). % Intel K1OM +-define(EM_INTEL182, 182). % Reserved by Intel +-define(EM_AARCH64, 183). % ARM 64-bit architecture (AARCH64) +-define(EM_res184, 184). % Reserved by ARM +-define(EM_AVR32, 185). % Atmel Corporation 32-bit microprocessor family +-define(EM_STM8, 186). % STMicroeletronics STM8 8-bit microcontroller +-define(EM_TILE64, 187). % Tilera TILE64 multicore architecture family +-define(EM_TILEPRO, 188). % Tilera TILEPro multicore architecture family +-define(EM_MICROBLAZE, 189). % Xilinx MicroBlaze 32-bit RISC soft processor core +-define(EM_CUDA, 190). % NVIDIA CUDA architecture +-define(EM_TILEGX, 191). % Tilera TILE-Gx multicore architecture family +-define(EM_CLOUDSHIELD, 192). % CloudShield architecture family +-define(EM_COREA_1ST, 193). % KIPO-KAIST Core-A 1st generation processor family +-define(EM_COREA_2ND, 194). % KIPO-KAIST Core-A 2nd generation processor family +-define(EM_ARC_COMPACT2,195). % Synopsys ARCompact V2 +-define(EM_OPEN8, 196). % Open8 8-bit RISC soft processor core +-define(EM_RL78, 197). % Renesas RL78 family +-define(EM_VIDEOCORE5, 198). % Broadcom VideoCore V processor +-define(EM_78KOR, 199). % Renesas 78KOR family +-define(EM_56800EX, 200). % Freescale 56800EX Digital Signal Controller (DSC) +-define(EM_BA1, 201). % Beyond BA1 CPU architecture +-define(EM_BA2, 202). % Beyond BA2 CPU architecture +-define(EM_XCORE, 203). % XMOS xCORE processor family +-define(EM_MCHP_PIC, 204). % Microchip 8-bit PIC(r) family +-define(EM_res205, 205). % Reserved by Intel +-define(EM_res206, 206). % Reserved by Intel +-define(EM_res207, 207). % Reserved by Intel +-define(EM_res208, 208). % Reserved by Intel +-define(EM_res209, 209). % Reserved by Intel +-define(EM_KM32, 210). % KM211 KM32 32-bit processor +-define(EM_KMX32, 211). % KM211 KMX32 32-bit processor +-define(EM_KMX16, 212). % KM211 KMX16 16-bit processor +-define(EM_KMX8, 213). % KM211 KMX8 8-bit processor +-define(EM_KVARC, 214). % KM211 KVARC processor +-define(EM_CDP, 215). % Paneve CDP architecture family +-define(EM_COGE, 216). % Cognitive Smart Memory Processor +-define(EM_COOL, 217). % Bluechip Systems CoolEngine +-define(EM_NORC, 218). % Nanoradio Optimized RISC +-define(EM_CSR_KALIMBA, 219). % CSR Kalimba architecture family +-define(EM_Z80, 220). % Zilog Z80 +-define(EM_VISIUM, 221). % Control and Data Services VISIUMcore processor +-define(EM_FT32, 222). % FTDI Chip FT32 high performance 32-bit RISC architecture +-define(EM_MOXIE, 223). % Moxie processor family +-define(EM_AMDGPU, 224). % AMD GPU architecture +%% 225-242: reserved +-define(EM_RISCV, 243). % RISC-V +-define(EM_BPF, 247). % Linux BPF -- in-kernel virtual machine + +%% If it is necessary to assign new unofficial EM_* values, please pick large +%% random numbers (16#8523, 16#a7f2, etc.) to minimize the chances of collision +%% with official or non-GNU unofficial values. +%% +%% NOTE: Do not just increment the most recent number by one. +%% Somebody else somewhere will do exactly the same thing, and you +%% will have a collision. Instead, pick a random number. +%% +%% Normally, each entity or maintainer responsible for a machine with an +%% unofficial e_machine number should eventually ask registry@sco.com for +%% an officially blessed number to be added to the list above. + +%% Old version of Sparc v9, from before the ABI; +%% This should be removed shortly. +-define(EM_OLD_SPARCV9, 11). + +%% Old version of PowerPC, this should be removed shortly. +-define(EM_PPC_OLD, 17). + +%% picoJava +-define(EM_PJ_OLD, 99). + +%% Old, unofficial value for National Semiconductor CompactRISC - CR16 +-define(EM_CR16_OLD, 115). + +%% AVR magic number. Written in the absense of an ABI. +-define(EM_AVR_OLD, 16#1057). + +%% MSP430 magic number. Written in the absense of everything. +-define(EM_MSP430_OLD, 16#1059). + +%% Morpho MT. Written in the absense of an ABI. +-define(EM_MT, 16#2530). + +%% FR30 magic number - no EABI available. +-define(EM_CYGNUS_FR30, 16#3330). + +%% OpenRISC magic number. Written in the absense of an ABI. +-define(EM_OPENRISC_OLD, 16#3426). + +%% DLX magic number. Written in the absense of an ABI. +-define(EM_DLX, 16#5aa5). + +%% FRV magic number - no EABI available??. +-define(EM_CYGNUS_FRV, 16#5441). + +%% Infineon Technologies 16-bit microcontroller with C166-V2 core. +-define(EM_XC16X, 16#4688). + +%% D10V backend magic number. Written in the absence of an ABI. +-define(EM_CYGNUS_D10V, 16#7650). + +%% D30V backend magic number. Written in the absence of an ABI. +-define(EM_CYGNUS_D30V, 16#7676). + +%% Ubicom IP2xxx; Written in the absense of an ABI. +-define(EM_IP2K_OLD, 16#8217). + +%% (Deprecated) Temporary number for the OpenRISC processor. +-define(EM_OR32, 16#8472). + +%% Cygnus PowerPC ELF backend. Written in the absence of an ABI. +-define(EM_CYGNUS_POWERPC, 16#9025). + +%% Alpha backend magic number. Written in the absence of an ABI. +-define(EM_ALPHA, 16#9026). + +%% Cygnus M32R ELF backend. Written in the absence of an ABI. +-define(EM_CYGNUS_M32R, 16#9041). + +%% V850 backend magic number. Written in the absense of an ABI. +-define(EM_CYGNUS_V850, 16#9080). + +%% old S/390 backend magic number. Written in the absence of an ABI. +-define(EM_S390_OLD, 16#a390). + +%% Old, unofficial value for Xtensa. +-define(EM_XTENSA_OLD, 16#abc7). + +-define(EM_XSTORMY16, 16#ad45). + +%% mn10200 and mn10300 backend magic numbers. +%% Written in the absense of an ABI. +-define(EM_CYGNUS_MN10300, 16#beef). +-define(EM_CYGNUS_MN10200, 16#dead). + +%% Renesas M32C and M16C. +-define(EM_M32C_OLD, 16#FEB0). + +%% Vitesse IQ2000. +-define(EM_IQ2000, 16#FEBA). + +%% NIOS magic number - no EABI available. +-define(EM_NIOS32, 16#FEBB). + +-define(EM_CYGNUS_MEP, 16#F00D). % Toshiba MeP + +%% Old Sunplus S+core7 backend magic number. Written in the absence of an ABI. +-define(EM_SCORE_OLD, 95). + +-define(EM_MICROBLAZE_OLD, 16#baab). % Old MicroBlaze + +%% See the above comment before you add a new EM_* value here. + +%% Values for e_version. + +-define(EV_NONE, 0). % Invalid ELF version +-define(EV_CURRENT, 1). % Current version + +%% Value for e_phnum. +-define(PN_XNUM, 16#ffff). % Extended numbering + +%% Section header + +-record(elf36_Shdr, + { sh_name :: elf36_Word() % Section name, index in string tbl + , sh_type :: elf36_Word() % Type of section + , sh_flags :: elf36_Word() % Miscellaneous section attributes + , sh_addr :: elf36_Addr() % Section virtual addr at execution + , sh_offset :: elf36_Off() % Section file offset + , sh_size :: elf36_Word() % Size of section in bytes + , sh_link :: elf36_Word() % Index of another section + , sh_info :: elf36_Word() % Additional section information + , sh_addralign :: elf36_Word() % Section alignment + , sh_entsize :: elf36_Word() % Entry size if section holds table + }). + +-define(ELF36_SHDR_SIZEOF, (10 * 4)). + +%% Special section indices, which may show up in st_shndx fields, among +%% other places. + +-define(SHN_UNDEF, 16#0000). % Undefined, missing, irrelevant, or meaningless +-define(SHN_LORESERVE, 16#FF00). % Begin range of reserved indices +-define(SHN_LOPROC, 16#FF00). % Begin range of appl-specific +-define(SHN_HIPROC, 16#FF1F). % End range of appl-specific +-define(SHN_LOOS, 16#FF20). % OS specific semantics, lo +-define(SHN_HIOS, 16#FF3F). % OS specific semantics, hi +-define(SHN_ABS, 16#FFF1). % Associated symbol is absolute +-define(SHN_COMMON, 16#FFF2). % Associated symbol is in common +-define(SHN_XINDEX, 16#FFFF). % Section index is held elsewhere +-define(SHN_HIRESERVE, 16#FFFF). % End range of reserved indices + +%% Values for section header, sh_type field. + +-define(SHT_NULL, 0). % Section header table entry unused +-define(SHT_PROGBITS, 1). % Program specific (private) data +-define(SHT_SYMTAB, 2). % Link editing symbol table +-define(SHT_STRTAB, 3). % A string table +-define(SHT_RELA, 4). % Relocation entries with addends +-define(SHT_HASH, 5). % A symbol hash table +-define(SHT_DYNAMIC, 6). % Information for dynamic linking +-define(SHT_NOTE, 7). % Information that marks file +-define(SHT_NOBITS, 8). % Section occupies no space in file +-define(SHT_REL, 9). % Relocation entries, no addends +-define(SHT_SHLIB, 10). % Reserved, unspecified semantics +-define(SHT_DYNSYM, 11). % Dynamic linking symbol table + +-define(SHT_INIT_ARRAY, 14). % Array of ptrs to init functions +-define(SHT_FINI_ARRAY, 15). % Array of ptrs to finish functions +-define(SHT_PREINIT_ARRAY,16). % Array of ptrs to pre-init funcs +-define(SHT_GROUP, 17). % Section contains a section group +-define(SHT_SYMTAB_SHNDX, 18). % Indicies for SHN_XINDEX entries + +-define(SHT_LOOS, 16#60000000). % First of OS specific semantics +-define(SHT_HIOS, 16#6fffffff). % Last of OS specific semantics + +-define(SHT_GNU_INCREMENTAL_INPUTS, 16#6fff4700). % incremental build data +-define(SHT_GNU_ATTRIBUTES, 16#6ffffff5). % Object attributes +-define(SHT_GNU_HASH, 16#6ffffff6). % GNU style symbol hash table +-define(SHT_GNU_LIBLIST, 16#6ffffff7). % List of prelink dependencies + +%% The next three section types are defined by Solaris, and are named +%% SHT_SUNW*. We use them in GNU code, so we also define SHT_GNU* +%% versions. +-define(SHT_SUNW_verdef, 16#6ffffffd). % Versions defined by file +-define(SHT_SUNW_verneed, 16#6ffffffe). % Versions needed by file +-define(SHT_SUNW_versym, 16#6fffffff). % Symbol versions + +-define(SHT_GNU_verdef, ?SHT_SUNW_verdef). +-define(SHT_GNU_verneed, ?SHT_SUNW_verneed). +-define(SHT_GNU_versym, ?SHT_SUNW_versym). + +-define(SHT_LOPROC, 16#70000000). % Processor-specific semantics, lo +-define(SHT_HIPROC, 16#7FFFFFFF). % Processor-specific semantics, hi +-define(SHT_LOUSER, 16#80000000). % Application-specific semantics +%%-define(SHT_HIUSER, 16#8FFFFFFF). % Application-specific semantics +-define(SHT_HIUSER, 16#FFFFFFFF). % New value, defined in Oct 4, 1999 Draft + +%% Values for section header, sh_flags field. + +-define(SHF_WRITE, (1 bsl 0)). % Writable data during execution +-define(SHF_ALLOC, (1 bsl 1)). % Occupies memory during execution +-define(SHF_EXECINSTR, (1 bsl 2)). % Executable machine instructions +-define(SHF_MERGE, (1 bsl 4)). % Data in this section can be merged +-define(SHF_STRINGS, (1 bsl 5)). % Contains null terminated character strings +-define(SHF_INFO_LINK, (1 bsl 6)). % sh_info holds section header table index +-define(SHF_LINK_ORDER, (1 bsl 7)). % Preserve section ordering when linking +-define(SHF_OS_NONCONFORMING, (1 bsl 8)). % OS specific processing required +-define(SHF_GROUP, (1 bsl 9)). % Member of a section group +-define(SHF_TLS, (1 bsl 10)). % Thread local storage section +-define(SHF_COMPRESSED, (1 bsl 11)). % Data in this section is compressed + +%%-define(SHF_MASKOS, 16#0F000000). % OS-specific semantics +-define(SHF_MASKOS, 16#0FF00000). % New value, Oct 4, 1999 Draft +-define(SHF_MASKPROC, 16#F0000000). % Processor-specific semantics + +%% This used to be implemented as a processor specific section flag. +%% We just make it generic. +-define(SHF_EXCLUDE, 16#80000000). % Link editor is to exclude + % this section from executable + % and shared library that it + % builds when those objects + % are not to be further + % relocated. + +%% Size of SHT_GROUP section entry. + +-define(GRP_ENTRY_SIZE, 4). + +%% Section Group Flags. + +-define(GRP_COMDAT, 16#1). % A COMDAT group +-define(GRP_MASKOS, 16#0ff00000). % Reserved for OS-specific semantics +-define(GRP_MASKPROC, 16#f0000000). % Reserved for processor-specific semantics + +%% Compression Header + +-record(elf36_Chdr, + { ch_type :: elf36_Word() % Specifies the compression algorithm + , ch_size :: elf36_Word() % Size in bytes of the uncompressed data; see sh_size + , ch_addralign :: elf36_Word() % Alignment for the uncompressed data; see sh_addralign + }). + +-define(ELFCOMPRESS_ZLIB, 1). % Data is compressed with the ZLIB algorithm +-define(ELFCOMPRESS_LOOS, 16#60000000). % OS specific semantics, start of range +-define(ELFCOMPRESS_HIOS, 16#6fffffff). % OS specific semantics, end of range +-define(ELFCOMPRESS_LOPROC, 16#70000000). % Processor-specific semantics, start of range +-define(ELFCOMPRESS_HIPROC, 16#7fffffff). % Processor-specific semantics, end of range + +%% Symbol table entry + +-record(elf36_Sym, + { st_name :: elf36_Word() % Symbol name, index in string tbl + , st_value :: elf36_Addr() % Value of the symbol + , st_size :: elf36_Word() % Associated symbol size + , st_info :: elf36_Uchar() % Type and binding attributes + , st_other :: elf36_Uchar() % No defined meaning, 0 + , st_shndx :: elf36_Half() % Associated section index + }). + +-define(ELF36_SYM_SIZEOF, (3 * 4 + 2 + 1 + 1)). + +-ifdef(notdef). +-record(elf_External_Sym_Shndx, + { est_shndx :: [uint9_t()] % Section index, 4 elements + }). +-endif. + +-define(STN_UNDEF, 0). % Undefined symbol index + +%% These three macros disassemble and assemble a symbol table st_info field, +%% which contains the symbol binding and symbol type. The STB_ and STT_ +%% defines identify the binding and type. + +-define(ELF_ST_BIND(Val), (((Val) band ?PDP10_UINT9_MAX) bsr 4)). +-define(ELF_ST_TYPE(Val), ((Val) band 16#F)). +-define(ELF_ST_INFO(Bind, Type), (((Bind) bsl 4) + ((Type) band 16#F))). + +%% The 64bit, 36bit, and 32bit versions of these macros are identical, but +%% the ELF spec defines them, so here they are. +-define(ELF36_ST_BIND(Val), ?ELF_ST_BIND((Val))). +-define(ELF36_ST_TYPE(Val), ?ELF_ST_TYPE((Val))). +-define(ELF36_ST_INFO(Bind, Type), ?ELF_ST_INFO((Bind), (Type))). + +-define(STB_LOCAL, 0). % Symbol not visible outside obj +-define(STB_GLOBAL, 1). % Symbol visible outside obj +-define(STB_WEAK, 2). % Like globals, lower precedence +-define(STB_LOOS, 10). % OS-specific semantics +-define(STB_GNU_UNIQUE, 10). % Symbol is unique in namespace +-define(STB_HIOS, 12). % OS-specific semantics +-define(STB_LOPROC, 13). % Processor-specific semantics +-define(STB_HIPROC, 15). % Processor-specific semantics + +-define(STT_NOTYPE, 0). % Symbol type is unspecified +-define(STT_OBJECT, 1). % Symbol is a data object +-define(STT_FUNC, 2). % Symbol is a code object +-define(STT_SECTION, 3). % Symbol associated with a section +-define(STT_FILE, 4). % Symbol gives a file name +-define(STT_COMMON, 5). % An uninitialised common block +-define(STT_TLS, 6). % Thread local data object +-define(STT_RELC, 8). % Complex relocation expression +-define(STT_SRELC, 9). % Signed Complex relocation expression +-define(STT_LOOS, 10). % OS-specific semantics +-define(STT_GNU_IFUNC, 10). % Symbol is an indirect code object +-define(STT_HIOS, 12). % OS-specific semantics +-define(STT_LOPROC, 13). % Processor-specific semantics +-define(STT_HIPROC, 15). % Processor-specific semantics + +%% This macro disassembles and assembles a symbol's visibility into +%% the st_other field. The STV_ defines specify the actual visibility. + +-define(ELF_ST_VISIBILITY(V), ((V) band 16#3)). +%% The remaining bits in the st_other field are not currently used. +%% They should be set to zero. + +-define(ELF36_ST_VISIBILITY(V), ?ELF_ST_VISIBILITY((V))). + +%% The following constants control how a symbol may be accessed once it has +%% become part of an executable or shared library. + +-define(STV_DEFAULT, 0). % Visibility is specified by binding type +-define(STV_INTERNAL, 1). % OS specific version of STV_HIDDEN +-define(STV_HIDDEN, 2). % Can only be seen inside currect component +-define(STV_PROTECTED, 3). % Treat as STB_LOCAL inside current component + +%% Relocation Entries +-record(elf36_Rel, + { r_offset :: elf36_Addr() % Location at which to apply the action + , r_info :: elf36_Word() % index and type of relocation + }). + +-record(elf36_Rela, + { r_offset :: elf36_Addr() % Location at which to apply the action + , r_info :: elf36_Word() % index and type of relocation + , r_addend :: elf36_Sword() % Constant addend used to compute value + }). +%% Relocation info handling macros. + +-define(ELF36_R_SYM(I), ((I) bsr 8)). +-define(ELF36_R_TYPE(I), ((I) band 16#ff)). +-define(ELF36_R_INFO(S,T), (((S) bsl 8) + ((T) band 16#ff))). + +%% Note segments + +-record(elf36_Note, + { n_namesz :: elf36_Word() % Size of entry's owner string + , n_descsz :: elf36_Word() % Size of the note descriptor + , n_type :: elf36_Word() % Interpretation of the descriptor + , n_name :: [elf36_Uchar()] % Start of the name+desc data + }). + +%% Values of note segment descriptor types for core files. + +-define(NT_PRSTATUS, 1). % Contains copy of prstatus struct +-define(NT_FPREGSET, 2). % Contains copy of fpregset struct +-define(NT_PRPSINFO, 3). % Contains copy of prpsinfo struct +-define(NT_TASKSTRUCT, 4). % Contains copy of task struct +-define(NT_AUXV, 6). % Contains copy of Elfxx_auxv_t +-define(NT_PRXFPREG, 16#46e62b7f). % Contains a user_xfpregs_struct; + % note name must be "LINUX". +-define(NT_PPC_VMX, 16#100). % PowerPC Altivec/VMX registers + % note name must be "LINUX". +-define(NT_PPC_VSX, 16#102). % PowerPC VSX registers + % note name must be "LINUX". +-define(NT_X86_XSTATE, 16#202). % x86 XSAVE extended state + % note name must be "LINUX". +-define(NT_S390_HIGH_GPRS, 16#300). % S/390 upper halves of GPRs + % note name must be "LINUX". +-define(NT_S390_TIMER, 16#301). % S390 timer + % note name must be "LINUX". +-define(NT_S390_TODCMP, 16#302). % S390 TOD clock comparator + % note name must be "LINUX". +-define(NT_S390_TODPREG, 16#303). % S390 TOD programmable register + % note name must be "LINUX". +-define(NT_S390_CTRS, 16#304). % S390 control registers + % note name must be "LINUX". +-define(NT_S390_PREFIX, 16#305). % S390 prefix register + % note name must be "LINUX". +-define(NT_ARM_VFP, 16#400). % ARM VFP registers + % note name must be "LINUX". + +%% Note segments for core files on dir-style procfs systems. + +-define(NT_PSTATUS, 10). % Has a struct pstatus +-define(NT_FPREGS, 12). % Has a struct fpregset +-define(NT_PSINFO, 13). % Has a struct psinfo +-define(NT_LWPSTATUS, 16). % Has a struct lwpstatus_t +-define(NT_LWPSINFO, 17). % Has a struct lwpsinfo_t +-define(NT_WIN32PSTATUS, 18). % Has a struct win32_pstatus + +%% Note segment for SystemTap probes. +-define(NT_STAPSDT, 3). + +%% Note segments for core files on NetBSD systems. Note name +%% must start with "NetBSD-CORE". + +-define(NT_NETBSDCORE_PROCINFO, 1). % Has a struct procinfo +-define(NT_NETBSDCORE_FIRSTMACH,32). % start of machdep note types + + +%% Note segments for core files on OpenBSD systems. Note name is +%% "OpenBSD". + +-define(NT_OPENBSD_PROCINFO, 10). +-define(NT_OPENBSD_AUXV, 11). +-define(NT_OPENBSD_REGS, 20). +-define(NT_OPENBSD_FPREGS, 21). +-define(NT_OPENBSD_XFPREGS, 22). +-define(NT_OPENBSD_WCOOKIE, 23). + + +%% Note segments for core files on SPU systems. Note name +%% must start with "SPU/". + +-define(NT_SPU, 1). + +%% Values of note segment descriptor types for object files. + +-define(NT_VERSION, 1). % Contains a version string. +-define(NT_ARCH, 2). % Contains an architecture string. + +%% Values for notes in non-core files using name "GNU". + +-define(NT_GNU_ABI_TAG, 1). +-define(NT_GNU_HWCAP, 2). % Used by ld.so and kernel vDSO. +-define(NT_GNU_BUILD_ID, 3). % Generated by ld --build-id. +-define(NT_GNU_GOLD_VERSION, 4). % Generated by gold. + +%% Values used in GNU .note.ABI-tag notes (NT_GNU_ABI_TAG). +-define(GNU_ABI_TAG_LINUX, 0). +-define(GNU_ABI_TAG_HURD, 1). +-define(GNU_ABI_TAG_SOLARIS, 2). +-define(GNU_ABI_TAG_FREEBSD, 3). +-define(GNU_ABI_TAG_NETBSD, 4). + +%% Values for NetBSD .note.netbsd.ident notes. Note name is "NetBSD". + +-define(NT_NETBSD_IDENT, 1). + +%% Values for OpenBSD .note.openbsd.ident notes. Note name is "OpenBSD". + +-define(NT_OPENBSD_IDENT, 1). + +%% Values for FreeBSD .note.ABI-tag notes. Note name is "FreeBSD". + +-define(NT_FREEBSD_ABI_TAG, 1). + +%% Program header + +-record(elf36_Phdr, + { p_type :: elf36_Word() % Identifies program segment type + , p_offset :: elf36_Off() % Segment file offset + , p_vaddr :: elf36_Addr() % Segment virtual address + , p_paddr :: elf36_Addr() % Segment physical address + , p_filesz :: elf36_Word() % Segment size in file + , p_memsz :: elf36_Word() % Segment size in memory + , p_flags :: elf36_Word() % Segment flags + , p_align :: elf36_Word() % Segment alignment, file & memory + }). + +%% Values for program header, p_type field. + +-define(PT_NULL, 0). % Program header table entry unused +-define(PT_LOAD, 1). % Loadable program segment +-define(PT_DYNAMIC, 2). % Dynamic linking information +-define(PT_INTERP, 3). % Program interpreter +-define(PT_NOTE, 4). % Auxiliary information +-define(PT_SHLIB, 5). % Reserved, unspecified semantics +-define(PT_PHDR, 6). % Entry for header table itself +-define(PT_TLS, 7). % Thread local storage segment +-define(PT_LOOS, 16#60000000). % OS-specific +-define(PT_HIOS, 16#6fffffff). % OS-specific +-define(PT_LOPROC, 16#70000000). % Processor-specific +-define(PT_HIPROC, 16#7FFFFFFF). % Processor-specific + +-define(PT_GNU_EH_FRAME, (?PT_LOOS + 16#474e550)). % Frame unwind information +-define(PT_SUNW_EH_FRAME, ?PT_GNU_EH_FRAME). % Solaris uses the same value +-define(PT_GNU_STACK, (?PT_LOOS + 16#474e551)). % Stack flags +-define(PT_GNU_RELRO, (?PT_LOOS + 16#474e552)). % Read-only after relocation + +%% Program segment permissions, in program header p_flags field. + +-define(PF_X, (1 bsl 0)). % Segment is executable +-define(PF_W, (1 bsl 1)). % Segment is writable +-define(PF_R, (1 bsl 2)). % Segment is readable +%%-define(PF_MASKOS, 16#0F000000). % OS-specific reserved bits +-define(PF_MASKOS, 16#0FF00000). % New value, Oct 4, 1999 Draft +-define(PF_MASKPROC, 16#F0000000). % Processor-specific reserved bits + +%% dynamic section structure + +-record(elf36_Dyn, + { d_tag :: elf36_Sword() % entry tag value + , d_valOrPtr :: elf36_Word() % val (Addr) or ptr (Addr) + }). + +%% Dynamic section tags. + +-define(DT_NULL, 0). +-define(DT_NEEDED, 1). +-define(DT_PLTRELSZ, 2). +-define(DT_PLTGOT, 3). +-define(DT_HASH, 4). +-define(DT_STRTAB, 5). +-define(DT_SYMTAB, 6). +-define(DT_RELA, 7). +-define(DT_RELASZ, 8). +-define(DT_RELAENT, 9). +-define(DT_STRSZ, 10). +-define(DT_SYMENT, 11). +-define(DT_INIT, 12). +-define(DT_FINI, 13). +-define(DT_SONAME, 14). +-define(DT_RPATH, 15). +-define(DT_SYMBOLIC, 16). +-define(DT_REL, 17). +-define(DT_RELSZ, 18). +-define(DT_RELENT, 19). +-define(DT_PLTREL, 20). +-define(DT_DEBUG, 21). +-define(DT_TEXTREL, 22). +-define(DT_JMPREL, 23). +-define(DT_BIND_NOW, 24). +-define(DT_INIT_ARRAY, 25). +-define(DT_FINI_ARRAY, 26). +-define(DT_INIT_ARRAYSZ, 27). +-define(DT_FINI_ARRAYSZ, 28). +-define(DT_RUNPATH, 29). +-define(DT_FLAGS, 30). +-define(DT_ENCODING, 32). % odd/even encoding rule starts here +-define(DT_PREINIT_ARRAY, 32). +-define(DT_PREINIT_ARRAYSZ, 33). +-define(DT_SYMTAB_SHNDX, 34). + +%% Note, the Oct 4, 1999 draft of the ELF ABI changed the values +%% for DT_LOOS and DT_HIOS. Some implementations however, use +%% values outside of the new range (see below). +-define(OLD_DT_LOOS, 16#60000000). +-define(DT_LOOS, 16#6000000d). +-define(DT_HIOS, 16#6ffff000). +-define(OLD_DT_HIOS, 16#6fffffff). + +-define(DT_LOPROC, 16#70000000). +-define(DT_HIPROC, 16#7fffffff). + +%% The next 2 dynamic tag ranges, integer value range (DT_VALRNGLO to +%% DT_VALRNGHI) and virtual address range (DT_ADDRRNGLO to DT_ADDRRNGHI), +%% are used on Solaris. We support them everywhere. Note these values +%% lie outside of the (new) range for OS specific values. This is a +%% deliberate special case and we maintain it for backwards compatability. + +-define(DT_VALRNGLO, 16#6ffffd00). +-define(DT_GNU_PRELINKED,16#6ffffdf5). +-define(DT_GNU_CONFLICTSZ,16#6ffffdf6). +-define(DT_GNU_LIBLISTSZ,16#6ffffdf7). +-define(DT_CHECKSUM, 16#6ffffdf8). +-define(DT_PLTPADSZ, 16#6ffffdf9). +-define(DT_MOVEENT, 16#6ffffdfa). +-define(DT_MOVESZ, 16#6ffffdfb). +-define(DT_FEATURE, 16#6ffffdfc). +-define(DT_POSFLAG_1, 16#6ffffdfd). +-define(DT_SYMINSZ, 16#6ffffdfe). +-define(DT_SYMINENT, 16#6ffffdff). +-define(DT_VALRNGHI, 16#6ffffdff). + +-define(DT_ADDRRNGLO, 16#6ffffe00). +-define(DT_GNU_HASH, 16#6ffffef5). +-define(DT_TLSDESC_PLT, 16#6ffffef6). +-define(DT_TLSDESC_GOT, 16#6ffffef7). +-define(DT_GNU_CONFLICT,16#6ffffef8). +-define(DT_GNU_LIBLIST, 16#6ffffef9). +-define(DT_CONFIG, 16#6ffffefa). +-define(DT_DEPAUDIT, 16#6ffffefb). +-define(DT_AUDIT, 16#6ffffefc). +-define(DT_PLTPAD, 16#6ffffefd). +-define(DT_MOVETAB, 16#6ffffefe). +-define(DT_SYMINFO, 16#6ffffeff). +-define(DT_ADDRRNGHI, 16#6ffffeff). + +-define(DT_RELACOUNT, 16#6ffffff9). +-define(DT_RELCOUNT, 16#6ffffffa). +-define(DT_FLAGS_1, 16#6ffffffb). +-define(DT_VERDEF, 16#6ffffffc). +-define(DT_VERDEFNUM, 16#6ffffffd). +-define(DT_VERNEED, 16#6ffffffe). +-define(DT_VERNEEDNUM, 16#6fffffff). + +%% This tag is a GNU extension to the Solaris version scheme. +-define(DT_VERSYM, 16#6ffffff0). + +%% These section tags are used on Solaris. We support them +%% everywhere, and hope they do not conflict. + +-define(DT_AUXILIARY, 16#7ffffffd). +-define(DT_USED , 16#7ffffffe). +-define(DT_FILTER, 16#7fffffff). + + +%% Values used in DT_FEATURE .dynamic entry. +-define(DTF_1_PARINIT, 16#00000001). +%% From +%% +%% http://docs.sun.com:80/ab2/coll.45.13/LLM/@Ab2PageView/21165?Ab2Lang=C&Ab2Enc=iso-8859-1 +%% +%% DTF_1_CONFEXP is the same as DTF_1_PARINIT. It is a typo. The value +%% defined here is the same as the one in on Solaris 8. +-define(DTF_1_CONFEXP, 16#00000002). + +%% Flag values used in the DT_POSFLAG_1 .dynamic entry. +-define(DF_P1_LAZYLOAD, 16#00000001). +-define(DF_P1_GROUPPERM,16#00000002). + +%% Flag value in in the DT_FLAGS_1 .dynamic entry. +-define(DF_1_NOW, 16#00000001). +-define(DF_1_GLOBAL, 16#00000002). +-define(DF_1_GROUP, 16#00000004). +-define(DF_1_NODELETE, 16#00000008). +-define(DF_1_LOADFLTR, 16#00000010). +-define(DF_1_INITFIRST, 16#00000020). +-define(DF_1_NOOPEN, 16#00000040). +-define(DF_1_ORIGIN, 16#00000080). +-define(DF_1_DIRECT, 16#00000100). +-define(DF_1_TRANS, 16#00000200). +-define(DF_1_INTERPOSE, 16#00000400). +-define(DF_1_NODEFLIB, 16#00000800). +-define(DF_1_NODUMP, 16#00001000). +-define(DF_1_CONLFAT, 16#00002000). + +%% Flag values for the DT_FLAGS entry. +-define(DF_ORIGIN, (1 bsl 0)). +-define(DF_SYMBOLIC, (1 bsl 1)). +-define(DF_TEXTREL, (1 bsl 2)). +-define(DF_BIND_NOW, (1 bsl 3)). +-define(DF_STATIC_TLS, (1 bsl 4)). + +%% This structure appears in a SHT_GNU_verdef section. + +-record(elf36_Verdef, + { vd_version :: elf36_Half() + , vd_flags :: elf36_Half() + , vd_ndx :: elf36_Half() + , vd_cnt :: elf36_Half() + , vd_hash :: elf36_Word() + , vd_aud :: elf36_Word() + , vd_next :: elf36_Word() + }). + +%% These constants are used for the version number of a Elf36_Verdef +%% structure. + +-define(VER_DEF_NONE, 0). +-define(VER_DEF_CURRENT, 1). + +%% These constants appear in the vd_flags field of a Elf36_Verdef +%% structure. +%% +%% Cf. the Solaris Linker and Libraries Guide, Ch. 7, Object File Format, +%% Versioning Sections, for a description: +%% +%% http://docs.sun.com/app/docs/doc/819-0690/chapter6-93046?l=en&a=view + +-define(VER_FLG_BASE, 16#1). +-define(VER_FLG_WEAK, 16#2). +-define(VER_FLG_INFO, 16#4). + +%% This structure appears in a SHT_GNU_verdef section. + +-record(elf36_Verdaux, + { vda_name :: elf36_Word() + , vda_next :: elf36_Word() + }). + +%% This structure appears in a SHT_GNU_verneed section. + +-record(elf36_Verneed, + { vn_version :: elf36_Half() + , vn_cnt :: elf36_Half() + , vn_file :: elf36_Word() + , vn_aux :: elf36_Word() + , vn_next :: elf36_Word() + }). + +%% These constants are used for the version number of a Elf36_Verneed +%% structure. + +-define(VER_NEED_NONE, 0). +-define(VER_NEED_CURRENT, 1). + +%% This structure appears in a SHT_GNU_verneed section. + +-record(elf36_Vernaux, + { vna_hash :: elf36_Word() + , vna_flags :: elf36_Half() + , vna_other :: elf36_Half() + , vna_name :: elf36_Word() + , vna_next :: elf36_Word() + }). + +%% This structure appears in a SHT_GNU_versym section. This is not a +%% standard ELF structure; ELF just uses Elf36_Half. + +-record(elf36_Versym, + { vs_vers :: elf36_Half() + }). + +%% These special constants can be found in an Elf36_Versym field. + +-define(VER_NDX_LOCAL, 0). +-define(VER_NDX_GLOBAL, 1). + +%% This flag appears in a Versym structure. It means that the symbol +%% is hidden, and is only visible with an explicit version number. +%% This is a GNU extension. + +-define(VERSYM_HIDDEN, 16#8000). + +%% This is the mask for the rest of the Versym information. + +-define(VERSYM_VERSION, 16#7fff). + +%% This is a special token which appears as part of a symbol name. It +%% indicates that the rest of the name is actually the name of a +%% version node, and is not part of the actual name. This is a GNU +%% extension. For example, the symbol name `stat@ver2' is taken to +%% mean the symbol `stat' in version `ver2'. + +-define(ELF_VER_CHR, $@). + +%% Structure for syminfo section. +-record(elf36_Syminfo, + { si_boundto :: elf36_Half() + , si_flags :: elf36_Half() + }). + +%% Possible values for si_boundto. + +-define(SYMINFO_BT_SELF, 16#ffff). % Symbol bound to self +-define(SYMINFO_BT_PARENT, 16#fffe). % Symbol bound to parent +-define(SYMINFO_BT_LOWRESERVE, 16#ff00). % Beginning of reserved entries + +%% Possible bitmasks for si_flags. + +-define(SYMINFO_FLG_DIRECT, 16#0001). % Direct bound symbol +-define(SYMINFO_FLG_PASSTHRU, 16#0002). % Pass-thru symbol for translator +-define(SYMINFO_FLG_COPY, 16#0004). % Symbol is a copy-reloc +-define(SYMINFO_FLG_LAZYLOAD, 16#0008). % Symbol bound to object to be lazy loaded + +%% Syminfo version values. + +-define(SYMINFO_NONE, 0). +-define(SYMINFO_CURRENT, 1). +-define(SYMINFO_NUM, 2). + +%% This structure appears on the stack and in NT_AUXV core file notes. +-record(elf36_Auxv, + { a_type :: elf36_Word() + , a_val :: elf36_Addr() + }). + +%% Auxv a_type values. + +-define(AT_NULL, 0). % End of vector +-define(AT_IGNORE, 1). % Entry should be ignored +-define(AT_EXECFD, 2). % File descriptor of program +-define(AT_PHDR, 3). % Program headers for program +-define(AT_PHENT, 4). % Size of program header entry +-define(AT_PHNUM, 5). % Number of program headers +-define(AT_PAGESZ, 6). % System page size +-define(AT_BASE, 7). % Base address of interpreter +-define(AT_FLAGS, 8). % Flags +-define(AT_ENTRY, 9). % Entry point of program +-define(AT_NOTELF, 10). % Program is not ELF +-define(AT_UID, 11). % Real uid +-define(AT_EUID, 12). % Effective uid +-define(AT_GID, 13). % Real gid +-define(AT_EGID, 14). % Effective gid +-define(AT_CLKTCK, 17). % Frequency of times() +-define(AT_PLATFORM, 15). % String identifying platform. +-define(AT_HWCAP, 16). % Machine dependent hints about + % processor capabilities. +-define(AT_FPUCW, 18). % Used FPU control word. +-define(AT_DCACHEBSIZE, 19). % Data cache block size. +-define(AT_ICACHEBSIZE, 20). % Instruction cache block size. +-define(AT_UCACHEBSIZE, 21). % Unified cache block size. +-define(AT_IGNOREPPC, 22). % Entry should be ignored +-define(AT_SECURE, 23). % Boolean, was exec setuid-like? +-define(AT_BASE_PLATFORM, 24). % String identifying real platform, + % may differ from AT_PLATFORM. +-define(AT_RANDOM, 25). % Address of 16 random bytes. +-define(AT_EXECFN, 31). % Filename of executable. +%% Pointer to the global system page used for system calls and other +%% nice things. +-define(AT_SYSINFO, 32). +-define(AT_SYSINFO_EHDR,33). % Pointer to ELF header of system-supplied DSO. + +-define(AT_SUN_UID, 2000). % Effective user ID. +-define(AT_SUN_RUID, 2001). % Real user ID. +-define(AT_SUN_GID, 2002). % Effective group ID. +-define(AT_SUN_RGID, 2003). % Real group ID. +-define(AT_SUN_LDELF, 2004). % Dynamic linker's ELF header. +-define(AT_SUN_LDSHDR, 2005). % Dynamic linker's section headers. +-define(AT_SUN_LDNAME, 2006). % String giving name of dynamic linker. +-define(AT_SUN_LPAGESZ, 2007). % Large pagesize. +-define(AT_SUN_PLATFORM,2008). % Platform name string. +-define(AT_SUN_HWCAP, 2009). % Machine dependent hints about + % processor capabilities. +-define(AT_SUN_IFLUSH, 2010). % Should flush icache? +-define(AT_SUN_CPU, 2011). % CPU name string. +-define(AT_SUN_EMUL_ENTRY, 2012). % COFF entry point address. +-define(AT_SUN_EMUL_EXECFD, 2013). % COFF executable file descriptor. +-define(AT_SUN_EXECNAME,2014). % Canonicalized file name given to execve. +-define(AT_SUN_MMU, 2015). % String for name of MMU module. +-define(AT_SUN_LDDATA, 2016). % Dynamic linker's data segment address. +-define(AT_SUN_AUXFLAGS,2017). % AF_SUN_ flags passed from the kernel. + +-endif. % PDP10_ELF36_HRL