pub const section_64 = extern struct sectname: [16]u8name of this section
segname: [16]u8segment this section goes in
addr: u64 = 0memory address of this section
size: u64 = 0size in bytes of this section
offset: u32 = 0file offset of this section
@"align": u32 = 0section alignment (power of 2)
reloff: u32 = 0file offset of relocation entries
nreloc: u32 = 0number of relocation entries
flags: u32 = S_REGULARflags (section type and attributes
reserved1: u32 = 0reserved (for offset or index)
reserved2: u32 = 0reserved (for count or sizeof)
reserved3: u32 = 0reserved
pub fn sectName(sect: *const section_64) []const u8pub fn segName(sect: *const section_64) []const u8pub fn @"type"(sect: section_64) u8pub fn attrs(sect: section_64) u32pub fn isCode(sect: section_64) boolpub fn isZerofill(sect: section_64) boolpub fn isSymbolStubs(sect: section_64) boolpub fn isDebug(sect: section_64) boolpub fn isDontDeadStrip(sect: section_64) boolpub fn isDontDeadStripIfReferencesLive(sect: section_64) bool777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856pub const section_64 = extern struct {
/// name of this section
sectname: [16]u8,
/// segment this section goes in
segname: [16]u8,
/// memory address of this section
addr: u64 = 0,
/// size in bytes of this section
size: u64 = 0,
/// file offset of this section
offset: u32 = 0,
/// section alignment (power of 2)
@"align": u32 = 0,
/// file offset of relocation entries
reloff: u32 = 0,
/// number of relocation entries
nreloc: u32 = 0,
/// flags (section type and attributes
flags: u32 = S_REGULAR,
/// reserved (for offset or index)
reserved1: u32 = 0,
/// reserved (for count or sizeof)
reserved2: u32 = 0,
/// reserved
reserved3: u32 = 0,
pub fn sectName(sect: *const section_64) []const u8 {
return parseName(§.sectname);
}
pub fn segName(sect: *const section_64) []const u8 {
return parseName(§.segname);
}
pub fn @"type"(sect: section_64) u8 {
return @as(u8, @truncate(sect.flags & 0xff));
}
pub fn attrs(sect: section_64) u32 {
return sect.flags & 0xffffff00;
}
pub fn isCode(sect: section_64) bool {
const attr = sect.attrs();
return attr & S_ATTR_PURE_INSTRUCTIONS != 0 or attr & S_ATTR_SOME_INSTRUCTIONS != 0;
}
pub fn isZerofill(sect: section_64) bool {
const tt = sect.type();
return tt == S_ZEROFILL or tt == S_GB_ZEROFILL or tt == S_THREAD_LOCAL_ZEROFILL;
}
pub fn isSymbolStubs(sect: section_64) bool {
const tt = sect.type();
return tt == S_SYMBOL_STUBS;
}
pub fn isDebug(sect: section_64) bool {
return sect.attrs() & S_ATTR_DEBUG != 0;
}
pub fn isDontDeadStrip(sect: section_64) bool {
return sect.attrs() & S_ATTR_NO_DEAD_STRIP != 0;
}
pub fn isDontDeadStripIfReferencesLive(sect: section_64) bool {
return sect.attrs() & S_ATTR_LIVE_SUPPORT != 0;
}
}