elf常见运行报错
段错误
signal: 11
exit code: 139
信号名: SIGSEGV
最常见的一类错误了
产生原因
- 访问不存在的内存地址
- 访问系统保护的内存地址
- 对内存地址进行不符合该内存地址权限的操作,例如读不可读的地址,写不可写的地址,执行不可执行的地址
- 内存对齐问题,经常会遇到类似这样的汇编命令
movaps xmmword ptr [r64 + 0x??], xmm0
,操作涉及到xmm寄存器,属于SIMD指令,其中movaps会检查[r64 + 0x??]地址是否16字节对齐,不对齐则异常,抛出段错误.
Bus error
signal: 7
exit code: 135
信号名: SIGBUS
产生原因
文件映射访问异常
这是 SIGBUS 在用户态最为常见最容易触发的情况,通常来说根本原因都是进程 mmap 了一个文件后,另外的进程把这个文件截断了,导致 mmap 出来的某些内存页超出文件的实际大小,访问那些超出的内存页就会触发 SIGBUS,具体来说有以下几种场景:
进程 mmap 一个文件后,其它进程 truncate 该文件到更小。
动态库更新,直接 cp 覆盖。
可执行文件更新,直接 cp 覆盖。
系统读取磁盘文件通常是按页映射到内存,出于效率考虑常常使用 copy on write 机制,所以文件映射之后,如果对应的文件 page 不存在了(truncated),也不见得会马上出问题,只有到访问时才会出错,因此有一定滞后期。
访问不对齐的内存
X86 平台上访问不对齐的内存时,默认不会有问题,但用户可以手动设置 EFLAGS 把 CPU 设置为不允许非对齐的内存访问,此时如果出现不对齐的内存访问,SIGBUS 就会抛出。
错误的系统调用
signal: 31
exit code: 159
信号名: SIGSYS
常见在开启了seccomp的程序中,当进行了被限制的系统调用时,抛出该错误
定时器信号
signal: 14
exit code: 14
信号名: SIGALRM
长时间未响应程序时抛出该信号
终止进程
signal: 6
exit code: 134
信号名: SIGABRT
产生原因
- 执行abort函数
- 执行assert函数
- double free or corruption (!prev),其实就是堆操作错误了,归根结底最后还是由abort函数触发