汇编Hello World程序运行报错:Bad system call (core dumped)求助
32位汇编程序运行报错"Bad system call (core dumped)"的问题排查
问题描述
这是一个名为Lab.asm的基础Hello World汇编程序:
汇编代码
section .text global _start _start: mov eax, 4 mov ebx, 1 mov ecx, message mov edx, message_len int 0x80 section .data message db "Hello, World!", 0x0a message_len equ $-message
编译命令
rm Lab.o rm lab nasm -f elf -F dwarf -g Lab.asm ld -m elf_i386 -o lab Lab.o
编译并运行该程序时,出现错误:Bad system call (core dumped),且无法找到核心转储文件进行gdb调试。
问题原因与解决办法
核心原因
你编写的是32位x86汇编程序,但当前运行环境大概率是64位Linux系统。64位Linux默认可能未完全启用32位程序的系统调用支持,或者缺少32位兼容库,导致执行int 0x80时触发非法系统调用。另外,原程序缺少退出系统调用,进程输出后未正常终止,也可能引发后续异常。
修复步骤
补充退出系统调用
在输出操作的int 0x80后添加退出代码,确保进程正常终止:; 执行完输出后添加退出调用 mov eax, 1 ; 32位exit系统调用号 mov ebx, 0 ; 退出码0表示正常结束 int 0x80安装32位兼容库
- Debian/Ubuntu系系统:
sudo apt-get install gcc-multilib libc6-i386 - RHEL/CentOS系系统:
sudo yum install glibc.i686
- Debian/Ubuntu系系统:
启用核心转储(可选)
若需要生成核心转储文件用于调试,先设置核心转储大小限制:ulimit -c unlimited重新运行程序后,当前目录会生成
core文件,即可用gdb调试:gdb ./lab core
替代方案:改用64位汇编
如果系统是64位,更推荐直接编写64位汇编,使用syscall指令而非int 0x80,示例代码如下:
section .text global _start _start: ; write系统调用(64位) mov rax, 1 ; 64位write调用号为1 mov rdi, 1 ; 文件描述符1=标准输出 mov rsi, message ; 字符串地址 mov rdx, message_len ; 字符串长度 syscall ; exit系统调用(64位) mov rax, 60 ; 64位exit调用号为60 mov rdi, 0 ; 退出码0 syscall section .data message db "Hello, World!", 0x0a message_len equ $-message
编译命令改为:
rm Lab.o rm lab nasm -f elf64 -F dwarf -g Lab.asm ld -o lab Lab.o
内容的提问来源于stack exchange,提问作者Cheesebellies
相关产品推荐
相关产品推荐

