Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 对自定义ELF文件使用内存时出现分段错误_Linux_Assembly_X86_Nasm_Elf - Fatal编程技术网

Linux 对自定义ELF文件使用内存时出现分段错误

Linux 对自定义ELF文件使用内存时出现分段错误,linux,assembly,x86,nasm,elf,Linux,Assembly,X86,Nasm,Elf,我试图用一个自定义ELF头来编写一个小ELF程序,但每当我写入内存时,就会出现一个分段错误 为什么该代码会触发分段错误 %assign LOAD_ADDRESS 0x08048000 BITS 32 org LOAD_ADDRESS ; load address ehdr: ; Elf32_Ehdr db 0x7F, "ELF", 1, 1, 1 ; e_ident times 9 db 0 ; some pla

我试图用一个自定义ELF头来编写一个小ELF程序,但每当我写入内存时,就会出现一个分段错误

为什么该代码会触发分段错误

%assign LOAD_ADDRESS 0x08048000 BITS 32 org LOAD_ADDRESS ; load address ehdr: ; Elf32_Ehdr db 0x7F, "ELF", 1, 1, 1 ; e_ident times 9 db 0 ; some places to run code ? dw 2 ; e_type dw 3 ; e_machine dd 1 ; e_version dd _start ; e_entry dd phdr - $$ ; e_phoff dd shent - $$ ; e_shoff dd 0 ; e_flags dw ehdrsz ; e_ehsize dw phdrsz ; e_phentsize dw 1 ; e_phnum dw shentsize ; e_shentsize dw 3 ; e_shnum dw 2 ; e_shstrndx ehdrsz equ $ - ehdr phdr: ; Elf32_Phdr dd 1 ; p_type dd 0 ; p_offset dd $$ ; p_vaddr dd $$ ; p_paddr dd filesz ; p_filesz dd filesz ; p_memsz dd 5 ; p_flags dd 0x1000 ; p_align phdrsz equ $ - phdr shent: ; sections table ; data dd 0 ; unamed dd 1 ; PROGBITS dd 2|1 ; ALLOC / WRITE dd data dd data - LOAD_ADDRESS dd datasz dd 0 dd 0 dd 4 dd 0 shentsize equ $ - shent ; length of a single section entry ; bss dd 6 ; unamed dd 8 ; NOBITS dd 2|1 ; ALLOC / WRITE dd bss dd bss - LOAD_ADDRESS dd bsssz dd 0 dd 0 dd 4 dd 0 ; shstrtab dd 11 ; unamed dd 3 ; STRTAB dd 0 dd shstrtab dd shstrtab - LOAD_ADDRESS dd shstrtabsz dd 0 dd 0 dd 1 dd 0 ; ELF end section .shstrtab shstrtab: db ".data",0 db ".bss",0 db ".shstrtab",0 shstrtabsz equ $ - shstrtab _start: mov eax,0 mov [test],eax ; segmentation fault xor eax,eax inc eax int 0x80 section .data data: test: db 1 datasz equ $ - data section .bss bss: bsssz equ $ - bss filesz equ $ - $$
Okay发现程序缺少第二个程序头,数据/bss部分带有R/W标志,它描述了操作系统的第二个内存段,并带有运行时执行的适当标志

以下是在
phdrsz eq$-phdr
行之后添加的内容:

dd 1 ; p_type dd data - LOAD_ADDRESS ; p_offset dd data ; p_vaddr dd data ; p_paddr dd datasz ; p_filesz dd datasz + bsssz ; p_memsz dd 6 ; p_flags (R/W) dd 0x1000 ; p_align dd1;p_型 dd数据-加载地址;p_偏移量 dd数据;p_vaddr dd数据;p_paddr dd-datasz;p_文件 dd-datasz+bsssz;p_memsz dd6;p_标志(R/W) dd0x1000;p_对齐
注意:在理解这一点之前,我被误导了部分的重要性,我认为通过描述部分,我可以访问内存,但结果表明,程序头是操作系统正在寻找的,整个部分代码可以删除,程序仍然可以工作。

是的,运行时重要的是部分,不是节。 dd 1 ; p_type dd data - LOAD_ADDRESS ; p_offset dd data ; p_vaddr dd data ; p_paddr dd datasz ; p_filesz dd datasz + bsssz ; p_memsz dd 6 ; p_flags (R/W) dd 0x1000 ; p_align