You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 23:47:18