nx_contentdiff_sectionless_candidate_t314.nx source
↩ module page · 25 lines · 1049 B
1import "_hdl_build/nx_contentdiff_lib.nx"
2// ELF64 program-header sizes/offsets follow the ELF ABI, not capacity policy.
3// No section table means no structured DWARF source identities, not an invalid ELF.
4func cds_sectionless(c:*NxCdStructured)->i64{
5 let b:*u8=c.buf;let n:i64=c.bytes
6 if nx_elf_get_u64_le(b,40)!=0{return CDS_UNKNOWN}
7 if nx_elf_get_u16_le(b,60)!=0||nx_elf_get_u16_le(b,62)!=0{return CDS_INVALID}
8 let po:i64=nx_elf_get_u64_le(b,32);let ps:i64=nx_elf_get_u16_le(b,54);let pc:i64=nx_elf_get_u16_le(b,56)
9 if pc==65535{return CDS_UNKNOWN}
10 if pc==0{return CDS_UNKNOWN}
11 if ps!=56{return CDS_UNKNOWN}
12 if po<64{return CDS_INVALID}
13 if cds_span(n,po,pc*ps)==0{return CDS_INVALID}
14 var i:i64=0
15 while i<pc{
16 let p:i64=po+i*ps;let kind:i64=nx_elf_get_u32_le(b,p)
17 if kind!=0{
18 let off:i64=nx_elf_get_u64_le(b,p+8);let size:i64=nx_elf_get_u64_le(b,p+32)
19 if cds_span(n,off,size)==0{return CDS_INVALID}
20 if kind==1{let memory:i64=nx_elf_get_u64_le(b,p+40);if memory<0||size>memory{return CDS_INVALID}}
21 }
22 i=i+1
23 }
24 return 0
25}