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

使用GDB调试x86汇编时遇符号文件无代码段错误求助

问题原因与解决方案

核心问题

你的汇编代码没有将执行代码放入标准的.text代码段,而是把_start入口点的指令直接写在了.data数据段之后。GNU汇编器(GAS)不会自动为代码创建.text段,这导致链接生成的可执行文件没有可识别的代码段,GDB因此报错Can't find any code sections in symbol file。

修正后的汇编代码

将_start的执行代码移到显式声明的.text段中,调整后的dodawanie.s如下:

.code32
SYSCALL = 0x80
SYSEXIT = 1
EXIT_SUCCESS = 0
SYSWRITE = 4
STDOUT = 1

.global _start

.text  # 显式标记可执行代码段
_start:
mov $SYSEXIT, %eax
mov $EXIT_SUCCESS, %ebx
int $SYSCALL

.data  # 数据段放在代码段之后
liczba1:
    .long 0x10304008, 0x701100FF, 0x45100020, 0x08570030
liczba2:
    .long 0xF040500C, 0x00220026, 0x321000CB, 0x04520031

number1:
    .long 0xFF, 0xFF, 0x01, 0xFF
number2:
    .long 0xEE, 0xEE, 0xE1, 0xEE

修正后的Makefile

你之前添加的-g参数是多余的,as的--gstabs选项已经足够生成调试信息。恢复讲师提供的Makefile即可:

all: dodawanie

dodawanie: dodawanie.o
    ld dodawanie.o -o dodawanie

dodawanie.o: dodawanie.s
    as --gstabs dodawanie.s -o dodawanie.o

验证步骤

  1. 执行make重新编译生成可执行文件
  2. 启动GDB:gdb dodawanie
  3. 此时GDB可以正常识别代码段,你可以通过break _start设置断点,run启动程序,再用info stack或x/10x $esp观察栈内容

额外提示

当前代码仅执行退出系统调用,几乎没有栈操作。如果需要观察栈内容的变化,建议添加压栈/弹栈指令,例如:

_start:
push %eax       # 将eax寄存器值压入栈
push %ebx       # 将ebx寄存器值压入栈
pop %ebx        # 从栈弹出值到ebx
pop %eax        # 从栈弹出值到eax
mov $SYSEXIT, %eax
mov $EXIT_SUCCESS, %ebx
int $SYSCALL

内容的提问来源于stack exchange,提问作者Quarol

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:17:05