在64位Ubuntu系统运行32位汇编源码出现段错误求助
32位Linux汇编程序段错误问题
我在一门课程中拿到这段32位汇编代码:
#32bit version #PURPOSE: Simple program that exits and returns a # status code (42) back to the Linux kernel # #INPUT: none # #OUTPUT: returns a status code. This can be viewed # by typing # # echo $? # # %eax holds the system call number # %ebx holds the return status .section .text .globl _start _start: movl $1, %eax #1 -> exit movl $42, %ebx #return 42 int $0x80 #run kernel
我用以下命令汇编、链接并运行:
as exit.s -o exit.o ld exit.o -o exit ./exit
结果出现段错误。我不确定是环境配置还是代码问题,代码完全按照教材内容写的,我对汇编和Linux都很陌生。
我已经尝试了这些操作:
- 通过sudo安装了gcc-multilib、g++-multilib、libc:i386、libncurses5:i386、libstdc++6:i386等包
- 添加了i386架构
- 尝试用
-m32参数汇编,但出现错误
我找到该程序的64位版本可以正常运行,但课程会教授32位内容,希望能解决这个问题。我在网上找了很久,大多是gcc编译C文件的解决方案,不适用我的情况。
问题原因与解决方法
问题出在汇编和链接时没有明确指定32位目标架构:默认情况下as和ld会生成当前系统架构(64位)的程序,而32位的系统调用逻辑在64位环境下直接执行会触发错误。
正确的汇编与链接命令
需要给as和ld分别指定32位参数:
as -32 exit.s -o exit.o ld -m elf_i386 exit.o -o exit
as -32:明确生成32位目标文件ld -m elf_i386:指定链接32位ELF格式的可执行文件
验证运行
执行上述命令后,运行程序并查看返回值:
./exit echo $?
此时应该输出42,且无段错误。
关于-m32参数的说明
你之前用-m32报错,是因为as不支持该参数,它对应的32位参数是-32;而ld需要用-m elf_i386来指定32位目标架构,不同工具的参数规则有区别。
内容的提问来源于stack exchange,提问作者Shadows_Puppet
相关产品推荐
相关产品推荐

