Skip to content

Commit a4d6b92

Browse files
committed
Elf2: elide unused nodes when emitting objects
1 parent d81b571 commit a4d6b92

File tree

2 files changed

+344
-196
lines changed

2 files changed

+344
-196
lines changed

lib/std/elf.zig

Lines changed: 227 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -286,105 +286,111 @@ pub const VER_FLG_BASE = 1;
286286
/// Weak version identifier
287287
pub const VER_FLG_WEAK = 2;
288288

289-
/// Program header table entry unused
290-
pub const PT_NULL = 0;
291-
/// Loadable program segment
292-
pub const PT_LOAD = 1;
293-
/// Dynamic linking information
294-
pub const PT_DYNAMIC = 2;
295-
/// Program interpreter
296-
pub const PT_INTERP = 3;
297-
/// Auxiliary information
298-
pub const PT_NOTE = 4;
299-
/// Reserved
300-
pub const PT_SHLIB = 5;
301-
/// Entry for header table itself
302-
pub const PT_PHDR = 6;
303-
/// Thread-local storage segment
304-
pub const PT_TLS = 7;
305-
/// Number of defined types
306-
pub const PT_NUM = 8;
307-
/// Start of OS-specific
308-
pub const PT_LOOS = 0x60000000;
309-
/// GCC .eh_frame_hdr segment
310-
pub const PT_GNU_EH_FRAME = 0x6474e550;
311-
/// Indicates stack executability
312-
pub const PT_GNU_STACK = 0x6474e551;
313-
/// Read-only after relocation
314-
pub const PT_GNU_RELRO = 0x6474e552;
315-
pub const PT_LOSUNW = 0x6ffffffa;
316-
/// Sun specific segment
317-
pub const PT_SUNWBSS = 0x6ffffffa;
318-
/// Stack segment
319-
pub const PT_SUNWSTACK = 0x6ffffffb;
320-
pub const PT_HISUNW = 0x6fffffff;
321-
/// End of OS-specific
322-
pub const PT_HIOS = 0x6fffffff;
323-
/// Start of processor-specific
324-
pub const PT_LOPROC = 0x70000000;
325-
/// End of processor-specific
326-
pub const PT_HIPROC = 0x7fffffff;
289+
/// Deprecated, use `@intFromEnum(std.elf.PT.NULL)`
290+
pub const PT_NULL = @intFromEnum(std.elf.PT.NULL);
291+
/// Deprecated, use `@intFromEnum(std.elf.PT.LOAD)`
292+
pub const PT_LOAD = @intFromEnum(std.elf.PT.LOAD);
293+
/// Deprecated, use `@intFromEnum(std.elf.PT.DYNAMIC)`
294+
pub const PT_DYNAMIC = @intFromEnum(std.elf.PT.DYNAMIC);
295+
/// Deprecated, use `@intFromEnum(std.elf.PT.INTERP)`
296+
pub const PT_INTERP = @intFromEnum(std.elf.PT.INTERP);
297+
/// Deprecated, use `@intFromEnum(std.elf.PT.NOTE)`
298+
pub const PT_NOTE = @intFromEnum(std.elf.PT.NOTE);
299+
/// Deprecated, use `@intFromEnum(std.elf.PT.SHLIB)`
300+
pub const PT_SHLIB = @intFromEnum(std.elf.PT.SHLIB);
301+
/// Deprecated, use `@intFromEnum(std.elf.PT.PHDR)`
302+
pub const PT_PHDR = @intFromEnum(std.elf.PT.PHDR);
303+
/// Deprecated, use `@intFromEnum(std.elf.PT.TLS)`
304+
pub const PT_TLS = @intFromEnum(std.elf.PT.TLS);
305+
/// Deprecated, use `std.elf.PT.NUM`.
306+
pub const PT_NUM = PT.NUM;
307+
/// Deprecated, use `@intFromEnum(std.elf.PT.LOOS)`
308+
pub const PT_LOOS = @intFromEnum(std.elf.PT.LOOS);
309+
/// Deprecated, use `@intFromEnum(std.elf.PT.GNU_EH_FRAME)`
310+
pub const PT_GNU_EH_FRAME = @intFromEnum(std.elf.PT.GNU_EH_FRAME);
311+
/// Deprecated, use `@intFromEnum(std.elf.PT.GNU_STACK)`
312+
pub const PT_GNU_STACK = @intFromEnum(std.elf.PT.GNU_STACK);
313+
/// Deprecated, use `@intFromEnum(std.elf.PT.GNU_RELRO)`
314+
pub const PT_GNU_RELRO = @intFromEnum(std.elf.PT.GNU_RELRO);
315+
/// Deprecated, use `@intFromEnum(std.elf.PT.LOSUNW)`
316+
pub const PT_LOSUNW = @intFromEnum(std.elf.PT.LOSUNW);
317+
/// Deprecated, use `@intFromEnum(std.elf.PT.SUNWBSS)`
318+
pub const PT_SUNWBSS = @intFromEnum(std.elf.PT.SUNWBSS);
319+
/// Deprecated, use `@intFromEnum(std.elf.PT.SUNWSTACK)`
320+
pub const PT_SUNWSTACK = @intFromEnum(std.elf.PT.SUNWSTACK);
321+
/// Deprecated, use `@intFromEnum(std.elf.PT.HISUNW)`
322+
pub const PT_HISUNW = @intFromEnum(std.elf.PT.HISUNW);
323+
/// Deprecated, use `@intFromEnum(std.elf.PT.HIOS)`
324+
pub const PT_HIOS = @intFromEnum(std.elf.PT.HIOS);
325+
/// Deprecated, use `@intFromEnum(std.elf.PT.LOPROC)`
326+
pub const PT_LOPROC = @intFromEnum(std.elf.PT.LOPROC);
327+
/// Deprecated, use `@intFromEnum(std.elf.PT.HIPROC)`
328+
pub const PT_HIPROC = @intFromEnum(std.elf.PT.HIPROC);
327329

