@@ -407,7 +407,7 @@ impl<C: ContextObject> Executable<C> {
407407 loader : Arc < BuiltinProgram < C > > ,
408408 ) -> Result < Self , ElfParserError > {
409409 use crate :: elf_parser:: {
410- consts:: { ELFMAG , EV_CURRENT , PF_R , PF_W , PF_X , PT_LOAD , SHN_UNDEF , STT_FUNC } ,
410+ consts:: { ELFMAG , EV_CURRENT , PF_R , PF_X , PT_LOAD , SHN_UNDEF , STT_FUNC } ,
411411 types:: { Elf64Ehdr , Elf64Shdr , Elf64Sym } ,
412412 } ;
413413
@@ -426,8 +426,8 @@ impl<C: ContextObject> Executable<C> {
426426 || file_header. e_ident . ei_osabi != ELFOSABI_NONE
427427 || file_header. e_ident . ei_abiversion != 0x00
428428 || file_header. e_ident . ei_pad != [ 0x00 ; 7 ]
429- || file_header. e_type != ET_DYN
430- || file_header. e_machine != EM_SBPF
429+ // file_header.e_type
430+ || file_header. e_machine != EM_BPF
431431 || file_header. e_version != EV_CURRENT
432432 // file_header.e_entry
433433 || file_header. e_phoff != mem:: size_of :: < Elf64Ehdr > ( ) as u64
@@ -444,31 +444,25 @@ impl<C: ContextObject> Executable<C> {
444444 return Err ( ElfParserError :: InvalidFileHeader ) ;
445445 }
446446
447- const EXPECTED_PROGRAM_HEADERS : [ ( u32 , u64 ) ; 4 ] = [
448- ( PF_X , ebpf:: MM_BYTECODE_START ) , // byte code
449- ( PF_R , ebpf:: MM_RODATA_START ) , // read only data
450- ( PF_R | PF_W , ebpf:: MM_STACK_START ) , // stack
451- ( PF_R | PF_W , ebpf:: MM_HEAP_START ) , // heap
447+ const EXPECTED_PROGRAM_HEADERS : [ ( u32 , u64 ) ; 2 ] = [
448+ ( PF_R , 0 ) , // read only data
449+ ( PF_X , 1 ) , // byte code
452450 ] ;
453451 let program_header_table =
454452 Elf64 :: slice_from_bytes :: < Elf64Phdr > ( elf_bytes, program_header_table_range. clone ( ) ) ?;
455- for ( program_header, ( p_flags, p_vaddr ) ) in program_header_table
453+ for ( program_header, ( p_flags, p_index ) ) in program_header_table
456454 . iter ( )
457455 . zip ( EXPECTED_PROGRAM_HEADERS . iter ( ) )
458456 {
459- let p_filesz = if ( * p_flags & PF_W ) != 0 {
460- 0
461- } else {
462- program_header. p_memsz
463- } ;
457+ let p_vaddr = p_index * ebpf:: MM_REGION_SIZE ;
464458 if program_header. p_type != PT_LOAD
465459 || program_header. p_flags != * p_flags
466460 || program_header. p_offset < program_header_table_range. end as u64
467461 || program_header. p_offset >= elf_bytes. len ( ) as u64
468462 || program_header. p_offset . checked_rem ( ebpf:: INSN_SIZE as u64 ) != Some ( 0 )
469- || program_header. p_vaddr != * p_vaddr
470- || program_header. p_paddr != * p_vaddr
471- || program_header. p_filesz != p_filesz
463+ || program_header. p_vaddr != p_vaddr
464+ || program_header. p_paddr != p_vaddr
465+ || program_header. p_filesz != program_header . p_memsz
472466 || program_header. p_filesz
473467 > ( elf_bytes. len ( ) as u64 ) . saturating_sub ( program_header. p_offset )
474468 || program_header. p_filesz . checked_rem ( ebpf:: INSN_SIZE as u64 ) != Some ( 0 )
@@ -478,8 +472,8 @@ impl<C: ContextObject> Executable<C> {
478472 }
479473 }
480474
481- let bytecode_header = & program_header_table[ 0 ] ;
482- let rodata_header = & program_header_table[ 1 ] ;
475+ let rodata_header = & program_header_table[ 0 ] ;
476+ let bytecode_header = & program_header_table[ 1 ] ;
483477 let text_section_vaddr = bytecode_header. p_vaddr ;
484478 let text_section_range = bytecode_header. file_range ( ) . unwrap_or_default ( ) ;
485479 let ro_section = Section :: Borrowed (
@@ -501,10 +495,6 @@ impl<C: ContextObject> Executable<C> {
501495 . saturating_sub ( bytecode_header. p_vaddr )
502496 . checked_div ( ebpf:: INSN_SIZE as u64 )
503497 . unwrap_or_default ( ) as usize ;
504- let entry_insn = ebpf:: get_insn ( & elf_bytes[ text_section_range. clone ( ) ] , entry_pc) ;
505- if !entry_insn. is_function_start_marker ( ) {
506- return Err ( ElfParserError :: InvalidFileHeader ) ;
507- }
508498
509499 let mut function_registry = FunctionRegistry :: < usize > :: default ( ) ;
510500 let config = loader. get_config ( ) ;
0 commit comments