Skip to main content

linux_loader/loader_gen/x86_64/
elf.rs

1// Rust translation of include/uapi/linux/elf.h and include/uapi/linux/elf-em.h.
2// All structs use #[repr(C)] to match the standard ELF ABI layout.
3
4#![allow(non_camel_case_types, non_snake_case, non_upper_case_globals)]
5
6// ============================================================================
7// ELF base type aliases
8// ============================================================================
9
10pub type Elf32_Addr = u32;
11pub type Elf32_Half = u16;
12pub type Elf32_Off = u32;
13pub type Elf32_Sword = i32;
14pub type Elf32_Word = u32;
15pub type Elf32_Versym = u16;
16
17pub type Elf64_Addr = u64;
18pub type Elf64_Half = u16;
19pub type Elf64_SHalf = i16;
20pub type Elf64_Off = u64;
21pub type Elf64_Sword = i32;
22pub type Elf64_Word = u32;
23pub type Elf64_Xword = u64;
24pub type Elf64_Sxword = i64;
25pub type Elf64_Versym = u16;
26
27// ============================================================================
28// ELF machine types (elf-em.h)
29// ============================================================================
30
31pub const EM_NONE: u16 = 0;
32pub const EM_M32: u16 = 1;
33pub const EM_SPARC: u16 = 2;
34pub const EM_386: u16 = 3;
35pub const EM_68K: u16 = 4;
36pub const EM_88K: u16 = 5;
37pub const EM_486: u16 = 6;
38pub const EM_860: u16 = 7;
39pub const EM_MIPS: u16 = 8;
40pub const EM_MIPS_RS3_LE: u16 = 10;
41pub const EM_MIPS_RS4_BE: u16 = 10;
42pub const EM_PARISC: u16 = 15;
43pub const EM_SPARC32PLUS: u16 = 18;
44pub const EM_PPC: u16 = 20;
45pub const EM_PPC64: u16 = 21;
46pub const EM_SPU: u16 = 23;
47pub const EM_ARM: u16 = 40;
48pub const EM_SH: u16 = 42;
49pub const EM_SPARCV9: u16 = 43;
50pub const EM_H8_300: u16 = 46;
51pub const EM_IA_64: u16 = 50;
52pub const EM_X86_64: u16 = 62;
53pub const EM_S390: u16 = 22;
54pub const EM_CRIS: u16 = 76;
55pub const EM_M32R: u16 = 88;
56pub const EM_MN10300: u16 = 89;
57pub const EM_OPENRISC: u16 = 92;
58pub const EM_ARCOMPACT: u16 = 93;
59pub const EM_XTENSA: u16 = 94;
60pub const EM_BLACKFIN: u16 = 106;
61pub const EM_UNICORE: u16 = 110;
62pub const EM_ALTERA_NIOS2: u16 = 113;
63pub const EM_TI_C6000: u16 = 140;
64pub const EM_HEXAGON: u16 = 164;
65pub const EM_NDS32: u16 = 167;
66pub const EM_AARCH64: u16 = 183;
67pub const EM_TILEPRO: u16 = 188;
68pub const EM_MICROBLAZE: u16 = 189;
69pub const EM_TILEGX: u16 = 191;
70pub const EM_ARCV2: u16 = 195;
71pub const EM_RISCV: u16 = 243;
72pub const EM_BPF: u16 = 247;
73pub const EM_CSKY: u16 = 252;
74pub const EM_LOONGARCH: u16 = 258;
75pub const EM_FRV: u16 = 0x5441;
76pub const EM_ALPHA: u16 = 0x9026;
77pub const EM_CYGNUS_M32R: u16 = 0x9041;
78pub const EM_S390_OLD: u16 = 0xA390;
79pub const EM_CYGNUS_MN10300: u16 = 0xbeef;
80
81// ============================================================================
82// Segment types (p_type)
83// ============================================================================
84
85pub const PT_NULL: u32 = 0;
86pub const PT_LOAD: u32 = 1;
87pub const PT_DYNAMIC: u32 = 2;
88pub const PT_INTERP: u32 = 3;
89pub const PT_NOTE: u32 = 4;
90pub const PT_SHLIB: u32 = 5;
91pub const PT_PHDR: u32 = 6;
92pub const PT_TLS: u32 = 7;
93pub const PT_LOOS: u32 = 0x60000000;
94pub const PT_HIOS: u32 = 0x6fffffff;
95pub const PT_LOPROC: u32 = 0x70000000;
96pub const PT_HIPROC: u32 = 0x7fffffff;
97pub const PT_GNU_EH_FRAME: u32 = PT_LOOS + 0x474e550;
98pub const PT_GNU_STACK: u32 = PT_LOOS + 0x474e551;
99pub const PT_GNU_RELRO: u32 = PT_LOOS + 0x474e552;
100pub const PT_GNU_PROPERTY: u32 = PT_LOOS + 0x474e553;
101
102pub const PT_AARCH64_MEMTAG_MTE: u32 = PT_LOPROC + 0x2;
103
104pub const PN_XNUM: u16 = 0xffff;
105
106// ============================================================================
107// ELF file types (e_type)
108// ============================================================================
109
110pub const ET_NONE: u16 = 0;
111pub const ET_REL: u16 = 1;
112pub const ET_EXEC: u16 = 2;
113pub const ET_DYN: u16 = 3;
114pub const ET_CORE: u16 = 4;
115pub const ET_LOPROC: u16 = 0xff00;
116pub const ET_HIPROC: u16 = 0xffff;
117
118// ============================================================================
119// Dynamic section tags (d_tag)
120// ============================================================================
121
122pub const DT_NULL: i64 = 0;
123pub const DT_NEEDED: i64 = 1;
124pub const DT_PLTRELSZ: i64 = 2;
125pub const DT_PLTGOT: i64 = 3;
126pub const DT_HASH: i64 = 4;
127pub const DT_STRTAB: i64 = 5;
128pub const DT_SYMTAB: i64 = 6;
129pub const DT_RELA: i64 = 7;
130pub const DT_RELASZ: i64 = 8;
131pub const DT_RELAENT: i64 = 9;
132pub const DT_STRSZ: i64 = 10;
133pub const DT_SYMENT: i64 = 11;
134pub const DT_INIT: i64 = 12;
135pub const DT_FINI: i64 = 13;
136pub const DT_SONAME: i64 = 14;
137pub const DT_RPATH: i64 = 15;
138pub const DT_SYMBOLIC: i64 = 16;
139pub const DT_REL: i64 = 17;
140pub const DT_RELSZ: i64 = 18;
141pub const DT_RELENT: i64 = 19;
142pub const DT_PLTREL: i64 = 20;
143pub const DT_DEBUG: i64 = 21;
144pub const DT_TEXTREL: i64 = 22;
145pub const DT_JMPREL: i64 = 23;
146pub const DT_ENCODING: i64 = 32;
147pub const OLD_DT_LOOS: i64 = 0x60000000;
148pub const DT_LOOS: i64 = 0x6000000d;
149pub const DT_HIOS: i64 = 0x6ffff000;
150pub const DT_VALRNGLO: i64 = 0x6ffffd00;
151pub const DT_VALRNGHI: i64 = 0x6ffffdff;
152pub const DT_ADDRRNGLO: i64 = 0x6ffffe00;
153pub const DT_GNU_HASH: i64 = 0x6ffffef5;
154pub const DT_ADDRRNGHI: i64 = 0x6ffffeff;
155pub const DT_VERSYM: i64 = 0x6ffffff0;
156pub const DT_RELACOUNT: i64 = 0x6ffffff9;
157pub const DT_RELCOUNT: i64 = 0x6ffffffa;
158pub const DT_FLAGS_1: i64 = 0x6ffffffb;
159pub const DT_VERDEF: i64 = 0x6ffffffc;
160pub const DT_VERDEFNUM: i64 = 0x6ffffffd;
161pub const DT_VERNEED: i64 = 0x6ffffffe;
162pub const DT_VERNEEDNUM: i64 = 0x6fffffff;
163pub const OLD_DT_HIOS: i64 = 0x6fffffff;
164pub const DT_LOPROC: i64 = 0x70000000;
165pub const DT_HIPROC: i64 = 0x7fffffff;
166
167// ============================================================================
168// Symbol binding and type
169// ============================================================================
170
171pub const STB_LOCAL: u8 = 0;
172pub const STB_GLOBAL: u8 = 1;
173pub const STB_WEAK: u8 = 2;
174
175pub const STN_UNDEF: u32 = 0;
176
177pub const STT_NOTYPE: u8 = 0;
178pub const STT_OBJECT: u8 = 1;
179pub const STT_FUNC: u8 = 2;
180pub const STT_SECTION: u8 = 3;
181pub const STT_FILE: u8 = 4;
182pub const STT_COMMON: u8 = 5;
183pub const STT_TLS: u8 = 6;
184
185pub const VER_FLG_BASE: u16 = 0x1;
186pub const VER_FLG_WEAK: u16 = 0x2;
187
188#[inline]
189pub const fn ELF_ST_BIND(info: u8) -> u8 {
190    info >> 4
191}
192
193#[inline]
194pub const fn ELF_ST_TYPE(info: u8) -> u8 {
195    info & 0xf
196}
197
198#[inline]
199pub const fn ELF32_ST_BIND(info: u8) -> u8 {
200    ELF_ST_BIND(info)
201}
202
203#[inline]
204pub const fn ELF32_ST_TYPE(info: u8) -> u8 {
205    ELF_ST_TYPE(info)
206}
207
208#[inline]
209pub const fn ELF64_ST_BIND(info: u8) -> u8 {
210    ELF_ST_BIND(info)
211}
212
213#[inline]
214pub const fn ELF64_ST_TYPE(info: u8) -> u8 {
215    ELF_ST_TYPE(info)
216}
217
218// ============================================================================
219// Relocation helpers
220// ============================================================================
221
222#[inline]
223pub const fn ELF32_R_SYM(info: u32) -> u32 {
224    info >> 8
225}
226
227#[inline]
228pub const fn ELF32_R_TYPE(info: u32) -> u8 {
229    (info & 0xff) as u8
230}
231
232#[inline]
233pub const fn ELF64_R_SYM(info: u64) -> u32 {
234    (info >> 32) as u32
235}
236
237#[inline]
238pub const fn ELF64_R_TYPE(info: u64) -> u32 {
239    (info & 0xffffffff) as u32
240}
241
242// ============================================================================
243// Segment permission flags (p_flags)
244// ============================================================================
245
246pub const PF_R: u32 = 0x4;
247pub const PF_W: u32 = 0x2;
248pub const PF_X: u32 = 0x1;
249
250// ============================================================================
251// Section header types (sh_type)
252// ============================================================================
253
254pub const SHT_NULL: u32 = 0;
255pub const SHT_PROGBITS: u32 = 1;
256pub const SHT_SYMTAB: u32 = 2;
257pub const SHT_STRTAB: u32 = 3;
258pub const SHT_RELA: u32 = 4;
259pub const SHT_HASH: u32 = 5;
260pub const SHT_DYNAMIC: u32 = 6;
261pub const SHT_NOTE: u32 = 7;
262pub const SHT_NOBITS: u32 = 8;
263pub const SHT_REL: u32 = 9;
264pub const SHT_SHLIB: u32 = 10;
265pub const SHT_DYNSYM: u32 = 11;
266pub const SHT_NUM: u32 = 12;
267pub const SHT_LOPROC: u32 = 0x70000000;
268pub const SHT_HIPROC: u32 = 0x7fffffff;
269pub const SHT_LOUSER: u32 = 0x80000000;
270pub const SHT_HIUSER: u32 = 0xffffffff;
271
272// ============================================================================
273// Section header flags (sh_flags)
274// ============================================================================
275
276pub const SHF_WRITE: u64 = 0x1;
277pub const SHF_ALLOC: u64 = 0x2;
278pub const SHF_EXECINSTR: u64 = 0x4;
279pub const SHF_MERGE: u64 = 0x10;
280pub const SHF_STRINGS: u64 = 0x20;
281pub const SHF_INFO_LINK: u64 = 0x40;
282pub const SHF_LINK_ORDER: u64 = 0x80;
283pub const SHF_OS_NONCONFORMING: u64 = 0x100;
284pub const SHF_GROUP: u64 = 0x200;
285pub const SHF_TLS: u64 = 0x400;
286pub const SHF_RELA_LIVEPATCH: u64 = 0x00100000;
287pub const SHF_RO_AFTER_INIT: u64 = 0x00200000;
288pub const SHF_ORDERED: u64 = 0x04000000;
289pub const SHF_EXCLUDE: u64 = 0x08000000;
290pub const SHF_MASKOS: u64 = 0x0ff00000;
291pub const SHF_MASKPROC: u64 = 0xf0000000;
292
293// ============================================================================
294// Special section indexes
295// ============================================================================
296
297pub const SHN_UNDEF: u16 = 0;
298pub const SHN_LORESERVE: u16 = 0xff00;
299pub const SHN_LOPROC: u16 = 0xff00;
300pub const SHN_HIPROC: u16 = 0xff1f;
301pub const SHN_LIVEPATCH: u16 = 0xff20;
302pub const SHN_ABS: u16 = 0xfff1;
303pub const SHN_COMMON: u16 = 0xfff2;
304pub const SHN_HIRESERVE: u16 = 0xffff;
305
306// ============================================================================
307// e_ident[] indexes and values
308// ============================================================================
309
310pub const EI_MAG0: usize = 0;
311pub const EI_MAG1: usize = 1;
312pub const EI_MAG2: usize = 2;
313pub const EI_MAG3: usize = 3;
314pub const EI_CLASS: usize = 4;
315pub const EI_DATA: usize = 5;
316pub const EI_VERSION: usize = 6;
317pub const EI_OSABI: usize = 7;
318pub const EI_PAD: usize = 8;
319pub const EI_NIDENT: usize = 16;
320
321pub const ELFMAG0: u8 = 0x7f;
322pub const ELFMAG1: u8 = b'E';
323pub const ELFMAG2: u8 = b'L';
324pub const ELFMAG3: u8 = b'F';
325pub const ELFMAG: &[u8; 4] = b"\x7fELF";
326pub const SELFMAG: usize = 4;
327
328pub const ELFCLASSNONE: u8 = 0;
329pub const ELFCLASS32: u8 = 1;
330pub const ELFCLASS64: u8 = 2;
331pub const ELFCLASSNUM: u8 = 3;
332
333pub const ELFDATANONE: u8 = 0;
334pub const ELFDATA2LSB: u8 = 1;
335pub const ELFDATA2MSB: u8 = 2;
336
337pub const EV_NONE: u8 = 0;
338pub const EV_CURRENT: u8 = 1;
339pub const EV_NUM: u8 = 2;
340
341pub const ELFOSABI_NONE: u8 = 0;
342pub const ELFOSABI_LINUX: u8 = 3;
343
344// ============================================================================
345// GNU property types
346// ============================================================================
347
348pub const GNU_PROPERTY_AARCH64_FEATURE_1_AND: u32 = 0xc0000000;
349pub const GNU_PROPERTY_AARCH64_FEATURE_1_BTI: u32 = 1 << 0;
350
351// ============================================================================
352// Note types (NT_*) and note names (NN_*)
353// ============================================================================
354
355pub const NN_GNU_PROPERTY_TYPE_0: &str = "GNU";
356pub const NT_GNU_PROPERTY_TYPE_0: u32 = 5;
357
358pub const NN_PRSTATUS: &str = "CORE";
359pub const NT_PRSTATUS: u32 = 1;
360pub const NN_PRFPREG: &str = "CORE";
361pub const NT_PRFPREG: u32 = 2;
362pub const NN_PRPSINFO: &str = "CORE";
363pub const NT_PRPSINFO: u32 = 3;
364pub const NN_TASKSTRUCT: &str = "CORE";
365pub const NT_TASKSTRUCT: u32 = 4;
366pub const NN_AUXV: &str = "CORE";
367pub const NT_AUXV: u32 = 6;
368pub const NN_SIGINFO: &str = "CORE";
369pub const NT_SIGINFO: u32 = 0x53494749;
370pub const NN_FILE: &str = "CORE";
371pub const NT_FILE: u32 = 0x46494c45;
372pub const NN_PRXFPREG: &str = "LINUX";
373pub const NT_PRXFPREG: u32 = 0x46e62b7f;
374pub const NN_PPC_VMX: &str = "LINUX";
375pub const NT_PPC_VMX: u32 = 0x100;
376pub const NN_PPC_SPE: &str = "LINUX";
377pub const NT_PPC_SPE: u32 = 0x101;
378pub const NN_PPC_VSX: &str = "LINUX";
379pub const NT_PPC_VSX: u32 = 0x102;
380pub const NN_PPC_TAR: &str = "LINUX";
381pub const NT_PPC_TAR: u32 = 0x103;
382pub const NN_PPC_PPR: &str = "LINUX";
383pub const NT_PPC_PPR: u32 = 0x104;
384pub const NN_PPC_DSCR: &str = "LINUX";
385pub const NT_PPC_DSCR: u32 = 0x105;
386pub const NN_PPC_EBB: &str = "LINUX";
387pub const NT_PPC_EBB: u32 = 0x106;
388pub const NN_PPC_PMU: &str = "LINUX";
389pub const NT_PPC_PMU: u32 = 0x107;
390pub const NN_PPC_TM_CGPR: &str = "LINUX";
391pub const NT_PPC_TM_CGPR: u32 = 0x108;
392pub const NN_PPC_TM_CFPR: &str = "LINUX";
393pub const NT_PPC_TM_CFPR: u32 = 0x109;
394pub const NN_PPC_TM_CVMX: &str = "LINUX";
395pub const NT_PPC_TM_CVMX: u32 = 0x10a;
396pub const NN_PPC_TM_CVSX: &str = "LINUX";
397pub const NT_PPC_TM_CVSX: u32 = 0x10b;
398pub const NN_PPC_TM_SPR: &str = "LINUX";
399pub const NT_PPC_TM_SPR: u32 = 0x10c;
400pub const NN_PPC_TM_CTAR: &str = "LINUX";
401pub const NT_PPC_TM_CTAR: u32 = 0x10d;
402pub const NN_PPC_TM_CPPR: &str = "LINUX";
403pub const NT_PPC_TM_CPPR: u32 = 0x10e;
404pub const NN_PPC_TM_CDSCR: &str = "LINUX";
405pub const NT_PPC_TM_CDSCR: u32 = 0x10f;
406pub const NN_PPC_PKEY: &str = "LINUX";
407pub const NT_PPC_PKEY: u32 = 0x110;
408pub const NN_PPC_DEXCR: &str = "LINUX";
409pub const NT_PPC_DEXCR: u32 = 0x111;
410pub const NN_PPC_HASHKEYR: &str = "LINUX";
411pub const NT_PPC_HASHKEYR: u32 = 0x112;
412pub const NN_386_TLS: &str = "LINUX";
413pub const NT_386_TLS: u32 = 0x200;
414pub const NN_386_IOPERM: &str = "LINUX";
415pub const NT_386_IOPERM: u32 = 0x201;
416pub const NN_X86_XSTATE: &str = "LINUX";
417pub const NT_X86_XSTATE: u32 = 0x202;
418pub const NN_X86_SHSTK: &str = "LINUX";
419pub const NT_X86_SHSTK: u32 = 0x204;
420pub const NN_X86_XSAVE_LAYOUT: &str = "LINUX";
421pub const NT_X86_XSAVE_LAYOUT: u32 = 0x205;
422pub const NN_S390_HIGH_GPRS: &str = "LINUX";
423pub const NT_S390_HIGH_GPRS: u32 = 0x300;
424pub const NN_S390_TIMER: &str = "LINUX";
425pub const NT_S390_TIMER: u32 = 0x301;
426pub const NN_S390_TODCMP: &str = "LINUX";
427pub const NT_S390_TODCMP: u32 = 0x302;
428pub const NN_S390_TODPREG: &str = "LINUX";
429pub const NT_S390_TODPREG: u32 = 0x303;
430pub const NN_S390_CTRS: &str = "LINUX";
431pub const NT_S390_CTRS: u32 = 0x304;
432pub const NN_S390_PREFIX: &str = "LINUX";
433pub const NT_S390_PREFIX: u32 = 0x305;
434pub const NN_S390_LAST_BREAK: &str = "LINUX";
435pub const NT_S390_LAST_BREAK: u32 = 0x306;
436pub const NN_S390_SYSTEM_CALL: &str = "LINUX";
437pub const NT_S390_SYSTEM_CALL: u32 = 0x307;
438pub const NN_S390_TDB: &str = "LINUX";
439pub const NT_S390_TDB: u32 = 0x308;
440pub const NN_S390_VXRS_LOW: &str = "LINUX";
441pub const NT_S390_VXRS_LOW: u32 = 0x309;
442pub const NN_S390_VXRS_HIGH: &str = "LINUX";
443pub const NT_S390_VXRS_HIGH: u32 = 0x30a;
444pub const NN_S390_GS_CB: &str = "LINUX";
445pub const NT_S390_GS_CB: u32 = 0x30b;
446pub const NN_S390_GS_BC: &str = "LINUX";
447pub const NT_S390_GS_BC: u32 = 0x30c;
448pub const NN_S390_RI_CB: &str = "LINUX";
449pub const NT_S390_RI_CB: u32 = 0x30d;
450pub const NN_S390_PV_CPU_DATA: &str = "LINUX";
451pub const NT_S390_PV_CPU_DATA: u32 = 0x30e;
452pub const NN_ARM_VFP: &str = "LINUX";
453pub const NT_ARM_VFP: u32 = 0x400;
454pub const NN_ARM_TLS: &str = "LINUX";
455pub const NT_ARM_TLS: u32 = 0x401;
456pub const NN_ARM_HW_BREAK: &str = "LINUX";
457pub const NT_ARM_HW_BREAK: u32 = 0x402;
458pub const NN_ARM_HW_WATCH: &str = "LINUX";
459pub const NT_ARM_HW_WATCH: u32 = 0x403;
460pub const NN_ARM_SYSTEM_CALL: &str = "LINUX";
461pub const NT_ARM_SYSTEM_CALL: u32 = 0x404;
462pub const NN_ARM_SVE: &str = "LINUX";
463pub const NT_ARM_SVE: u32 = 0x405;
464pub const NN_ARM_PAC_MASK: &str = "LINUX";
465pub const NT_ARM_PAC_MASK: u32 = 0x406;
466pub const NN_ARM_PACA_KEYS: &str = "LINUX";
467pub const NT_ARM_PACA_KEYS: u32 = 0x407;
468pub const NN_ARM_PACG_KEYS: &str = "LINUX";
469pub const NT_ARM_PACG_KEYS: u32 = 0x408;
470pub const NN_ARM_TAGGED_ADDR_CTRL: &str = "LINUX";
471pub const NT_ARM_TAGGED_ADDR_CTRL: u32 = 0x409;
472pub const NN_ARM_PAC_ENABLED_KEYS: &str = "LINUX";
473pub const NT_ARM_PAC_ENABLED_KEYS: u32 = 0x40a;
474pub const NN_ARM_SSVE: &str = "LINUX";
475pub const NT_ARM_SSVE: u32 = 0x40b;
476pub const NN_ARM_ZA: &str = "LINUX";
477pub const NT_ARM_ZA: u32 = 0x40c;
478pub const NN_ARM_ZT: &str = "LINUX";
479pub const NT_ARM_ZT: u32 = 0x40d;
480pub const NN_ARM_FPMR: &str = "LINUX";
481pub const NT_ARM_FPMR: u32 = 0x40e;
482pub const NN_ARM_POE: &str = "LINUX";
483pub const NT_ARM_POE: u32 = 0x40f;
484pub const NN_ARM_GCS: &str = "LINUX";
485pub const NT_ARM_GCS: u32 = 0x410;
486pub const NN_ARC_V2: &str = "LINUX";
487pub const NT_ARC_V2: u32 = 0x600;
488pub const NN_VMCOREDD: &str = "LINUX";
489pub const NT_VMCOREDD: u32 = 0x700;
490pub const NN_MIPS_DSP: &str = "LINUX";
491pub const NT_MIPS_DSP: u32 = 0x800;
492pub const NN_MIPS_FP_MODE: &str = "LINUX";
493pub const NT_MIPS_FP_MODE: u32 = 0x801;
494pub const NN_MIPS_MSA: &str = "LINUX";
495pub const NT_MIPS_MSA: u32 = 0x802;
496pub const NN_RISCV_CSR: &str = "LINUX";
497pub const NT_RISCV_CSR: u32 = 0x900;
498pub const NN_RISCV_VECTOR: &str = "LINUX";
499pub const NT_RISCV_VECTOR: u32 = 0x901;
500pub const NN_RISCV_TAGGED_ADDR_CTRL: &str = "LINUX";
501pub const NT_RISCV_TAGGED_ADDR_CTRL: u32 = 0x902;
502pub const NN_RISCV_USER_CFI: &str = "LINUX";
503pub const NT_RISCV_USER_CFI: u32 = 0x903;
504pub const NN_LOONGARCH_CPUCFG: &str = "LINUX";
505pub const NT_LOONGARCH_CPUCFG: u32 = 0xa00;
506pub const NN_LOONGARCH_CSR: &str = "LINUX";
507pub const NT_LOONGARCH_CSR: u32 = 0xa01;
508pub const NN_LOONGARCH_LSX: &str = "LINUX";
509pub const NT_LOONGARCH_LSX: u32 = 0xa02;
510pub const NN_LOONGARCH_LASX: &str = "LINUX";
511pub const NT_LOONGARCH_LASX: u32 = 0xa03;
512pub const NN_LOONGARCH_LBT: &str = "LINUX";
513pub const NT_LOONGARCH_LBT: u32 = 0xa04;
514pub const NN_LOONGARCH_HW_BREAK: &str = "LINUX";
515pub const NT_LOONGARCH_HW_BREAK: u32 = 0xa05;
516pub const NN_LOONGARCH_HW_WATCH: &str = "LINUX";
517pub const NT_LOONGARCH_HW_WATCH: u32 = 0xa06;
518
519// ============================================================================
520// Struct definitions — 32-bit ELF
521// ============================================================================
522
523#[repr(C)]
524#[derive(Debug, Default, Copy, Clone, PartialEq)]
525pub struct Elf32_Ehdr {
526    pub e_ident: [u8; EI_NIDENT],
527    pub e_type: Elf32_Half,
528    pub e_machine: Elf32_Half,
529    pub e_version: Elf32_Word,
530    pub e_entry: Elf32_Addr,
531    pub e_phoff: Elf32_Off,
532    pub e_shoff: Elf32_Off,
533    pub e_flags: Elf32_Word,
534    pub e_ehsize: Elf32_Half,
535    pub e_phentsize: Elf32_Half,
536    pub e_phnum: Elf32_Half,
537    pub e_shentsize: Elf32_Half,
538    pub e_shnum: Elf32_Half,
539    pub e_shstrndx: Elf32_Half,
540}
541
542#[repr(C)]
543#[derive(Debug, Default, Copy, Clone, PartialEq)]
544pub struct Elf32_Phdr {
545    pub p_type: Elf32_Word,
546    pub p_offset: Elf32_Off,
547    pub p_vaddr: Elf32_Addr,
548    pub p_paddr: Elf32_Addr,
549    pub p_filesz: Elf32_Word,
550    pub p_memsz: Elf32_Word,
551    pub p_flags: Elf32_Word,
552    pub p_align: Elf32_Word,
553}
554
555#[repr(C)]
556#[derive(Debug, Default, Copy, Clone, PartialEq)]
557pub struct Elf32_Shdr {
558    pub sh_name: Elf32_Word,
559    pub sh_type: Elf32_Word,
560    pub sh_flags: Elf32_Word,
561    pub sh_addr: Elf32_Addr,
562    pub sh_offset: Elf32_Off,
563    pub sh_size: Elf32_Word,
564    pub sh_link: Elf32_Word,
565    pub sh_info: Elf32_Word,
566    pub sh_addralign: Elf32_Word,
567    pub sh_entsize: Elf32_Word,
568}
569
570#[repr(C)]
571#[derive(Debug, Default, Copy, Clone, PartialEq)]
572pub struct Elf32_Sym {
573    pub st_name: Elf32_Word,
574    pub st_value: Elf32_Addr,
575    pub st_size: Elf32_Word,
576    pub st_info: u8,
577    pub st_other: u8,
578    pub st_shndx: Elf32_Half,
579}
580
581#[repr(C)]
582#[derive(Debug, Default, Copy, Clone, PartialEq)]
583pub struct Elf32_Rel {
584    pub r_offset: Elf32_Addr,
585    pub r_info: Elf32_Word,
586}
587
588#[repr(C)]
589#[derive(Debug, Default, Copy, Clone, PartialEq)]
590pub struct Elf32_Rela {
591    pub r_offset: Elf32_Addr,
592    pub r_info: Elf32_Word,
593    pub r_addend: Elf32_Sword,
594}
595
596/// Anonymous union in C; named here because Rust requires it.
597/// Cannot derive Debug, Default, or PartialEq on unions.
598#[repr(C)]
599#[derive(Copy, Clone)]
600pub union Elf32_Dyn_d_un {
601    pub d_val: Elf32_Sword,
602    pub d_ptr: Elf32_Addr,
603}
604
605/// Contains a union field (d_un), so Debug, Default, and PartialEq
606/// cannot be derived.
607#[repr(C)]
608#[derive(Copy, Clone)]
609pub struct Elf32_Dyn {
610    pub d_tag: Elf32_Sword,
611    pub d_un: Elf32_Dyn_d_un,
612}
613
614#[repr(C)]
615#[derive(Debug, Default, Copy, Clone, PartialEq)]
616pub struct Elf32_Nhdr {
617    pub n_namesz: Elf32_Word,
618    pub n_descsz: Elf32_Word,
619    pub n_type: Elf32_Word,
620}
621
622#[repr(C)]
623#[derive(Debug, Default, Copy, Clone, PartialEq)]
624pub struct Elf32_Verdef {
625    pub vd_version: Elf32_Half,
626    pub vd_flags: Elf32_Half,
627    pub vd_ndx: Elf32_Half,
628    pub vd_cnt: Elf32_Half,
629    pub vd_hash: Elf32_Word,
630    pub vd_aux: Elf32_Word,
631    pub vd_next: Elf32_Word,
632}
633
634#[repr(C)]
635#[derive(Debug, Default, Copy, Clone, PartialEq)]
636pub struct Elf32_Verdaux {
637    pub vda_name: Elf32_Word,
638    pub vda_next: Elf32_Word,
639}
640
641// ============================================================================
642// Struct definitions — 64-bit ELF
643// ============================================================================
644
645#[repr(C)]
646#[derive(Debug, Default, Copy, Clone, PartialEq)]
647pub struct Elf64_Ehdr {
648    pub e_ident: [u8; EI_NIDENT],
649    pub e_type: Elf64_Half,
650    pub e_machine: Elf64_Half,
651    pub e_version: Elf64_Word,
652    pub e_entry: Elf64_Addr,
653    pub e_phoff: Elf64_Off,
654    pub e_shoff: Elf64_Off,
655    pub e_flags: Elf64_Word,
656    pub e_ehsize: Elf64_Half,
657    pub e_phentsize: Elf64_Half,
658    pub e_phnum: Elf64_Half,
659    pub e_shentsize: Elf64_Half,
660    pub e_shnum: Elf64_Half,
661    pub e_shstrndx: Elf64_Half,
662}
663
664#[repr(C)]
665#[derive(Debug, Default, Copy, Clone, PartialEq)]
666pub struct Elf64_Phdr {
667    pub p_type: Elf64_Word,
668    pub p_flags: Elf64_Word,
669    pub p_offset: Elf64_Off,
670    pub p_vaddr: Elf64_Addr,
671    pub p_paddr: Elf64_Addr,
672    pub p_filesz: Elf64_Xword,
673    pub p_memsz: Elf64_Xword,
674    pub p_align: Elf64_Xword,
675}
676
677#[repr(C)]
678#[derive(Debug, Default, Copy, Clone, PartialEq)]
679pub struct Elf64_Shdr {
680    pub sh_name: Elf64_Word,
681    pub sh_type: Elf64_Word,
682    pub sh_flags: Elf64_Xword,
683    pub sh_addr: Elf64_Addr,
684    pub sh_offset: Elf64_Off,
685    pub sh_size: Elf64_Xword,
686    pub sh_link: Elf64_Word,
687    pub sh_info: Elf64_Word,
688    pub sh_addralign: Elf64_Xword,
689    pub sh_entsize: Elf64_Xword,
690}
691
692#[repr(C)]
693#[derive(Debug, Default, Copy, Clone, PartialEq)]
694pub struct Elf64_Sym {
695    pub st_name: Elf64_Word,
696    pub st_info: u8,
697    pub st_other: u8,
698    pub st_shndx: Elf64_Half,
699    pub st_value: Elf64_Addr,
700    pub st_size: Elf64_Xword,
701}
702
703#[repr(C)]
704#[derive(Debug, Default, Copy, Clone, PartialEq)]
705pub struct Elf64_Rel {
706    pub r_offset: Elf64_Addr,
707    pub r_info: Elf64_Xword,
708}
709
710#[repr(C)]
711#[derive(Debug, Default, Copy, Clone, PartialEq)]
712pub struct Elf64_Rela {
713    pub r_offset: Elf64_Addr,
714    pub r_info: Elf64_Xword,
715    pub r_addend: Elf64_Sxword,
716}
717
718/// Anonymous union in C; named here because Rust requires it.
719/// Cannot derive Debug, Default, or PartialEq on unions.
720#[repr(C)]
721#[derive(Copy, Clone)]
722pub union Elf64_Dyn_d_un {
723    pub d_val: Elf64_Xword,
724    pub d_ptr: Elf64_Addr,
725}
726
727/// Contains a union field (d_un), so Debug, Default, and PartialEq
728/// cannot be derived.
729#[repr(C)]
730#[derive(Copy, Clone)]
731pub struct Elf64_Dyn {
732    pub d_tag: Elf64_Sxword,
733    pub d_un: Elf64_Dyn_d_un,
734}
735
736#[repr(C)]
737#[derive(Debug, Default, Copy, Clone, PartialEq)]
738pub struct Elf64_Nhdr {
739    pub n_namesz: Elf64_Word,
740    pub n_descsz: Elf64_Word,
741    pub n_type: Elf64_Word,
742}
743
744#[repr(C)]
745#[derive(Debug, Default, Copy, Clone, PartialEq)]
746pub struct Elf64_Verdef {
747    pub vd_version: Elf64_Half,
748    pub vd_flags: Elf64_Half,
749    pub vd_ndx: Elf64_Half,
750    pub vd_cnt: Elf64_Half,
751    pub vd_hash: Elf64_Word,
752    pub vd_aux: Elf64_Word,
753    pub vd_next: Elf64_Word,
754}
755
756#[repr(C)]
757#[derive(Debug, Default, Copy, Clone, PartialEq)]
758pub struct Elf64_Verdaux {
759    pub vda_name: Elf64_Word,
760    pub vda_next: Elf64_Word,
761}
762
763// ============================================================================
764// Compile-time layout assertions
765// ============================================================================
766
767const _: () = assert!(core::mem::size_of::<Elf32_Ehdr>() == 52);
768const _: () = assert!(core::mem::size_of::<Elf64_Ehdr>() == 64);
769const _: () = assert!(core::mem::size_of::<Elf32_Phdr>() == 32);
770const _: () = assert!(core::mem::size_of::<Elf64_Phdr>() == 56);
771const _: () = assert!(core::mem::size_of::<Elf32_Shdr>() == 40);
772const _: () = assert!(core::mem::size_of::<Elf64_Shdr>() == 64);
773const _: () = assert!(core::mem::size_of::<Elf32_Sym>() == 16);
774const _: () = assert!(core::mem::size_of::<Elf64_Sym>() == 24);
775const _: () = assert!(core::mem::size_of::<Elf32_Rel>() == 8);
776const _: () = assert!(core::mem::size_of::<Elf64_Rel>() == 16);
777const _: () = assert!(core::mem::size_of::<Elf32_Rela>() == 12);
778const _: () = assert!(core::mem::size_of::<Elf64_Rela>() == 24);
779const _: () = assert!(core::mem::size_of::<Elf32_Dyn>() == 8);
780const _: () = assert!(core::mem::size_of::<Elf64_Dyn>() == 16);
781const _: () = assert!(core::mem::size_of::<Elf32_Nhdr>() == 12);
782const _: () = assert!(core::mem::size_of::<Elf64_Nhdr>() == 12);
783const _: () = assert!(core::mem::size_of::<Elf32_Verdef>() == 20);
784const _: () = assert!(core::mem::size_of::<Elf64_Verdef>() == 20);
785const _: () = assert!(core::mem::size_of::<Elf32_Verdaux>() == 8);
786const _: () = assert!(core::mem::size_of::<Elf64_Verdaux>() == 8);