328330
pub const PN_XNUM = 0xffff;
329331

330-
/// Section header table entry unused
331-
pub const SHT_NULL = 0;
332-
/// Program data
333-
pub const SHT_PROGBITS = 1;
334-
/// Symbol table
335-
pub const SHT_SYMTAB = 2;
336-
/// String table
337-
pub const SHT_STRTAB = 3;
338-
/// Relocation entries with addends
339-
pub const SHT_RELA = 4;
340-
/// Symbol hash table
341-
pub const SHT_HASH = 5;
342-
/// Dynamic linking information
343-
pub const SHT_DYNAMIC = 6;
344-
/// Notes
345-
pub const SHT_NOTE = 7;
346-
/// Program space with no data (bss)
347-
pub const SHT_NOBITS = 8;
348-
/// Relocation entries, no addends
349-
pub const SHT_REL = 9;
350-
/// Reserved
351-
pub const SHT_SHLIB = 10;
352-
/// Dynamic linker symbol table
353-
pub const SHT_DYNSYM = 11;
354-
/// Array of constructors
355-
pub const SHT_INIT_ARRAY = 14;
356-
/// Array of destructors
357-
pub const SHT_FINI_ARRAY = 15;
358-
/// Array of pre-constructors
359-
pub const SHT_PREINIT_ARRAY = 16;
360-
/// Section group
361-
pub const SHT_GROUP = 17;
362-
/// Extended section indices
363-
pub const SHT_SYMTAB_SHNDX = 18;
364-
/// Start of OS-specific
365-
pub const SHT_LOOS = 0x60000000;
366-
/// LLVM address-significance table
367-
pub const SHT_LLVM_ADDRSIG = 0x6fff4c03;
368-
/// GNU hash table
369-
pub const SHT_GNU_HASH = 0x6ffffff6;
370-
/// GNU version definition table
371-
pub const SHT_GNU_VERDEF = 0x6ffffffd;
372-
/// GNU needed versions table
373-
pub const SHT_GNU_VERNEED = 0x6ffffffe;
374-
/// GNU symbol version table
375-
pub const SHT_GNU_VERSYM = 0x6fffffff;
376-
/// End of OS-specific
377-
pub const SHT_HIOS = 0x6fffffff;
378-
/// Start of processor-specific
379-
pub const SHT_LOPROC = 0x70000000;
380-
/// Unwind information
381-
pub const SHT_X86_64_UNWIND = 0x70000001;
382-
/// End of processor-specific
383-
pub const SHT_HIPROC = 0x7fffffff;
384-
/// Start of application-specific
385-
pub const SHT_LOUSER = 0x80000000;
386-
/// End of application-specific
387-
pub const SHT_HIUSER = 0xffffffff;
332+
/// Deprecated, use `@intFromEnum(std.elf.SHT.NULL)`
333+
pub const SHT_NULL = @intFromEnum(std.elf.SHT.NULL);
334+
/// Deprecated, use `@intFromEnum(std.elf.SHT.PROGBITS)`
335+
pub const SHT_PROGBITS = @intFromEnum(std.elf.SHT.PROGBITS);
336+
/// Deprecated, use `@intFromEnum(std.elf.SHT.SYMTAB)`
337+
pub const SHT_SYMTAB = @intFromEnum(std.elf.SHT.SYMTAB);
338+
/// Deprecated, use `@intFromEnum(std.elf.SHT.STRTAB)`
339+
pub const SHT_STRTAB = @intFromEnum(std.elf.SHT.STRTAB);
340+
/// Deprecated, use `@intFromEnum(std.elf.SHT.RELA)`
341+
pub const SHT_RELA = @intFromEnum(std.elf.SHT.RELA);
342+
/// Deprecated, use `@intFromEnum(std.elf.SHT.HASH)`
343+
pub const SHT_HASH = @intFromEnum(std.elf.SHT.HASH);
344+
/// Deprecated, use `@intFromEnum(std.elf.SHT.DYNAMIC)`
345+
pub const SHT_DYNAMIC = @intFromEnum(std.elf.SHT.DYNAMIC);
346+
/// Deprecated, use `@intFromEnum(std.elf.SHT.NOTE)`
347+
pub const SHT_NOTE = @intFromEnum(std.elf.SHT.NOTE);
348+
/// Deprecated, use `@intFromEnum(std.elf.SHT.NOBITS)`
349+
pub const SHT_NOBITS = @intFromEnum(std.elf.SHT.NOBITS);
350+
/// Deprecated, use `@intFromEnum(std.elf.SHT.REL)`
351+
pub const SHT_REL = @intFromEnum(std.elf.SHT.REL);
352+
/// Deprecated, use `@intFromEnum(std.elf.SHT.SHLIB)`
353+
pub const SHT_SHLIB = @intFromEnum(std.elf.SHT.SHLIB);
354+
/// Deprecated, use `@intFromEnum(std.elf.SHT.DYNSYM)`
355+
pub const SHT_DYNSYM = @intFromEnum(std.elf.SHT.DYNSYM);
356+
/// Deprecated, use `@intFromEnum(std.elf.SHT.INIT_ARRAY)`
357+
pub const SHT_INIT_ARRAY = @intFromEnum(std.elf.SHT.INIT_ARRAY);
358+
/// Deprecated, use `@intFromEnum(std.elf.SHT.FINI_ARRAY)`
359+
pub const SHT_FINI_ARRAY = @intFromEnum(std.elf.SHT.FINI_ARRAY);
360+
/// Deprecated, use `@intFromEnum(std.elf.SHT.PREINIT_ARRAY)`
361+
pub const SHT_PREINIT_ARRAY = @intFromEnum(std.elf.SHT.PREINIT_ARRAY);
362+
/// Deprecated, use `@intFromEnum(std.elf.SHT.GROUP)`
363+
pub const SHT_GROUP = @intFromEnum(std.elf.SHT.GROUP);
364+
/// Deprecated, use `@intFromEnum(std.elf.SHT.SYMTAB_SHNDX)`
365+
pub const SHT_SYMTAB_SHNDX = @intFromEnum(std.elf.SHT.SYMTAB_SHNDX);
366+
/// Deprecated, use `@intFromEnum(std.elf.SHT.RELR)`
367+
pub const SHT_RELR = @intFromEnum(std.elf.SHT.RELR);
368+
/// Deprecated, use `std.elf.SHT.NUM`.
369+
pub const SHT_NUM = SHT.NUM;
370+
/// Deprecated, use `@intFromEnum(std.elf.SHT.LOOS)`
371+
pub const SHT_LOOS = @intFromEnum(std.elf.SHT.LOOS);
372+
/// Deprecated, use `@intFromEnum(std.elf.SHT.LLVM_ADDRSIG)`
373+
pub const SHT_LLVM_ADDRSIG = @intFromEnum(std.elf.SHT.LLVM_ADDRSIG);
374+
/// Deprecated, use `@intFromEnum(std.elf.SHT.GNU_HASH)`
375+
pub const SHT_GNU_HASH = @intFromEnum(std.elf.SHT.GNU_HASH);
376+
/// Deprecated, use `@intFromEnum(std.elf.SHT.GNU_VERDEF)`
377+
pub const SHT_GNU_VERDEF = @intFromEnum(std.elf.SHT.GNU_VERDEF);
378+
/// Deprecated, use `@intFromEnum(std.elf.SHT.GNU_VERNEED)`
379+
pub const SHT_GNU_VERNEED = @intFromEnum(std.elf.SHT.GNU_VERNEED);
380+
/// Deprecated, use `@intFromEnum(std.elf.SHT.GNU_VERSYM)`
381+
pub const SHT_GNU_VERSYM = @intFromEnum(std.elf.SHT.GNU_VERSYM);
382+
/// Deprecated, use `@intFromEnum(std.elf.SHT.HIOS)`
383+
pub const SHT_HIOS = @intFromEnum(std.elf.SHT.HIOS);
384+
/// Deprecated, use `@intFromEnum(std.elf.SHT.LOPROC)`
385+
pub const SHT_LOPROC = @intFromEnum(std.elf.SHT.LOPROC);
386+
/// Deprecated, use `@intFromEnum(std.elf.SHT.X86_64_UNWIND)`
387+
pub const SHT_X86_64_UNWIND = @intFromEnum(std.elf.SHT.X86_64_UNWIND);
388+
/// Deprecated, use `@intFromEnum(std.elf.SHT.HIPROC)`
389+
pub const SHT_HIPROC = @intFromEnum(std.elf.SHT.HIPROC);
390+
/// Deprecated, use `@intFromEnum(std.elf.SHT.LOUSER)`
391+
pub const SHT_LOUSER = @intFromEnum(std.elf.SHT.LOUSER);
392+
/// Deprecated, use `@intFromEnum(std.elf.SHT.HIUSER)`
393+
pub const SHT_HIUSER = @intFromEnum(std.elf.SHT.HIUSER);
388394

