为什么gcc在调用"main"后会在程序中放置"暂停"指令?

bet*_*eta 9 linux assembly gcc glibc

当由一个Linux/i386的系统上GCC生成的ELF可执行文件看,似乎它调用"主"和"NOP"的填充,如在此之前之后alwas放置一个暂停指令(0xF4中):

? ....... ! entrypoint:
? ....... !   xor         ebp, ebp
? 80482e2 !   pop         esi
? 80482e3 !   mov         ecx, esp*emphasized text*
? 80482e5 !   and         esp, 0fffffff0h
? 80482e8 !   push        eax
? 80482e9 !   push        esp
? 80482ea !   push        edx
? 80482eb !   push        __libc_csu_fini
? 80482f0 !   push        __libc_csu_init
? 80482f5 !   push        ecx
? 80482f6 !   push        esi
? 80482f7 !   push        main
? 80482fc !   call        wrapper_804a004_80482c4
? 8048301 !   hlt                                      <--- halt instruction
? 8048302 !   nop
? 8048303 !   nop
? 8048304 !   nop
               ?
Run Code Online (Sandbox Code Playgroud)

这样做的目的是什么?永远不应该达到此代码.这是某种保障措施吗?

ugh*_*fhw 11

主要返回后,将调用exit.如果系统的exit版本没有立即停止执行进程,那么hlt就在那里.在用户模式下,它将导致保护错误,这将导致进程终止.如果进程由于某种原因在环0中运行,它将停止处理器直到下一个中​​断,这将有希望触发操作系统删除进程.在设计为在环0中运行的进程中,在hlt之后经常存在jmp指令,这将导致hlt反复执行直到进程终止.