389395
// Note type for .note.gnu.build_id
390396
pub const NT_GNU_BUILD_ID = 3;
@@ -454,6 +460,127 @@ pub const STT_ARM_TFUNC = @intFromEnum(STT.ARM_TFUNC);
454460
/// Deprecated, use `@intFromEnum(std.elf.STT.ARM_16BIT)`
455461
pub const STT_ARM_16BIT = @intFromEnum(STT.ARM_16BIT);
456462

463+
pub const PT = enum(Word) {
464+
/// Program header table entry unused
465+
NULL = 0,
466+
/// Loadable program segment
467+
LOAD = 1,
468+
/// Dynamic linking information
469+
DYNAMIC = 2,
470+
/// Program interpreter
471+
INTERP = 3,
472+
/// Auxiliary information
473+
NOTE = 4,
474+
/// Reserved
475+
SHLIB = 5,
476+
/// Entry for header table itself
477+
PHDR = 6,
478+
/// Thread-local storage segment
479+
TLS = 7,
480+
_,
481+
482+
/// Number of defined types
483+
pub const NUM = @typeInfo(PT).@"enum".fields.len;
484+
485+
/// Start of OS-specific
486+
pub const LOOS: PT = @enumFromInt(0x60000000);
487+
/// End of OS-specific
488+
pub const HIOS: PT = @enumFromInt(0x6fffffff);
489+
490+
/// GCC .eh_frame_hdr segment
491+
pub const GNU_EH_FRAME: PT = @enumFromInt(0x6474e550);
492+
/// Indicates stack executability
493+
pub const GNU_STACK: PT = @enumFromInt(0x6474e551);
494+
/// Read-only after relocation
495+
pub const GNU_RELRO: PT = @enumFromInt(0x6474e552);
496+
497+
pub const LOSUNW: PT = @enumFromInt(0x6ffffffa);
498+
pub const HISUNW: PT = @enumFromInt(0x6fffffff);
499+
500+
/// Sun specific segment
501+
pub const SUNWBSS: PT = @enumFromInt(0x6ffffffa);
502+
/// Stack segment
503+
pub const SUNWSTACK: PT = @enumFromInt(0x6ffffffb);
504+
505+
/// Start of processor-specific
506+
pub const LOPROC: PT = @enumFromInt(0x70000000);
507+
/// End of processor-specific
508+
pub const HIPROC: PT = @enumFromInt(0x7fffffff);
509+
};
510+
511+
pub const SHT = enum(Word) {
512+
/// Section header table entry unused
513+
NULL = 0,
514+
/// Program data
515+
PROGBITS = 1,
516+
/// Symbol table
517+
SYMTAB = 2,
518+
/// String table
519+
STRTAB = 3,
520+
/// Relocation entries with addends
521+
RELA = 4,
522+
/// Symbol hash table
523+
HASH = 5,
524+
/// Dynamic linking information
525+
DYNAMIC = 6,
526+
/// Notes
527+
NOTE = 7,
528+
/// Program space with no data (bss)
529+
NOBITS = 8,
530+
/// Relocation entries, no addends
531+
REL = 9,
532+
/// Reserved
533+
SHLIB = 10,
534+
/// Dynamic linker symbol table
535+
DYNSYM = 11,
536+
/// Array of constructors
537+
INIT_ARRAY = 14,
538+
/// Array of destructors
539+
FINI_ARRAY = 15,
540+
/// Array of pre-constructors
541+
PREINIT_ARRAY = 16,
542+
/// Section group
543+
GROUP = 17,
544+
/// Extended section indices
545+
SYMTAB_SHNDX = 18,
546+
/// RELR relative relocations
547+
RELR = 19,
548+
_,
549+
550+
/// Number of defined types
551+
pub const NUM = @typeInfo(SHT).@"enum".fields.len;
552+
553+
/// Start of OS-specific
554+
pub const LOOS: SHT = @enumFromInt(0x60000000);
555+
/// End of OS-specific
556+
pub const HIOS: SHT = @enumFromInt(0x6fffffff);
557+
558+
/// LLVM address-significance table
559+
pub const LLVM_ADDRSIG: SHT = @enumFromInt(0x6fff4c03);
560+
561+
/// GNU hash table
562+
pub const GNU_HASH: SHT = @enumFromInt(0x6ffffff6);
563+
/// GNU version definition table
564+
pub const GNU_VERDEF: SHT = @enumFromInt(0x6ffffffd);
565+
/// GNU needed versions table
566+
pub const GNU_VERNEED: SHT = @enumFromInt(0x6ffffffe);
567+
/// GNU symbol version table
568+
pub const GNU_VERSYM: SHT = @enumFromInt(0x6fffffff);
569+
570+
/// Start of processor-specific
571+
pub const LOPROC: SHT = @enumFromInt(0x70000000);
572+
/// End of processor-specific
573+
pub const HIPROC: SHT = @enumFromInt(0x7fffffff);
574+
575+
/// Unwind information
576+
pub const X86_64_UNWIND: SHT = @enumFromInt(0x70000001);
577+
578+
/// Start of application-specific
579+
pub const LOUSER: SHT = @enumFromInt(0x80000000);
580+
/// End of application-specific
581+
pub const HIUSER: SHT = @enumFromInt(0xffffffff);
582+
};
583+
457584
pub const STB = enum(u4) {
458585
/// Local symbol
459586
LOCAL = 0,
@@ -899,7 +1026,7 @@ pub const Elf32 = struct {
8991026
shstrndx: Half,
9001027
};
9011028
pub const Phdr = extern struct {
902-
type: Word,
1029+
type: PT,
9031030
offset: Elf32.Off,
9041031
vaddr: Elf32.Addr,
9051032
paddr: Elf32.Addr,
@@ -910,7 +1037,7 @@ pub const Elf32 = struct {
9101037
};
9111038
pub const Shdr = extern struct {
9121039
name: Word,
913-
type: Word,
1040+
type: SHT,
9141041
flags: packed struct { shf: SHF },
9151042
addr: Elf32.Addr,
9161043
offset: Elf32.Off,
@@ -989,7 +1116,7 @@ pub const Elf64 = struct {
9891116
shstrndx: Half,
9901117
};
9911118
pub const Phdr = extern struct {
992-
type: Word,
1119+
type: PT,
9931120
flags: PF,
9941121
offset: Elf64.Off,
9951122
vaddr: Elf64.Addr,
@@ -1000,7 +1127,7 @@ pub const Elf64 = struct {
10001127
};
10011128
pub const Shdr = extern struct {
10021129
name: Word,
1003-
type: Word,
1130+
type: SHT,
10041131
flags: packed struct { shf: SHF, unused: Word = 0 },
10051132
addr: Elf64.Addr,
10061133
offset: Elf64.Off,

0 commit comments

Comments
 (0)